回答

收藏

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

技术问答 技术问答 259 人阅读 | 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,似乎消除了错误。然而,通过这种来回,我们需要知道为什么这个错误有时会发生。
. K4 i5 d4 I# y* C3 |& l使用 PDO 并用 创建 PDO 对象时PDO::ATTR_EMULATE_PREPARES=>false,有时会出现以下错误:% f! J& r+ t* X  ~7 U* _, ~  v
    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
    " O$ ]" n7 v& ~* u$ j* U
最后一行是第 547 行:, L4 T2 |) }1 Z

    + w* I+ ^; p8 G0 B9 s5 P
  • $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 解决了这个问题。( r% e7 P0 \9 c% O9 r7 C
  • 为什么它只存在?PDO::ATTR_EMULATE_PREPARES=>false,并且只有 PHP 交替版才会出现?- W# [& b* y# B) e# O: d6 L% P$ b2 f
  • 我还发现这closeCursor()也会修复错误。每次不使用是否应该使用?SELECT查询后执行此操作fetchAll()?请注意,即使查询类似SELECT COUNT(col2)只返回一个值,错误仍然会发生。
    8 G8 I3 j: \7 e1 L6 p- b: I
  • 编辑    顺便说一句,这就是我创建连接的方式。我最近添加了它MYSQL_ATTR_USE_BUFFERED_QUERY=>true,但是,它不能解决错误。另外,以下脚本可以根据原样创造错误。& f6 [. b; O8 C6 Y
  • [code]function sql_error($e,$sql=NULL){return('Error in query:'.$sql.'
    4 a' r& w- Z' M1 h
  • '.$e->getMessage().'
    . h  s2 U9 H  o2 Y6 S# q# b
  • 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');. }- X$ g0 q+ j5 o! G1 m
               
8 }7 e5 X8 e/ m. W7 X1 m8 f    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则