您的第二个电话$cxn->prepare
是返回false
或null
。换句话说,第二个查询未能创建语句。正如提到的评论之一,这可能是由于您使用了保留字 ( table
)、语法错误或连接超时等。
假设这类似于PDO
,您需要检查您的调用prepare
是否返回了一条语句:
<?php
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?');
if (!$stmt) {
// do something to deal with the failure
// throw new \Exception('Could not create statement');
}
$stmt->bind_param("i", $number);
$stmt->execute();
$stmt->bind_result($result);
while($stmt->fetch()) {
$stmt = $cxn->prepare('SELECT value FROM table2 WHERE column = ?');
if (!$stmt) {
// failed, handle it
// throw new \Exception('Could not create statement');
}
$stmt->bind_param("i", $result); // error on this line
$stmt->execute();
$stmt->bind_result($result2);
$stmt->fetch();
}
或者您可以将 PDO 的错误模式设置为抛出异常以及catch
出现问题时。
<?php
$cxn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
// after the above, failing calls to $cnx->prepare will throw exceptions
如果是 PDO,您可以使用PDO::errorInfo
andPDO::errorCode
来追踪您的问题:
<?php
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?');
if (!$stmt) {
var_dump($cxn->errorInfo());
return;
}
errorInfo
将返回一个数组,其中 SQLSTATE 代码作为第一个元素,驱动程序特定错误代码作为第二个元素,实际错误消息作为第三个元素。这是开始查找查询失败原因的地方。如果您确实将连接设置为引发异常,则异常本身将包含您需要的信息(PDOException::getMessage
、、PDOException::$errorInfo
等)。