PDO::ERRMODE_SILENT
此為預設模式。 PDO 將只簡單地設定錯誤碼,可使用PDO::errorCode() 和PDO::errorInfo() 方法來檢查語句和資料庫物件。如果錯誤是由於對語句物件的呼叫而產生的,那麼可以呼叫那個物件的PDOStatement::errorCode() 或PDOStatement::errorInfo() 方法。如果錯誤是由於呼叫資料庫物件而產生的,那麼可以在資料庫物件上呼叫上述兩個方法。
PDO::ERRMODE_WARNING
除設定錯誤碼之外,PDO 還將發出一條傳統的E_WARNING 訊息。如果只是想看看發生了什麼問題且不中斷應用程式的流程,那麼此設定在偵錯/測試期間非常有用。
PDO::ERRMODE_EXCEPTION
除設定錯誤碼之外,PDO 還將拋出一個PDOException 異常類別並設定它的屬性來反射錯誤碼和錯誤訊息。此設定在偵錯期間也非常有用,因為它會有效地放大腳本中產生錯誤的點,從而可以非常快速地指出程式碼中有問題的潛在區域(記住:如果異常導致腳本終止,則交易自動回滾)。
異常模式另一個非常有用的是,相比傳統PHP 風格的警告,可以更清晰地建立自己的錯誤處理,而且比起靜默模式和明確地檢查每種資料庫呼叫的返回值,異常模式需要的程式碼/嵌套更少。
<?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() 總是會拋出一個PDOException 例外。未捕獲異常是致命的。
<?php$dsn = 'mysql:dbname=test;host=127.0.0.1';$user = 'googleguy';$password = 'googleguy';/* 使用try/catch 圍繞建構子仍然有效,即使設定了ERRMODE為WARNING, 因為如果連線失敗,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;}// 這裡將導致PDO 拋出一個E_WARNING等級的錯誤,而不是異常(當資料表不存在時)$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 18add a note add a note