一个查询调用中的PDO多个语句以“无缓冲的查询”错误结束

时间:2011-02-14 09:34:24

标签: php mysql pdo

我正在尝试在PHP / PDO for MySQL中实现一些嵌套的set操作。进行插入操作后(如此处所述:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)由于错误HY000 / 2014,我无法执行另一个查询:

  

其他时无法执行查询   无缓冲的查询是活动的。   考虑使用   PDOStatement对象::使用fetchall()。   或者,如果您的代码是唯一的   永远不会对着mysql运行,你   可以通过设置启用查询缓冲   PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY   属性。

代码产生错误(错误在代码底部的最后一个“SELECT * FROM tree”处抛出):

// insert a node into a nested set as child
$queryParts = array(
    'LOCK TABLE tree WRITE',
    'SELECT @myLeft:= lft FROM tree WHERE id = :parentuid',
    'UPDATE tree SET rgt = rgt + 2 WHERE rgt > @myLeft',
    'UPDATE tree SET lft = lft + 2 WHERE lft > @myLeft',
    'UPDATE tree SET lft = @myLeft + 1, rgt = @myLeft + 2 WHERE id = :childuid',
    'UNLOCK TABLES',
);

$parentuid = $parent->getUid();
$childuid = $node->getUid();

$stmt = self::$connection->prepare(join(";\n", $queryParts) . ';') or die (print_r(self::$connection->errorCode(),1));
$stmt->bindParam(':parentuid', $parentuid);
$stmt->bindParam(':childuid', $childuid);

$res = $stmt->execute() or die (print_r($stmt->errorCode(),1));

// that does not help :(
if ($res) {
    do {
        $stmt->fetchAll(); // empty array
        $stmt->closeCursor();
    } while($stmt->nextRowset());
}

// is not executed
$rset = self::$connection->query('SELECT * FROM tree')
     or die (print_r(self::$connection->errorInfo(),1)); // that kills the code
while($row = $rset->fetchObject()) {
    var_dump($row);
}

在我看来,没有开放查询。 如何解决此错误?目前我被卡住了,所以任何帮助都会受到高度赞赏:)

1 个答案:

答案 0 :(得分:0)

如果查询包含多个用分号分隔的语句并以无缓冲模式执行,则会发生错误“在其他无缓冲查询处于活动状态时无法执行查询”。

解决方案是:

  • 分别执行每个查询部分,每个部分应该是一个没有分号“;”的单个查询。
  • 或切换到缓冲模式。