【发布时间】:2015-07-19 06:52:15
【问题描述】:
当 PDO::ATTR_EMULATE_PREPARES 设置为 false 并且您的查询在状态期间被终止(例如 MySQL 工作台 -> 客户端连接 -> 右键单击 -> 终止查询):“发送数据”、PDO“查询”或“执行”方法,返回空 PDOStatement。 PDO 应该抛出一个 EXCEPTION(仅当 PDO::ATTR_ERRMODE 设置为 PDO::ERRMODE_EXCEPTION 时)或返回 false 而不是 PDOStatement。
因此,您的应用程序会收到空的结果集,尽管该查询应该返回一些数据。没有办法处理这种情况。当您在收到的 PDOStatement 上运行 errorCode() 时,您会得到:'00000',errorInfo() 返回一个数组:
['00000', null, null]
我正在运行:MySQL 5.6.22、PHP 5.6.4、pdo_mysql - mysqlnd 5.0.11-dev - 20120503
这使我假设 PDO 或 MySQL 中存在错误。
这里解释:PDO MySQL: Use PDO::ATTR_EMULATE_PREPARES or not? 对于 MySQL >=5.1.17,建议依赖 MySQL 并关闭仿真。
是否不推荐使用 PDO 仿真?
当我将应用程序设为默认(启用)时,可能会对应用程序产生什么影响?
我个人认为这是一个非常关键的问题,因为当问题发生(查询执行失败等)时,您的应用程序认为实际上没有数据。想象一下,您的应用程序没有触发购买女朋友生日花的提醒?纯粹的邪恶。
注意
查询中断状态时:
"Copying to tmp table"
您会收到带有消息的 PDOException:
"SQLSTATE[70100]: <<Unknown error>>: 1317 Query execution was interrupted"
即使在“正在发送数据”状态下终止该查询执行,也会得到完全相同的异常,但 PDO::ATTR_EMULATE_PREPARES 必须设置为 true。
【问题讨论】:
-
被杀死的查询和杀死连接之间有区别吗?
-
当连接被终止时,您会得到有效的 PDO 异常,消息:“SQLSTATE[HY000]:一般错误:2006 MySQL 服务器已消失”