PDO在其他未缓冲的查询处于活动状态时无法执行查询

时间:2010-01-14 18:57:31

标签: php mysql

我知道这必须是一个简单的修复,我部分理解为什么我收到此错误但不知道如何修复它。我查看了文档,但除了使用缓冲查询选项之外无法找到解决方案。我也试过了,但它不起作用。

错误是:PDO在其他未缓冲的查询处于活动状态时无法执行查询

错误来自我构建$ result数组的行。

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

4 个答案:

答案 0 :(得分:35)

您需要使用PDOStatement :: closeCursor()方法释放连接

http://www.php.net/manual/en/pdostatement.closecursor.php

我相信

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $stmt->closeCursor()

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

应该为你做

答案 1 :(得分:9)

由于我的PDO连接子句中的错误,我遇到了这个问题。我试图在连接时改变时区:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';"

我把它改为:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';"

它运作良好。

答案 2 :(得分:4)

我自己遇到了这个问题,问题原来是使用堆叠查询。上述解决方案没有解决问题。

我们在触发错误的查询之前运行了此查询:

return $this->fquery('
  SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value; 
  INSERT INTO sync_delete_value (...)
  VALUES (%d, @follow_id, %d, "%s")',
  $val1, $val2, $val3
);

当我将其更改为:

时,所有事情都照常恢复
$followId = $this->fquery('
  SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value'
);
return $this->fquery('
  INSERT INTO sync_delete_value (...)
  VALUES (%d, %d, %d, "%s")',
  $val1, $followId, $val2, $val3

);

这是一种伪代码,但你明白了。

答案 3 :(得分:3)

如果$ stmt-> closeCursor()不适合你(它对我来说没有用),你可以取消设置$ stmt变量以释放光标,如下所示:

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();
    unset($stmt);

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}