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(); } ?><button class="copy-code-button" type="button" data-clipboard-text="<?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(); } ?> "></button>
注意: 不管當前是否設置了 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"); ?><button class="copy-code-button" type="button" data-clipboard-text="<?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"); ?> "></button>
以上例程會輸出:
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<button class="copy-code-button" type="button" data-clipboard-text="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 "></button>
相關文章
- PHP array_product() 函數
- PHP curl_multi_getcontent函數
- PHP gmmktime() 函數
- PHP chown() 函數
- PHP readfile() 函數
- PHP ftp_delete() 函數
- PHP max() 函數
- PHP mysqli_field_tell() 函數
- PHP mysqli_get_charset() 函數
- PDO::lastInsertId
- PHP getName() 函數
- PHP join() 函數
- PHP ltrim() 函數
- PHP str_getcsv() 函數
- PHP strcasecmp() 函數
- PHP strtolower() 函數
- PHP strtoupper() 函數
- PHP substr_compare() 函數
- PHP xml_set_notation_decl_handler() 函數
- PHP imagesx()、imagesy() – 獲取圖像寬度與高度