【问题标题】:PHP Exception not raised on fatal error致命错误未引发 PHP 异常
【发布时间】:2013-10-10 11:11:10
【问题描述】:

我正在使用 PHP5 和 PDO 进行 mysql 查询。

我正在尝试使用 try/catch 处理来自查询的异常。但是,例如,如果我有这样的语法错误:

try{
    $sql = 'IggggNSERT INTO t_table (ID, MONTH) VALUES (:ID, :MONTH)';
    $r = $conn->prepare($sql);
    $r->bindValue(':ID', $id);
    $r->bindValue(':MONTH', $month);
    $r->execute();
    return $r;
}
catch (Exception $e) {
    die('Error');
}

我收到这个致命错误:

PHP Fatal error:  Call to a member function bindValue() on a non-object

但是没有引发异常,我的 catch 块也没有执行。

我该如何处理这个问题,以便回滚以前的查询?

【问题讨论】:

  • 或者一般情况下可以使用php.net/manual/en/function.set-error-handler.php
  • 很抱歉投了反对票,但die('Error'); 无论如何都不是异常处理
  • @Your Common Sense : this die('Error') 只是为了说明,所以我没有把我真正的 try/catch 块的 60 行放在这里...
  • 哎呀! (试图从地板上收起我的下巴)你在 catch 块中有 60 行代码?!
  • :)。仅仅是因为我有很多列要插入,如果出现任何问题,我还有一些事情要做。无论如何,如果你不明白我不会把我的整个项目放在这里只是为了问一个问题,那就投反对票吧。毕竟我得到了答案。如果你告诉我这可能会让其他读者感到困惑,我会理解,但显然用 die('Error') 处理异常并不是这个问题的目的。

标签: php mysql exception-handling pdo


【解决方案1】:

仅当问题发生在 PDO 内部时,PDO 才会抛出异常。尽管 $r 未能初始化,但您收到的错误是指您访问 $r->bindValue

在正常操作中,您的 SQL 永远不会出现任何语法错误。

但是,您可以尝试在数据库文件中设置以下行:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

据我从 PHP.NET 了解,如果设置了这一行,prepare() 会引发异常,这应该会触发 catch 语句。

PHP.NET PDO::prepare

如果数据库服务器成功准备语句,PDO::prepare() 返回一个 PDOStatement 对象。如果数据库服务器无法成功准备语句,则 PDO::prepare() 返回 FALSE 或发出 PDOException(取决于错误处理)。

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2023-03-27
    • 2018-11-15
    • 2023-03-18
    相关资源
    最近更新 更多