2024 年 PHP 日本研討會

錯誤和錯誤處理

PDO 提供 3 種不同的錯誤處理策略,以符合您的應用程式開發風格。

  • PDO::ERRMODE_SILENT

    在 PHP 8.0.0 之前,這是預設模式。PDO 只會設定錯誤碼,您可以使用 PDO::errorCode()PDO::errorInfo() 方法在語句和資料庫物件上檢查錯誤碼;如果錯誤是由呼叫語句物件造成的,您可以在該物件上呼叫 PDOStatement::errorCode()PDOStatement::errorInfo() 方法。如果錯誤是由呼叫資料庫物件造成的,則您應該在資料庫物件上呼叫這些方法。

  • PDO::ERRMODE_WARNING

    除了設定錯誤碼之外,PDO 還會發出傳統的 E_WARNING 訊息。如果您只想查看發生的問題而不中斷應用程式的流程,此設定在除錯/測試期間很有用。

  • PDO::ERRMODE_EXCEPTION

    自 PHP 8.0.0 起,這是預設模式。除了設定錯誤碼之外,PDO 還會拋出一個 PDOException 並設定其屬性以反映錯誤碼和錯誤資訊。這個設定在除錯時也很有用,因為它會在錯誤發生的當下有效地「炸掉」腳本,快速地指出程式碼中潛在的問題區域(請記住:如果例外導致腳本終止,交易會自動回滾)。

    例外模式也很有用,因為與傳統 PHP 風格的警告相比,您可以更清晰地建構錯誤處理,並且比在靜默模式下執行並明確檢查每個資料庫呼叫的傳回值所需的程式碼/巢狀結構更少。

    有關 PHP 中例外的更多資訊,請參閱 例外

PDO 標準化使用 SQL-92 SQLSTATE 錯誤碼字串;個別的 PDO 驅動程式負責將其原生碼映射到適當的 SQLSTATE 碼。PDO::errorCode() 方法會傳回單個 SQLSTATE 碼。如果您需要關於錯誤的更詳細資訊,PDO 也提供 PDO::errorInfo() 方法,該方法會傳回一個包含 SQLSTATE 碼、驅動程式特定錯誤碼和驅動程式特定錯誤字串的陣列。

範例 #1 建立 PDO 實例並設定錯誤模式

<?php
$dsn
= 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 這會導致 PDO 拋出 PDOException(當資料表不存在時)
$dbh->query("SELECT wrongcolumn FROM wrongtable");

上述範例將輸出

Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...')
#1 {main}
  thrown in /tmp/pdo_test.php on line 10

注意事項:

無論目前設定的 PDO::ATTR_ERRMODE 為何,如果連線失敗,PDO::__construct() 都會拋出 PDOException

範例 #2 從建構子建立 PDO 實例並設定錯誤模式

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

$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

// 當資料表不存在時,這將導致 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 9

新增註記

使用者提供的註記

此頁面沒有使用者提供的註記。
To Top