繁体   English   中英

MySQLi无法准备语句

[英]MySQLi failing to prepare a statement

我在我的脚本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执行第二个查询,仍然会收到错误消息。

我所有的数据库表和字段都存在,因此查询没有任何问题。

所有的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()也取消分配语句句柄。 如果当前语句具有待处理或未读的结果,则此函数将其取消,以便可以执行下一个查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM