【问题标题】:MySQL PDO empty result set when ATTR_EMULATE_PREPARES set to false and query is killed当 ATTR_EMULATE_PREPARES 设置为 false 并且查询被终止时,MySQL PDO 为空结果集
【发布时间】: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 服务器已消失”

标签: php mysql pdo mysqlnd


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多