PDO + SQL 缓冲查询


PDO + SQL Buffered queries

我需要在脚本中运行一堆查询,但我收到此错误

PDOException(HY000): SQLSTATE[HY000]: 一般错误: 2014 无法 在其他未缓冲查询处于活动状态时执行查询。考虑 using PDOStatement::fetchAll()。

我的脚本

$db = Database::connection();
$sql = <<<SQL
CREATE TABLE IF NOT EXISTS `comments` (
  ...
) ENGINE=InnoDB AUTO_INCREMENT=86 DEFAULT CHARSET=utf8;
SQL;
$db->query($sql)->fetchAll();
$sql = <<<SQL
CREATE TABLE IF NOT EXISTS `comments_ratings` (
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL;
$db->query($sql)->fetchAll();
$sql = <<<SQL
CREATE TRIGGER ...
SQL;
$db->query($sql)->fetchAll();
$sql = <<<SQL
CREATE TRIGGER ...;
SQL;
$db->query($sql)->fetchAll();

我的 SQL 语法是有效的,如果我手动运行查询,它们就会成功执行。如您所见,我已经按照错误消息的建议在每次查询后添加了对fetchAll的调用,但是我仍然看到相同的错误。我找到了另一个建议打电话给closeCursor()的答案,但是如果我将fetchAllcloseCursor交换,结果仍然是一样的。我还尝试将 SQL 合并为 1 个查询,但我收到语法错误,似乎我无法在 1 个查询中运行多个语句。

根据评论,似乎通过调用exec方法解决了问题。

问题是尝试使用相同的连接对象执行多个查询,而由于某种原因,连接对象具有活动的无缓冲查询。您需要从连接中删除该活动的无缓冲查询,或者关闭连接并在每次执行查询时创建新的连接对象。解决方法是使用exec方法,但选择该解决方案将无法获得此确切问题的答案。