回答

收藏

MySQL 错误 2014 的原因无法执行查询而其他无缓冲查询处于活动状态

技术问答 技术问答 182 人阅读 | 0 人回复 | 2023-09-12

我的服务器运行 CentOS 6.4,MySQL 5.1.69 安装使用 yum 和 CentOS 仓库,PHP 5.4.16 安装使用 yum 和 ius 仓库。Edit3升级到 MySQL Server 版本:5.5.31 由 IUS 社区项目分发,错误依然存在。然后将库改为mysqlnd,似乎消除了错误。然而,通过这种来回,我们需要知道为什么这个错误有时会发生。
4 S& w' a3 {$ T2 p$ W5 _使用 PDO 并用 创建 PDO 对象时PDO::ATTR_EMULATE_PREPARES=>false,有时会出现以下错误:
- G, k  z- L9 y
    Table Name - zipcodesError in query:SELECT id FROM cities WHERE name=? AND states_id=?SQLSTATE[HY000]: 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.File Name: /var/www/initial_install/build_database.phpLine: 547Time of Error: Tuesday July 2,2013,5:52:48 PDT
    2 M9 w5 u) {% O( ]
最后一行是第 547 行:
" h; Y$ N7 T% N2 i( M  ?
    3 l$ ^! j6 y: b! D1 n5 f0 {
  • $stmt_check_county->execute(array($data[5],$data[4]));if(!$county_id=$stmt_check_county->fetchColumn(){     $stmt_counties->execute(array($data[5]);       $county_id=db::db()->lastInsertId()$stmt_check_county->closeCursor()This will fix the error$stmt_check_city->execute(array($data[3],$data[4]);code]几年前,我遇到了类似的问题,但从 PHP 5.1 升级到 PHP 5.3(并且 MySQL 可能已经更新了),问题神奇地消失了在我用 PHP 5.5 解决了这个问题。
    " ]) M, y0 H% M, [4 [9 v
  • 为什么它只存在?PDO::ATTR_EMULATE_PREPARES=>false,并且只有 PHP 交替版才会出现?
    6 c; Y, m/ ^* f
  • 我还发现这closeCursor()也会修复错误。每次不使用是否应该使用?SELECT查询后执行此操作fetchAll()?请注意,即使查询类似SELECT COUNT(col2)只返回一个值,错误仍然会发生。7 O) ~, ]0 d2 i: f
  • 编辑    顺便说一句,这就是我创建连接的方式。我最近添加了它MYSQL_ATTR_USE_BUFFERED_QUERY=>true,但是,它不能解决错误。另外,以下脚本可以根据原样创造错误。( u* L7 S8 i. ?( \5 g( S
  • [code]function sql_error($e,$sql=NULL){return('Error in query:'.$sql.'
    ) ?, `9 |& a6 E: p* k" ~
  • '.$e->getMessage().'; C. U5 y. C+ O/ M5 K0 Q
  • File Name: '.$e->getFile().' Line: '.$e->getLine().'');}class db    private static $instance = NULL;    private function __construct() {}   Make private    private function __clone(){}   //Make private    public static function db() //Get instance of DB           if (!self:instance)                   //try{self:instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_EMULATE_PREPARES=>false,PDO::ATTR_ERRMODE=>DO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>DO::FETCH_ASSOC));}            try{self:instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_EMULATE_PREPARES=>false,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true,PDO::ATTR_ERRMODE=>DO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>DO::FETCH_ASSOC));}      try{self:instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_ERRMODE=>DO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>DO::FETCH_ASSOC));}            catch(PDOException $e){echo(sql_error($e));}          return self:instance;   $row=array(   zipcodes_id'=>'55555',            'cities_id'=>123);$data=array($row,$row,$row,$row);$sql = 'CREATE TEMPORARY TABLE temp1(temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT,PRIMARY KEY (temp_id) )';db::db()->exec($sql);$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=? AND zipcodes_id=?';$stmt1 = db::db()->prepare($sql);$sql ='SELECT temp_id FROM temp1';$stmt2 = db::db()->prepare($sql);foreach($data AS $row){    try                                                                                                                                                                                                                 $stmt1->execute(array($row['zipcodes_id'],$row['cities_id);$rs1 = $stmt1->fetch(PDO::FETCH_ASSOC);      $stmt1->closeCursor();        syslog(LOG_INFO,'$rs1: '.print_r($rs1,1).' '.rand();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$stmt2->execute();        $rs2 = $stmt2->fetch(PDO::FETCH_ASSOC);        syslog(LOG_INFO,'$rs2: '.print_r($rs2,1).' '.rand();catch(PDOException $e){echo(sql_error($e));}        echo('done');* L3 J  Z  z1 {. |; B# e% D) l
               2 z7 {8 d5 @/ u- T, t* j
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则