首頁  >  文章  >  後端開發  >  PHP--PDO錯誤與錯誤處理

PHP--PDO錯誤與錯誤處理

伊谢尔伦
伊谢尔伦原創
2016-11-22 09:32:17970瀏覽

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 使用 SQL-92 SQLSTATE 來規範錯誤碼字串;不同 PDO 驅動程式負責將它們的本機程式碼對應為適當的 SQLSTATE 程式碼。 PDO::errorCode() 方法傳回一個單獨的 SQLSTATE 碼。如果需要更多此錯誤的細節訊息,PDO 還提供了一個 PDO::errorInfo() 方法來傳回一個包含 SQLSTATE 碼、特定驅動錯誤碼以及此驅動的錯誤字串的陣列。

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

<?php
    $dsn = &#39;mysql:dbname=testdb;host=127.0.0.1&#39;;
    $user = &#39;dbuser&#39;;
    $password = &#39;dbpass&#39;;
    try {
        $dbh = new PDO($dsn, $user, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo &#39;Connection failed: &#39; . $e->getMessage();
    }
?>

不管目前是否設定了 PDO::ATTR_ERRMODE ,如果連線失敗, PDO::__construct() 將總是拋出一個 PDOException PDOException 異常。未捕獲異常是致命的。

Example #2 建立 PDO 實例並在建構函式中設定錯誤模式

<?php
    $dsn = &#39;mysql:dbname=test;host=127.0.0.1&#39;;
    $user = &#39;googleguy&#39;;
    $password = &#39;googleguy&#39;;
    /*
     *使用 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 &#39;Connection failed: &#39; . $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 &#39;test.wrongtable&#39; doesn&#39;t exist in/tmp/pdo_test.php on line 18


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn