MySQL-Cannot execute queries while other unbuffered queries are active

项目合作 项目合作 主题:1030 回复:2135

MySQL-Cannot execute queries while other unbuffered queries are active

虐人心 发布于 2017-03-15 字数 1354 浏览 1010 回复 1

多条sql拼接起来用PDO执行报错 Cannot execute queries while other unbuffered queries are active 但是直接把sql传进去又可以 点解?(循环里插入和更新之前要先查询这条记录存在否,存在更新,不存在插入,是不是这个的影响?)操作系统是windows
顺便贴出执行SQL的方法:

public function Query($sql, $pb=array()){
if(empty($sql)) {die("sql 为空");}
$res = '';
$link = self::$link_ID[array_search($pb["rw"], self::$rws)];
try{
$obj = $link->prepare($sql);
if ($obj === false){
$errorInfo = $link->errorInfo();
print_r($errorInfo);
print_r("<br />SQL:".$sql);die();
}

}catch (Exception $e) {
print_r("Error ! SQL:".$sql." error is:".$e->getMessage()."<br />");
die();
}
$flag = $obj->execute();
if($pb['rw']=='r'){
$res = $obj->fetchAll(PDO::FETCH_ASSOC);
$obj->closeCursor();
return empty($res)?null:$res;
}elseif($pb['rw']=='w'){
if($pb['returnid']=='1')
return $link->lastInsertId();
else
return $flag;
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(1

归属感 2017-09-02 1 楼

在PHP的手册的注释里有一句是这样的:

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.

意思是要么使用fetchAll(),要么使用MYSQL_ATTR_USE_BUFFERED_QUERY这个属性,前者不想那样用,因为担心占用内存,后者发现没效果。

这个应该是Windows版本的PDO有问题,解决的办法有两个:

一、把SQL拆分成多个独立的SQL语句来执行。

二、使用两个不同的db对象来处理多个语句
  下面是个例子:

 $db = DB::getInstence();
$db2 = DB::getInstence();

$sql = "select * from table limit 20";
$stat = $db->query($sql);
while ($row = $stat->fetch()) {
$db2->update('field', array('name' => ($row[name_at'])), 'id='.$row['id'] );
}