【问题标题】:PDO multiple statements in one query-call ends in error with "unbuffered queries"一个查询调用中的 PDO 多个语句以“无缓冲查询”错误结束
【发布时间】:2011-06-26 19:28:13
【问题描述】:

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

无法执行查询,而其他 无缓冲查询处于活动状态。 考虑使用 PDOStatement::fetchAll()。 或者,如果您的代码仅 曾经要与mysql运行,你 可以通过设置启用查询缓冲 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性。

产生错误的代码(错误在代码底部的最后一个“SELECT * FROM 树”处引发):

// 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);
}

在我看来,没有公开的查询。 如何解决这个错误?目前我被卡住了,所以非常感谢任何帮助:)

【问题讨论】:

  • 顺便说一句:$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);没有帮助。

标签: php mysql pdo


【解决方案1】:

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

解决办法是:

  • 单独执行每个查询部分,每个部分应为单个查询,不带分号“;”
  • 或切换到缓冲模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2010-10-24
    • 2012-03-12
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多