php - 在 PHP 中,当我使用 PDO 调用 MySQL 存储过程,然后进行另一个查询时,出现错误 :

标签 php mysql pdo

<分区>

在 PHP 中,当我使用 PDO 调用 MySQL 存储过程,然后调用另一个 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 存储过程大概是这样的:

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 来捕获它):

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

即使我按照上述错误消息中描述的说明进行操作(这意味着使用 fetchAll() 并设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性),我仍然得到同样的错误信息。

如果我将第一个查询更改为普通的 SELECT SQL 查询,而不是 存储过程,我将不会收到此错误。所以看来问题出在存储过程上。

但是我该如何解决呢?

最佳答案

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

If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().

所以 $stmt->closeCursor(); 在第一个 $array = $stmt->fetchAll(); 之后就足够了。

关于php - 在 PHP 中,当我使用 PDO 调用 MySQL 存储过程,然后进行另一个查询时,出现错误 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45432123/

相关文章:

mysql - Perl 和 mysql,慢得要命,如何加速

PHP PDO 返回单行

php - PDO 如何返回已执行查询的总数

php - 快速检查对象是否会在 PHP 中成功实例化?

php - 是否反对使用变量在另一个 View 中调用 View 的 MVC 模式?

java - MySQL连接器错误 "The server time zone value Central European Time"

mysql - 了解mysql内存消耗

php - codeigniter session 在模型中不起作用

php - Jquery Ajax PHP 二维复选框数组

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 '?' 附近使用的正确语法