【问题标题】:PDO Cannot execute queries while other unbuffered queries are activePDO 在其他无缓冲查询处于活动状态时无法执行查询
【发布时间】:2011-01-05 05:17:29
【问题描述】:

我知道这必须是一个简单的修复,我部分理解为什么我会收到此错误但不知道如何修复它。我查看了文档,但除了使用缓冲查询选项之外找不到解决方案。我也试过了,但是不行。

错误是:当其他无缓冲查询处于活动状态时,PDO 无法执行查询

错误来自我正在构建 $result 数组的行。

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

【问题讨论】:

  • 迟到了,但准备好的陈述的全部好处是您只需要准备一次。将您的准备移出循环。
  • 阿门,@KenK。阿门。

标签: php mysql


【解决方案1】:

您需要使用 PDOStatement::closeCursor() 方法释放连接

http://www.php.net/manual/en/pdostatement.closecursor.php

我相信

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $stmt->closeCursor()

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

应该为你做的

【讨论】:

    【解决方案2】:

    由于我的 PDO 连接子句中的错误,我遇到了这个问题。我试图在连接时更改时区:

    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';"
    

    我改成:

    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';"
    

    而且效果很好。

    【讨论】:

    • 谢谢!有完全相同的问题!
    【解决方案3】:

    我自己也遇到了这个问题,结果证明是使用堆叠查询。上述解决方案并没有解决问题。

    我们在触发错误的查询之前运行了这个查询:

    return $this->fquery('
      SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value; 
      INSERT INTO sync_delete_value (...)
      VALUES (%d, @follow_id, %d, "%s")',
      $val1, $val2, $val3
    );
    

    当我将其更改为时,一切都恢复正常:

    $followId = $this->fquery('
      SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value'
    );
    return $this->fquery('
      INSERT INTO sync_delete_value (...)
      VALUES (%d, %d, %d, "%s")',
      $val1, $followId, $val2, $val3
    

    );

    这是一种伪代码,但你明白了。

    【讨论】:

      【解决方案4】:

      如果 $stmt->closeCursor() 对您不起作用(对我不起作用),您可以取消设置 $stmt 变量以释放光标,如下所示:

      foreach($phones as $phone)
      {
          $stmt = db::getInstance()->prepare("CALL phones(:phone)");
          $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
          $stmt->execute();
          unset($stmt);
      
          $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
      }
      

      【讨论】:

      • 真的很有趣。这也为我解决了问题。
      猜你喜欢
      • 2015-03-28
      • 2014-09-18
      • 2017-11-09
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多