解决 PHP PDO 报错 Cannot execute queries while other unbuffered queries are active
- 2025-03-13 17:49:00
- 丁国栋
- 原创 47
感悟名称 : 一次 PHP PDO 报错排查
感悟起源 : 在测试版本升级过程中遇到PHP pdo报错: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. 需要排查和解决。
pdo::errorInfo() 显示以下错误:
array(3) { [0]=> string(5) "HY000" [1]=> int(2014) [2]=> string(269) "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." }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.
思考轨迹 :
-
自己尝试解决。按照错误提示去修改PDO连接属性,未果。
-
尝试搜索解决。这个错误比较罕见,用AI和Google搜索答案未果,AI的回答甚至在一本正经胡说八道。而Google搜索得到的众多回答中也没有解决;
-
摇人。把这个罕见错误发到研发群里,询问是否有同事遇到过,都没有遇到,提供的其他思路未果。
-
再深入排错。一步一步断点调试,查找错误是什么时候开始的,在最靠近错误输出的地方打印调试日志,例如这次就是在pdo对象的exec方法(禅道是封装在dbh class中)。
-
最后结合php手册,发现pdo::exec方法不推荐使用select查询,虽然不会抛出Exeception,但如果不获取结果(使用错误提示中的fetchAll方法)下一个语句会报错,所以要避免在exec方法中使用select查询。
-
那么为什么要使用select呢?原计划是从文件中读取sql执行时使用select 1代替,这样如果去强化代码强度,既然不能用,那么可以改为 set @empty = 1; 这样的简单语句。
突破点 :
-
增强自己在排错过程中的心态稳定性和信心,事出必有因;
-
牢记变更可能带来的影响,出现问题时思考发生问题前有哪些改动;
-
php pdo::exec 方法里不要执行select;
-
在框架设计时考虑提早捕获异常,记录日志等;
-
调试日志时需要注意技巧,在最容易报错的地方收集日志,尽可能打印出错的SQL语句和执行结果,对执行结果做进一步判断和检查;
适用场景 :
-
可以直接用于解决这个pdo报错;
-
在php编程中,在pdp对象exec方法中不要使用select等查询;
-
优化禅道框架设计;
引用资料 :