MySQL错误2014原因无法执行查询--P…

来源:互联网 发布:广州岗顶数据恢复 编辑:程序博客网 时间:2024/06/03 20:37

网上查了不少

最后定位到PDO这个类

http://stackoverflow.com/questions/17434102/causes-of-mysql-error-2014-cannot-execute-queries-while-other-unbuffered-queries&usg=ALkJrhgqG0PsXgSYk9W7uMgljOGEUbiwaw

这个网址说的不错

MySQL客户端协议不允许一个以上的查询是“进行中”。 也就是说,你执行一个查询,你已经获取了一些成果,但不是全部 -那么你尝试执行第二个查询。 如果第一个查询仍然有行返回,第二个查询得到一个错误。

客户端库解决这个通过获取第一个查询的所有行隐含在第一次提取,然后后面的提取只需遍历内部缓存的结果。 这让他们有机会近距离光标(至于MySQL服务器而言)。 这是在“缓冲的查询”。 这个工程一样使用使用fetchall(),在这两种情况下必须分配在PHP客户端足够的内存来保存完整的结果集。

所不同的是一个缓冲的查询保存结果在MySQL客户端库,因此PHP无法访问行,直到你取(每个顺序)一行。 而使用fetchall()立即填充一个PHP数组的所有结果,让您存取任何随机行。

主要理由使用使用fetchall()是一个结果可能是太大,无法在你的PHPmemory_limit的。 但它出现在查询结果中只有一个排,无论如何,所以这不应该是一个问题。

您可以closeCursor(),以“抛弃”的结果你已经获取最后一行之前。 MySQL服务器得到通知,它可以抛弃在服务器端的结果,然后就可以执行另一个查询。 你不应该closeCursor(),直到你完成获取给定的结果集。

另外:我注意到你在执行你的$而stmt2一遍又一遍的循环中,但它每次都会返回相同的结果。 在移动循环不变代码移出循环的原则,你应该立即开始循环之前执行这一点,并保存结果的PHP变量。 因此,无论使用缓冲的查询方法或者fetchAll()的,没有必要为你嵌套查询。

因此,我建议编写你的代码是这样的:

 $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));} } 

请注意我还使用命名参数,而不是位置参数,这使得它易于$行传递的参数值的数组。 如果数组的键相匹配的参数名称,你可以传递数组。 在较旧版本的PHP,你必须包括:前缀数组的键,但是你不需要再这样了。

你应该使用的mysqlnd反正。 它有更多的功能,它的更多的内存效率,以及其许可证是用PHP兼容。

很多的解决办法:

http://micate.me/php-pdo-unbuffered-queries-active.note

http://www.flashj.cn/wp/pdo-transaction-err-in-php.html

这两个站点也不错,可以参考下

0 0
原创粉丝点击