栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

MySQL客户端协议不允许进行多个查询。也就是说,您已经执行了查询,并且已经获取了一些结果,但不是全部—然后尝试执行第二个查询。如果第一个查询仍有要返回的行,则第二个查询将收到错误。

客户端库通过在首次获取时隐式获取第一个查询的 所有
行来解决此问题,然后后续获取仅对内部缓存的结果进行迭代。这给他们提供了关闭游标的机会(就MySQL服务器而言)。这就是“缓冲查询”。这与使用fetchAll()相同,这两种情况都必须在PHP客户端中分配足够的内存以容纳完整的结果集。

不同之处在于,缓冲的查询将结果保存在MySQL客户端库中,因此,只有在依次提取(fetch())每行之后,PHP才能访问这些行。而fetchAll()立即为所有结果填充一个PHP数组,从而允许您访问任何随机行。

使用fetchAll()的主要原因是结果可能太大而无法容纳在您的PHP
memory_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_zippres       WHERe cities_id=:cities_id AND zippres_id=:zippres_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));} }

注意我还使用了命名参数而不是位置参数,这使得将$
row作为参数值数组进行传递更加简单。如果数组的键与参数名称匹配,则只需传递数组即可。在旧版本的PHP中,您必须

:
在数组键中包含前缀,但是您不再需要该前缀。

无论如何,您应该使用mysqlnd。它具有更多功能,具有更高的内存效率,并且其许可证与PHP兼容。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416290.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号