[英]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.