由于致命错误而未引发PHP异常

时间:2013-10-03 16:34:32

标签: php mysql exception-handling pdo

我正在使用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块也没有被执行。

我怎么能处理这个问题,以便我可以回滚以前的查询?

1 个答案:

答案 0 :(得分:1)

如果PDO中出现问题,PDO只会抛出异常。您获得的错误是指您访问$r->bindValue,尽管$ r无法初始化。

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

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

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

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

  

PHP.NET PDO::prepare

     

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