Php 当其他未缓冲查询处于活动状态时,PDO无法执行查询

Php 当其他未缓冲查询处于活动状态时,PDO无法执行查询,php,mysql,Php,Mysql,我知道这必须是一个简单的修复,我部分理解为什么我会出现这个错误,但不知道如何修复它。我查看了文档,但除了使用缓冲查询选项外,找不到其他解决方案。我也试过,但不起作用 错误是:当其他未缓冲查询处于活动状态时,PDO无法执行查询 错误来自我构建$result数组的那一行 foreach($phones as $phone) { $stmt = db::getInstance()->prepare("CALL phones(:phone)"); $stmt->bindPar

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

错误是:当其他未缓冲查询处于活动状态时,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);
}

让我们以一个表为例

CREATE TABLE foo (
  id int auto_increment,  
  phone int,  
  primary key(id),  
  unique key(phone)  
)
示例程序

delimiter //
CREATE PROCEDURE phones(in p INT)
BEGIN
  SELECT phone FROM foo WHERE phone > p;
END//
delimiter ;
和一些样本数据

INSERT INTO foo (phone) VALUES (1),(2),(3),(4),(5)
使用PDO语句可以从存储过程中获取结果集

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $pdo->prepare("CALL phones(:phone)");
$stmt->bindParam(':phone', $phone);
$phone = 1;
$stmt->execute();
do {
  echo "\nresult set: ";
  while($row=$stmt->fetch()) {
    echo $row['phone'], " | ";
  }
} while($stmt->nextRowset());
打印
结果集:2 | 3 | 4 | 5 |

(测试环境:PHP5.3.1/winxp、mysql 5.1.37)


do{}while($stmt->nextRowset())循环可能也解决了您的“原始”问题。

是否有不使用OUT参数的原因?是的,因为OUT参数仅用于输出单行。在我的例子中,我需要多行。你可以从一个过程中“返回”结果集。嗯。。你会有一个链接吗?我昨天在MySQL的网站上读到OutParams只输出一行。当然,除非我说的是完全不同的东西。你是否有一个方便的程序来证明这一点?谢谢。是的……在这种情况下,它不是一个外部参数。看我的“答案”。不完全是您要求的…但可能是您想要的=)甚至是测试环境。:)真是个家伙。谢谢你的努力,沃克。无论我做什么都是有缺陷的。我试过你的例子,效果很好。这正是我所需要的,所以我需要做的是将我的代码与您的代码进行比较,看看哪里出了问题。我的感觉是我的问题在我的过程中,而不一定是PHP。非常感谢你的努力,它真的帮助了我!如果问题仍然是“其他未缓冲查询处于活动状态”错误,请在
$stmt->execute()
之后尝试
while($stmt->nextRowset()){}
。它应该清除/清空/释放任何“活动”结果集。我尝试与代码一起运行相同的“do while”语句,但在XAMPP计算机上出现错误,表示此功能不可用。有什么建议吗?@JM4-请将您与正在使用的php版本+操作系统相处的确切(完整)信息作为一个新问题发布。@VolkerK-仅仅几年后才看到这一点。哈我甚至不记得这里的问题是什么,但似乎新的查询无法在存储过程的结果循环中执行(使用缓冲查询没有帮助)。但愿我不必把所有的结果都拿来