Latest web development tutorials

PHP PDO 錯誤與錯誤處理

PHP PDO 參考手冊 PHP PDO參考手冊

  • PDO::ERRMODE_SILENT

    此為默認模式。 PDO 將只簡單地設置錯誤碼,可使用PDO::errorCode() 和PDO::errorInfo() 方法來檢查語句和數據庫對象。 如果錯誤是由於對語句對象的調用而產生的,那麼可以調用那個對象的PDOStatement::errorCode() 或PDOStatement::errorInfo() 方法。 如果錯誤是由於調用數據庫對象而產生的,那麼可以在數據庫對像上調用上述兩個方法。

  • PDO::ERRMODE_WARNING

    除設置錯誤碼之外,PDO 還將發出一條傳統的E_WARNING 信息。 如果只是想看看發生了什麼問題且不中斷應用程序的流程,那麼此設置在調試/測試期間非常有用。

  • PDO::ERRMODE_EXCEPTION

    除設置錯誤碼之外,PDO 還將拋出一個PDOException 異常類並設置它的屬性來反射錯誤碼和錯誤信息。 此設置在調試期間也非常有用,因為它會有效地放大腳本中產生錯誤的點,從而可以非常快速地指出代碼中有問題的潛在區域(記住:如果異常導致腳本終止,則事務被自動回滾)。

    異常模式另一個非常有用的是,相比傳統PHP 風格的警告,可以更清晰地構建自己的錯誤處理,而且比起靜默模式和顯式地檢查每種數據庫調用的返回值,異常模式需要的代碼/嵌套更少。

創建PDO 實例並設置錯誤模式

<?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異常。 未捕獲異常是致命的。

創建PDO 實例並在構造函數中設置錯誤模式

<?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 18
add a note add a note

PHP PDO 參考手冊 PHP PDO參考手冊