我有以下代码:
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?');
$stmt->bind_param("i", $number);
$stmt->execute();
$stmt->bind_result($result);
while($stmt->fetch()) {
$stmt = $cxn->prepare('SELECT value FROM table2 WHERE column = ?');
$stmt->bind_param("i", $result); // error on this line
$stmt->execute();
$stmt->bind_result($result2);
$stmt->fetch();
}
我想使用第二个查询中第一个查询的结果,但是,我在第$stmt->bind_param("i", $result);
行上收到以下错误:
Fatal error: Call to a member function bind_param() on a non-object
怎么了?
答案 0 :(得分:0)
您对$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
和PDO::errorCode
来追踪问题:
<?php
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?');
if (!$stmt) {
var_dump($cxn->errorInfo());
return;
}
errorInfo
将返回一个数组,其中SQLSTATE代码作为第一个元素,驱动程序特定的错误代码作为第二个元素,实际的错误消息作为第三个元素。这是开始查找查询失败原因的地方。如果您设置连接以抛出异常,则exception itself将包含您需要的信息(PDOException::getMessage
,PDOException::$errorInfo
等)。