2010-02-22 5 views
2

Привет, я пытаюсь преобразовать сайт, чтобы использовать подготовленные операторы mysql, однако у меня возникли проблемы с заменой моего использования fetch_array().Возвращает массив из mysqli stmt query

Комментарии на 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 :: бесплатно() "

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

EDIT: вот оригинальный комментарий от php.net http://www.php.net/manual/en/mysqli-stmt.fetch.php#82742

ответ

2

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

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

0
$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(); 

Прекрасно работает на меня, надеюсь, что это помогает