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