2015-05-27 5 views
1

Я только что начал использовать подготовленные PHP-заявления и думал, что я начинаю их понимать. Однако у меня серьезные проблемы со следующим кодом, который говорит о том, что мое понимание не настолько тщательное, как я думал. Я пробовал много вариантов, но я все еще получаю фатальную ошибку.Извлечь результаты из базы данных с помощью подготовленных операторов

В основном, я использовал подготовленные операторы для вставки данных в базу данных. Этот бит работает нормально. Затем я хочу получить последнюю вставленную запись для отображения пользователю, чтобы они могли проверить, что все в порядке. Вероятно, база данных будет обновляться на регулярной основе, и при необходимости в таблицы могут быть добавлены новые столбцы. Следовательно, я не хочу связывать_результат() с заданным списком переменных, но вместо этого хочу получить ассоциативный массив, который я могу выполнить с помощью цикла. Упрощенная версия кода (без проверки ошибок) приведен ниже:

<?php 
$db = new mysqli("localhost","username","password","database"); 

// Insert record into database using prepared statement... 
// Works fine. 

// Retrieve recently installed data... 
$EnteredDataStmt = $db->prepare("SELECT * FROM correspondence where id = ?") 
$EnteredDataStmt->bind_param('i', $LatestInsertID) 

// Get ID number of latest inserted data... 
$LatestInsertID = $db->insert_id; 

$EnteredDataStmt->execute() 

// I want to check that only 1 result is returned... 
$EnteredDataStmt->store_result() 
$NumResults = $EnteredDataStmt->num_rows; 

if($NumResults == 1) 
{ 
    $EnteredDataResult = $EnteredDataStmt->get_result(); 

    while ($row = $EnteredDataResult->fetch_array(MYSQLI_ASSOC)) // <- Error indicates problem at this line 
    { 
     foreach ($row as $key => $value) 
     { 
      print "<p>$key: $value</p>"; 
     } 
     print "\n"; 
    } 
} 

$EnteredDataStmt->close(); 
unset($EnteredDataResult); 
$db->close() 
?> 

Когда я пытаюсь запустить выше PHP скрипт, я получаю фатальную ошибку следующим образом:

Fatal error: Call to a member function fetch_array() on a non-object... 

Использование get_result(), за которым следует fetch_array (MYSQLI_ASSOC), результат предлагается на нескольких сайтах, но, похоже, это не работает для меня. Я тонко изменил контекст, не осознав этого? Любые предложения о том, куда я иду, будут весьма признательны.

+2

'$ EnteredDataResult' не является объектом, потому что' $ signedDataStmt-> get_result() 'возвращает' false'. Вы должны проверить 'echo $ db-> error;', чтобы узнать, какая ошибка MySQLi держится там. –

+0

На самом деле вызов 'get_result()' после 'store_result()' звучал знакомым мне, поэтому я оглянулся и нашел [этот ответ несколько месяцев назад] (https://stackoverflow.com/questions/28258723/how- to-check-no-of-rows-return-when-using-mysqli-stmt-prepare-and-mysqli-fetc/28258887 # 28258887) –

+1

Основываясь на том, что я нашел в этом ответе, я думаю, вы можете избежать использования '$ EnteredDataResult = $ EnteredDataStmt-> get_result()', а затем проверить '$ EnteredDataResult-> num_rows' и получить из' $ EnteredDataResult-> fetch_array() ' –

ответ

1

Ваш код должен быть в таком порядке.

// Get ID number of latest inserted data... 
$LatestInsertID = $db->insert_id; 

// Retrieve recently installed data... 
$EnteredDataStmt = $db->prepare("SELECT * FROM correspondence where id = ?") 
$EnteredDataStmt->bind_param('i', $LatestInsertID) 

В противном случае $LatestInsertID не существует для привязки. Вам также необходимо внедрить обработку ошибок, поскольку ваша фатальная ошибка вызвана тем, что запрос завершается с ошибкой, но вы его не видите.

$EnteredDataStmt->execute(); 
if (!$EnteredDataStmt) { 
    print $EnteredDataStmt->error; 
    exit; 
} 
Смежные вопросы