【问题标题】:PDO + SQL Buffered queriesPDO + SQL 缓冲查询
【发布时间】:2016-03-05 11:08:50
【问题描述】:

我需要在脚本中运行一堆查询,但我得到了这个错误

PDOException(HY000): SQLSTATE[HY000]: 一般错误:2014 不能 在其他无缓冲查询处于活动状态时执行查询。考虑 使用 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 的调用,但是我仍然看到相同的错误。我发现another answer 建议调用closeCursor(),但如果我将fetchAllcloseCursor 交换,结果仍然相同。我还尝试将 SQL 组合到 1 个查询中,但出现语法错误,似乎我无法在 1 个查询中运行多个语句。

【问题讨论】:

  • 您是否尝试过上述问题的第二个答案中给出的解决方案?无论如何,您应该只链接问题以避免此类事情。社区不知道您指的是哪个答案以及来自哪个网站。
  • @ConsiderMe 是的,仍然没有运气。我可能尝试了网络上的所有内容,作为最后的手段,我在这里发布。
  • 您的数据库类是否具有exec 方法以及“查询”方法。如果是这样,请改用它。是的,我知道它应该与 query 方法一起使用,但这取决于您的 db 类在运行 query 方法时实际执行的操作。
  • 您是否在Database::connection 方法中执行SELECT 查询?如果是这样,请确保正确关闭它。无论如何,我认为如果您在不泄露密码的情况下分享connection 方法的代码会很有帮助。
  • 猜测 - 您的 database 类期望查询返回结果集。 'exec' 方法适用于成功或失败的 SQL。例如: 'create' ,alter 即 (DDL) 语句。

标签: php sql


【解决方案1】:

根据 cmets 看来问题是通过调用exec 方法解决的。

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

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2010-10-09
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多