Как я могу заставить этот класс базы данных mysqli работать? - PullRequest
3 голосов
/ 20 августа 2009

Я перейду прямо к погоне. Все, что я могу достичь на этом этапе с помощью этого класса, это соединение с базой данных. Я не могу сделать запрос. Можете ли вы показать мне, как это работает, и / или показать, как лучше его перекодировать.

<?php
class database{

public $dbHost = '';
public $dbUser = '';
public $dbPass = '';
public $dbName = '';

public $db;

public function __construct(){}

public function dbConnect(){
    $mysqli = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);

    /* check connection */
    if (mysqli_connect_errno()){
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }else{
        echo 'connection made';
    }
    /* close connection */
    $mysqli->close();
}

public function query($sql){
    $query = $sql;
    self::preparedStatement($query);
}

public function preparedStatement(){
    if ($stmt = $mysqli->prepare($query)){

        /* execute statement */
        $stmt->execute();

        /* bind result variables */
        $stmt->bind_result($name, $code);

        /* fetch values */
        while ($stmt->fetch()) {
            printf ("%s (%s)\n", $name, $code);
        }

        /* close statement */
        $stmt->close();
    }
}

public function __destruct(){}

}
?>

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Это сработало для меня. Я прокомментировал свои изменения.

<?php
class database{

public $dbHost = '';
public $dbUser = '';
public $dbPass = '';
public $dbName = '';

public $db;

public function __construct(){}

public function dbConnect(){
    ### not $mysqli
    $this->db = new mysqli($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName);

    /* check connection */
    if (mysqli_connect_errno()){
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }else{
        echo 'connection made';
    }
    /* close connection */
    ### $this->db->close(); // DO NOT close the connection here!
}

public function query($sql){
    $query = $sql;
    self::preparedStatement($query);
}

public function preparedStatement($query){ ### parameter $query added

    if ($stmt = $this->db->prepare($query)){ ### not $mysqli->prepare()

        /* execute statement */
        $stmt->execute();

        /* bind result variables */
        $stmt->bind_result($name, $code);

        /* fetch values */
        while ($stmt->fetch()) {
            printf ("%s (%s)\n", $name, $code);
        }

        /* close statement */
        $stmt->close();
    }
}

public function __destruct(){}

}


### Test code
/*
$db = new Database();
$db->dbHost = '127.0.0.1';
$db->dbUser = 'root';
$db->dbPass = 'root';
$db->dbName = 'test';
$db->dbConnect();
$db->query('SELECT * FROM test');
*/
?>
0 голосов
/ 20 августа 2009

Вы пропустили параметр:

public function preparedStatement($query)

(и этот метод на самом деле должен быть статичным)

В следующий раз попробуйте отладить ваш код, прежде чем спрашивать. Даже простые echo заявления сделали бы здесь.

РЕДАКТИРОВАТЬ: и даже это не сработает. Я думаю, что вы неправильно поняли концепцию переменной области. $mysqli должна быть переменной экземпляра этого класса, потому что она не сохранится до preparedStatement(), если вы просто установите ее в __construct() в качестве локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...