|
我的服务器运行 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 yTable 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
解决方案: |
|