在PHP中,当我使用PDO调用MySQL存储过程,然后是另一个查询时,我收到一个错误:

时间:2017-08-01 07:58:24

标签: php mysql pdo

在PHP中,当我使用stored procedure拨打PDO PDO,然后使用另一个$dbh = new PDO('mysql:host=localhost;dbname=db1','user1','password1'); $query = "CALL get_token()"; $stmt = $dbh->query($query); $array = $stmt->fetchAll(); $query = "SELECT * FROM `table1`"; $stmt = $dbh->query($query); $array = $stmt->fetchAll(); 查询时,就像这样:

MySQL

stored procedure CREATE PROCEDURE `get_token`() BEGIN DECLARE token CHAR(64); DECLARE expire SMALLINT; SELECT `token`, `expire` INTO token, expire FROM `token`; SELECT token, expire; END$$ 就像这样:

try...catch

我收到以下错误消息(使用fetchAll()来捕获它):

  

常规错误:2014无法在其他无缓冲的情况下执行查询   查询是活动的。考虑使用PDOStatement :: fetchAll()。   或者,如果您的代码只是针对mysql运行,   您可以通过设置启用查询缓冲   PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性。

即使我按照上述错误消息中描述的说明(即使用PDO::MYSQL_ATTR_USE_BUFFERED_QUERY并设置SELECT属性),我仍然会收到相同的错误消息。

如果我将第一个查询更改为普通stored procedure SQL查询,而不是stored procedure,我将不会收到此错误。所以问题似乎来自.push

但我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

那是因为你没有释放第一个查询的光标。它仍在等待另一个fetchAll。来自http://php.net/manual/en/pdo.query.php

  

如果在下次调用PDO :: query()之前未获取结果集中的所有数据,则您的调用可能会失败。在发出对PDO :: query()的下一次调用之前,调用PDOStatement :: closeCursor()以释放与PDOStatement对象关联的数据库资源。

首先$stmt->closeCursor();$array = $stmt->fetchAll();就足够了。

答案 1 :(得分:1)

您应该使用PDO::MYSQL_ATTR_USE_BUFFERED_QUERYfetchAll() 因为他们发生冲突

根据documentation

  

PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY(整数)   如果在PDOStatement上将此属性设置为TRUE,则MySQL驱动程序将使用MySQL API的缓冲版本。如果您正在编写可移植代码,则应使用PDOStatement :: fetchAll()代替。

换句话说, fetchAll()尝试关闭缓冲区 但PDO::MYSQL_ATTR_USE_BUFFERED_QUERY保持开放