当 PDO::ATTR_EMULATE_PREPARES 设置为 false 并且您的查询在状态期间被终止(例如 MySQL 工作台 -> 客户端连接 -> 右键单击 -> 终止查询):“发送数据”、PDO“查询”或“执行”方法时,返回空 PDO 语句。PDO 应该抛出一个异常(仅当 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。