-1

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

首先免责声明,我很少接受正式的编程培训。我在这个过程中跌跌撞撞。

我收到一般错误: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'];
    }
}

不确定它是否重要,但会在“如果”上发出警告。据我所知,每个 '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
            ));

建议?

4

2 回答 2

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

是修复错误的灵丹妙药,您甚至都懒得提供文本,假设读者可以通过数字记住每个错误。

虽然只是机械地替换所有fetch()调用fetchAll()不是。

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

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

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

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

你的 PHP 版本是什么?

于 2013-11-06T05:27:23.020 回答