錯誤與錯誤處理

PDO 提供了三種不同的錯誤處理模式,以滿足不同風(fēng)格的應(yīng)用開發(fā):

  • PDO::ERRMODE_SILENT

    此為默認(rèn)模式。 PDO 將只簡單地設(shè)置錯誤碼,可使用 PDO::errorCode()PDO::errorInfo() 方法來檢查語句和數(shù)據(jù)庫對象。如果錯誤是由于對語句對象的調(diào)用而產(chǎn)生的,那么可以調(diào)用那個對象的 PDOStatement::errorCode()PDOStatement::errorInfo() 方法。如果錯誤是由于調(diào)用數(shù)據(jù)庫對象而產(chǎn)生的,那么可以在數(shù)據(jù)庫對象上調(diào)用上述兩個方法。

  • PDO::ERRMODE_WARNING

    除設(shè)置錯誤碼之外,PDO 還將發(fā)出一條傳統(tǒng)的 E_WARNING 信息。如果只是想看看發(fā)生了什么問題且不中斷應(yīng)用程序的流程,那么此設(shè)置在調(diào)試/測試期間非常有用。

  • PDO::ERRMODE_EXCEPTION

    除設(shè)置錯誤碼之外,PDO 還將拋出一個 PDOException 異常類并設(shè)置它的屬性來反射錯誤碼和錯誤信息。此設(shè)置在調(diào)試期間也非常有用,因?yàn)樗鼤行У胤糯竽_本中產(chǎn)生錯誤的點(diǎn),從而可以非常快速地指出代碼中有問題的潛在區(qū)域(記?。喝绻惓?dǎo)致腳本終止,則事務(wù)被自動回滾)。

    異常模式另一個非常有用的是,相比傳統(tǒng) PHP 風(fēng)格的警告,可以更清晰地構(gòu)建自己的錯誤處理,而且比起靜默模式和顯式地檢查每種數(shù)據(jù)庫調(diào)用的返回值,異常模式需要的代碼/嵌套更少。

    See Exceptions for more information about Exceptions in PHP.

PDO 使用 SQL-92 SQLSTATE 來規(guī)范錯誤碼字符串;不同 PDO 驅(qū)動程序負(fù)責(zé)將它們的本地代碼映射為適當(dāng)?shù)?SQLSTATE 代碼。PDO::errorCode() 方法返回一個單獨(dú)的 SQLSTATE 碼。如果需要更多此錯誤的細(xì)節(jié)信息,PDO 還提供了一個 PDO::errorInfo() 方法來返回一個包含 SQLSTATE 碼、特定驅(qū)動錯誤碼以及此驅(qū)動的錯誤字符串的數(shù)組。

示例 #1 創(chuàng)建 PDO 實(shí)例并設(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_ERRMODEPDO::ERRMODE_EXCEPTION);
} catch (
PDOException $e) {
    echo 
'Connection failed: ' $e->getMessage();
}

?>

注意:

不管當(dāng)前是否設(shè)置了 PDO::ATTR_ERRMODE ,如果連接失敗,PDO::__construct() 將總是拋出一個 PDOException 異常。未捕獲異常是致命的。

示例 #2 創(chuàng)建 PDO 實(shí)例并在構(gòu)造函數(shù)中設(shè)置錯誤模式

<?php
$dsn 
'mysql:dbname=test;host=127.0.0.1';
$user 'googleguy';
$password 'googleguy';

/*
    使用 try/catch 圍繞構(gòu)造函數(shù)仍然有效,即使設(shè)置了 ERRMODE 為 WARNING,
    因?yàn)槿绻B接失敗,PDO::__construct 將總是拋出一個  PDOException 異常。
*/
try {
    
$dbh = new PDO($dsn$user$password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (
PDOException $e) {
    echo 
'Connection failed: ' $e->getMessage();
    exit;
}

// 這里將導(dǎo)致 PDO 拋出一個 E_WARNING 級別的錯誤,而不是 一個異常 (當(dāng)數(shù)據(jù)表不存在時(shí))
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>

以上例程會輸出:

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