1

当 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。

4

1 回答 1

0

我遇到了同样的问题。幸运的是,在我的情况下,我只需要检查数据是否存在,所以我的解决方法是在原始选择查询周围包装一个 count 语句:

SELECT COUNT(*) FROM (<original query>);

在这种情况下,我只会在超时时收到空响应。

于 2021-09-10T00:55:02.983 回答