MySQLi未能准备声明

时间:2012-01-04 15:24:16

标签: php mysql pdo mysqli

我在我的脚本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 个答案:

答案 0 :(得分:7)

所有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()也释放语句句柄。如果当前语句具有挂起或未读结果,则此函数将取消它们,以便可以执行下一个查询。