使用先前查询的结果进行查询

时间:2013-10-27 01:12:42

标签: php

我有以下代码:

$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

怎么了?

1 个答案:

答案 0 :(得分: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::errorInfoPDO::errorCode来追踪问题:

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

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