PDO:使用fetchAll,仍然收到一般错误:2014

时间:2013-08-08 04:55:56

标签: php pdo fetchall

这个问题正在让我发疯...

首先是免责声明,我几乎没有正式的编程培训。我绊倒了。

我收到一般错误:2014年错误;起初它是一个特定的查询(在类中建立),警告取决于我在实例化对象的代码中的位置。我继续将每个查询更改为fetchAll,然后在fetchAll不起作用后关闭每个查询的光标。现在有两个违规查询。这是一个复制和粘贴:

(更新代码):

$sql = "select initial_state from source_nodes where id = :id";

$core = Core::getInstance();
$stmt = $core->dbh->prepare($sql);
$stmt->bindParam(':id', $allSources->id[$id], PDO::PARAM_INT);

if ($stmt->execute()) {
    $row = $stmt->fetchAll();
    $stmt->closeCursor();
    foreach($row as $i=>$value){
        $allSources->state[$id] = $row[$i]['initial_state'];
    }
}

不确定是否重要,但警告会在'if'上发出警告。据我所知,每个'fetch'现在都是'fetchAll'并包含'closeCursor'。

连接设置如下:

$this->dbh = new PDO($dsn, $user, $password, array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true
            ));

建议?

2 个答案:

答案 0 :(得分:2)

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE);

是修复错误的灵丹妙药,你甚至不打算提供哪些文字,假设读者想要用心数知道每一个错误。

虽然只是机械地将所有fetch()来电替换为fetchAll(),但

您编辑过的代码有两件事。

  1. 你的循环很无用。正如我上面所说的那样,机械地,盲目地做某事不会带来任何好处。一个人必须至少达到最低限度的理解。你拥有的循环是无用的两次:因为你从fetchAll()得到的$ row不需要任何循环(它已经包含所有数据),因为你只得到一行而且不需要循环。因此fetch()应该使用而不是fetchAll。
  2. 尽管你有这种感觉,但不是“每次'获取'现在都是'fetchAll'”,因为错误信息清楚地告诉我们。
  3. 您似乎在较大的循环内逐个选择行。它显然有些错误的查询气味。您必须使用fetchAll()并且不使用所有这些内部查询,使外部查询(对我们来说是不可见的)一次获取所有数据。

答案 1 :(得分:0)

我认为这可能是一个PHP错误。

https://bugs.php.net/bug.php?id=57540

您的PHP版本是什么?