网上查了不少
最后定位到PDO这个类
这个网址说的不错
MySQL客户端协议不允许一个以上的查询是“进行中”。
客户端库解决这个通过获取第一个查询的所有行隐含在第一次提取,然后后面的提取只需遍历内部缓存的结果。
所不同的是一个缓冲的查询保存结果在MySQL客户端库,因此PHP无法访问行,直到你取(每个顺序)一行。
主要理由不使用使用fetchall()是一个结果可能是太大,无法在你的PHP memory_limit的。
您可以closeCursor(),以“抛弃”的结果你已经获取最后一行之前。
另外:我注意到你在执行你的$而stmt2一遍又一遍的循环中,但它每次都会返回相同的结果。
因此,我建议编写你的代码是这样的:
$sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} }
请注意我还使用命名参数,而不是位置参数,这使得它易于$行传递的参数值的数组。 :
前缀数组的键,但是你不需要再这样了。
你应该使用的mysqlnd反正。
很多的解决办法:
http://micate.me/php-pdo-unbuffered-queries-active.note
http://www.flashj.cn/wp/pdo-transaction-err-in-php.html
这两个站点也不错,可以参考下