0

我有以下代码:

$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

怎么了?

4

1 回答 1

0

您的第二个电话$cxn->prepare是返回falsenull。换句话说,第二个查询未能创建语句。正如提到的评论之一,这可能是由于您使用了保留字 ( 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::errorInfoandPDO::errorCode来追踪您的问题:

<?php
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?');
if (!$stmt) {
    var_dump($cxn->errorInfo());
    return;
}

errorInfo将返回一个数组,其中 SQLSTATE 代码作为第一个元素,驱动程序特定错误代码作为第二个元素,实际错误消息作为第三个元素。这是开始查找查询失败原因的地方。如果您确实将连接设置为引发异常,则异常本身将包含您需要的信息(PDOException::getMessage、、PDOException::$errorInfo等)。

于 2013-10-27T01:26:44.297 回答