3

当我使用相同的连接语句(使用 PDO)执行第二个存储过程时,出现以下错误。

=================================================

SQLSTATE[HY000]:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。

==================================================== =====

这是我在drupal中的代码

$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

$statement = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result = $statement->execute();
while ($row = $statement->fetchObject()) {   
  print_r($row);
}


$statement ->closeCursor();

$statement1 = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}

帮我解决这个问题。

4

2 回答 2

2

这是 PDO 的一个不好的特性,没有很好的文档记录。当语句执行了存储过程时,closeCursor 方法不起作用。您需要使用 nextRowSet 方法。这是我使用的

            while($sth->nextRowSet())
        {
            $sth->fetchAll();
        }
        $sth->closeCursor();
于 2013-05-01T22:54:37.843 回答
-1

只需在每次准备之前将其设置为 null

$statement1=null;
$statement1 = $conn->prepare("CALL Odd_Get_Sport()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}

$statement1=null;
$statement1 = $conn->prepare("CALL Another()");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}

$statement1=null;
$statement1 = $conn->prepare("SELECT * FROM test");
$exec_result1 = $statement1->execute();
while ($row1 = $statement1->fetchObject()) {   
   print_r($row1);
}
于 2021-04-08T11:30:51.383 回答