MySQLi не может подготовить заявление - PullRequest
0 голосов
/ 04 января 2012

Я выполняю два запроса в моем скрипте room.php.Оба используют подготовленные MySQLi операторы, и их код выглядит следующим образом:

/* Get room name */
$stmt = $mysqli->prepare('SELECT name FROM `rooms` WHERE r_id=?');
$stmt->bind_param('i', $roomID);
$stmt->execute();
$stmt->bind_result($roomName)

/* Add this user to the room */
$stmt = $mysqli->prepare('INSERT INTO `room_users` (r_id, u_id) VALUES (?, ?)');
$stmt->bind_param('ii', $roomID, $_SESSION['userID']);
$stmt->execute();

Когда я запускаю скрипт, я получаю эту ошибку:

Fatal error: Call to a member function bind_param() on a non-object in C:\wamp\www\room.php on line 24

Это второй запрос.Если я удаляю первый запрос из скрипта, все работает нормально.Аналогично, если я удалю второй запрос.Это заставляет меня поверить, что есть проблема, потому что я снова использую объект $stmt.Если я попробую второй запрос, используя $stmt2, я все равно получу ошибку.

Все таблицы и поля моей базы данных существуют, поэтому с запросами все в порядке.

1 Ответ

7 голосов
/ 04 января 2012

Все функции / методы mysqli могут потерпеть неудачу, и в этом случае они вернут false. То есть если метод prepare () завершается неудачно, $ stmt - это не объект, для которого можно вызвать метод, а bool (false). Вы должны проверить возвращаемые значения и добавить обработку ошибок, например,

$stmt = $mysqli->prepare('SELECT name FROM `rooms` WHERE r_id=?');
if ( !$stmt ) {
    printf('errno: %d, error: %s', $mysqli->errno, $mysqli->error);
    die;
}

$b = $stmt->bind_param('i', $roomID);
if ( !$b ) {
    printf('errno: %d, error: %s', $stmt->errno, $stmt->error);
}

$b = $stmt->execute();
if ( !$b ) {
  and so on and on

см. http://docs.php.net/mysqli-stmt.errno и др.


в этом случае вы, вероятно, столкнулись с проблемой, заключающейся в том, что вы не можете создать другой оператор, пока еще есть результаты / наборы результатов, ожидающие предыдущего оператора.
см http://docs.php.net/mysqli-stmt.close:

Закрывает подготовленное заявление. mysqli_stmt_close () также освобождает дескриптор оператора. Если текущий оператор имеет ожидающие или непрочитанные результаты, эта функция отменяет их, чтобы можно было выполнить следующий запрос.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...