PDO 提供了三種不同的錯誤處理模式,以滿(mǎn)足不同風(fēng)格的應用開(kāi)發(fā):
PDO::ERRMODE_SILENT
此為默認模式。 PDO 將只簡(jiǎn)單地設置錯誤碼,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法來(lái)檢查語(yǔ)句和數據庫對象。如果錯誤是由于對語(yǔ)句對象的調用而產(chǎn)生的,那么可以調用那個(gè)對象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果錯誤是由于調用數據庫對象而產(chǎn)生的,那么可以在數據庫對象上調用上述兩個(gè)方法。
PDO::ERRMODE_WARNING
除設置錯誤碼之外,PDO 還將發(fā)出一條傳統的 E_WARNING 信息。如果只是想看看發(fā)生了什么問(wèn)題且不中斷應用程序的流程,那么此設置在調試/測試期間非常有用。
PDO::ERRMODE_EXCEPTION
除設置錯誤碼之外,PDO 還將拋出一個(gè) PDOException 異常類(lèi)并設置它的屬性來(lái)反射錯誤碼和錯誤信息。此設置在調試期間也非常有用,因為它會(huì )有效地放大腳本中產(chǎn)生錯誤的點(diǎn),從而可以非??焖俚刂赋龃a中有問(wèn)題的潛在區域(記?。喝绻惓е履_本終止,則事務(wù)被自動(dòng)回滾)。
異常模式另一個(gè)非常有用的是,相比傳統 PHP 風(fēng)格的警告,可以更清晰地構建自己的錯誤處理,而且比起靜默模式和顯式地檢查每種數據庫調用的返回值,異常模式需要的代碼/嵌套更少。
See Exceptions for more information about Exceptions in PHP.
PDO 使用 SQL-92 SQLSTATE 來(lái)規范錯誤碼字符串;不同 PDO 驅動(dòng)程序負責將它們的本地代碼映射為適當的 SQLSTATE 代碼。PDO::errorCode() 方法返回一個(gè)單獨的 SQLSTATE 碼。如果需要更多此錯誤的細節信息,PDO 還提供了一個(gè) PDO::errorInfo() 方法來(lái)返回一個(gè)包含 SQLSTATE 碼、特定驅動(dòng)錯誤碼以及此驅動(dòng)的錯誤字符串的數組。
示例 #1 創(chuàng )建 PDO 實(shí)例并設置錯誤模式
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
注意:
不管當前是否設置了
PDO::ATTR_ERRMODE
,如果連接失敗,PDO::__construct() 將總是拋出一個(gè) PDOException 異常。未捕獲異常是致命的。
示例 #2 創(chuàng )建 PDO 實(shí)例并在構造函數中設置錯誤模式
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
/*
使用 try/catch 圍繞構造函數仍然有效,即使設置了 ERRMODE 為 WARNING,
因為如果連接失敗,PDO::__construct 將總是拋出一個(gè) PDOException 異常。
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
// 這里將導致 PDO 拋出一個(gè) E_WARNING 級別的錯誤,而不是 一個(gè)異常 (當數據表不存在時(shí))
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
以上例程會(huì )輸出:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 18