在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
。
但我该如何解决这个问题?
答案 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_QUERY
或fetchAll()
因为他们发生冲突
PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY(整数) 如果在PDOStatement上将此属性设置为TRUE,则MySQL驱动程序将使用MySQL API的缓冲版本。如果您正在编写可移植代码,则应使用PDOStatement :: fetchAll()代替。
换句话说,
fetchAll()
尝试关闭缓冲区
但PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
保持开放