我正在使用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 块也没有执行。
我该如何处理这个问题,以便我可以回滚以前的查询?
PDO只会在PDO内部出现问题时才引发异常。您收到的错误是指尽管$r初始化失败,但您访问$r->bindValue
。
在正常操作中,SQL 不应出现任何语法错误。
但是,您可以尝试在数据库文件中设置以下行:
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
据我从 PHP.NET 中了解,如果设置了这一行,prepare() 会抛出异常,这应该引发 catch
语句。
PHP.NET PDO::p repare
如果数据库服务器成功地准备了语句,PDO::p repare() 将返回一个 PDOStatement 对象。如果数据库服务器无法成功准备语句,PDO::p repare() 将返回 FALSE 或发出 PDOException(取决于错误处理)。