Возврат массива из запроса mysqli stmt - PullRequest
2 голосов
/ 22 февраля 2010

Привет! Я пытаюсь преобразовать сайт для использования подготовленных операторов mysql, однако у меня возникли некоторые проблемы при замене моего использования fetch_array ().

Комментарии на php.net предлагают решение, которое, как я думал, должно работать, но по какой-то причине я получаю странные неопределенные постоянные ошибки при вызове функции через call_user_func_array (), может кто-нибудь предложить лучший способ сделать это?

Вот функция, которую я использую в данный момент. Я немного ошарашил его для публикации здесь (это часть большего класса, который расширяет mysqli, обрабатывает ошибки и т. Д.), Так что извините, если я сделал какие-либо ошибки, скопируйте и вставьте его.

public static function stmt_bind_assoc(&$stmt, &$out) {
    $data = mysqli_stmt_result_metadata($stmt);
    $fields = array();
    $out = array();

    $fields[0] = $stmt;
    $count = 1;

    while($field = mysqli_fetch_field($data)) {
        $fields[$count] = &$out[$field->name];
        $count++;
    }
    call_user_func_array(mysqli_stmt_bind_result, $fields);
}
public function fetch_array($rawQuery) {
    $stmt = $this->prepare($rawQuery);
    $row = array();
    self::stmt_bind_assoc($stmt, $row);
    $result = $stmt->fetch();
    $stmt->free();
    return $result;
}

Я получаю следующие ошибки:

«Примечание: использование неопределенной константы mysqli_stmt_bind_result - предполагается« mysqli_stmt_bind_result »»

"Неустранимая ошибка: вызов неопределенного метода mysqli_stmt :: free ()"

Может кто-нибудь помочь, объяснив, почему я получаю эти ошибки и как я могу это исправить?

РЕДАКТИРОВАТЬ: вот оригинальный комментарий от php.net http://www.php.net/manual/en/mysqli-stmt.fetch.php#82742

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

Первая ошибка исходит из вашего утверждения call_user_func_array: вам нужно заключать в кавычки mysqli_stmt_bind_result, иначе PHP предполагает, что это константа.

А в mysqli_stmt нет функции free(), вместо нее используйте $stmt->free_result().

0 голосов
/ 06 апреля 2015
 $servername = "localhost"; $username = "root"; $password = ""; $dbnam = "test";

 // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname);

// Check connection if (mysqli_connect_errno()) {
 die("Connection failed: %s\n" . mysqli_connect_errno()); }

$stmt = mysqli_prepare($conn, "SELECT * FROM myguests") or
die(mysqli_error($conn));   mysqli_stmt_execute($stmt);

$data = mysqli_stmt_result_metadata($stmt);
$fields = array();
$out = array();

 $fields[0] = &$stmt;
 $count = 1;

 while($field = mysqli_fetch_field($data)) {
     $fields[$count] = &$out[$field->name];
     $count++;
 }

 call_user_func_array("mysqli_stmt_bind_result", $fields);
 while(mysqli_stmt_fetch($stmt))    print_r($out);

$stmt->close(); $conn->close();

Отлично работает на меня, надеюсь, это поможет

...