【问题标题】:Different solution to `Cannot execute queries while other unbuffered queries are active`“在其他无缓冲查询处于活动状态时无法执行查询”的不同解决方案
【发布时间】:2025-12-21 13:05:12
【问题描述】:

我刚刚从 MySQL 迁移到较新的 MariaDB,我的所有网站现在都在显示:

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

我用谷歌搜索了这个错误并尝试按照人们的建议进行操作。

所以我更改了我的代码以使用 PDO 的 closeCursor()。 我尝试使用PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,但没有任何效果。

【问题讨论】:

  • 我不明白为什么这被否决了。我在使用 MySQL 时遇到了同样的问题,原因和解决方案相同。

标签: php mysql pdo mariadb


【解决方案1】:

这是我的构造函数的样子:

$pdo = new PDO('mysql:host=' . $host . ';dbname=' . $db . ';port=' . $port, $user, $pass, 
                array(
                  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8;SET SESSION time_zone="system"', 
                  PDO::MYSQL_ATTR_LOCAL_INFILE => true
                ));

我改成

$pdo = new PDO('mysql:host=' . $host . ';dbname=' . $db . ';port=' . $port, $user, $pass, 
                array(
                  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8, SESSION time_zone="system"',     
                  PDO::MYSQL_ATTR_LOCAL_INFILE => true
                ));

它现在可以工作了。

我在这里发布我的解决方案是因为所有其他地方都有“错误”的解决方案。

所以不同的是,而不是拥有

'SET NAMES utf8;SET SESSION time_zone="system"'

PDO::MYSQL_ATTR_INIT_COMMAND 我有:

'SET NAMES utf8, SESSION time_zone="system"'

现在一切都很好。

【讨论】:

  • 其实应该把utf8放到DSN的charset部分。而且使用 PDO::MYSQL_ATTR_INIT_COMMAND 也没有任何意义,因为您可以仅使用常规 query() 方法发送任意数量的命令
  • @YourCommonSense 在 PHP 5.3.6 之前的 DSN 字符集被忽略,因此上述解决方案甚至适用于较旧的 PHP。而使用 MYSQL_ATTR_INIT_COMMAND 而不是 query() 只是我的选择。