PHP數(shù)據(jù)庫抽象層之PDO(五)——錯誤與錯誤處理
PDO 提供了三種不同的錯誤處理模式,以滿足不同風格的應用開發(fā):
PDO::ERRMODE_SILENT此為默認模式。 PDO 將只簡單地設置錯誤碼,可使用?PDO::errorCode()?和?PDO::errorInfo()?方法來檢查語句和數(shù)據(jù)庫對象。如果錯誤是由于對語句對象的調(diào)用而產(chǎn)生的,那么可以調(diào)用那個對象的?PDOStatement::errorCode()?或?PDOStatement::errorInfo()?方法。如果錯誤是由于調(diào)用數(shù)據(jù)庫對象而產(chǎn)生的,那么可以在數(shù)據(jù)庫對象上調(diào)用上述兩個方法。PDO::ERRMODE_WARNING除設置錯誤碼之外,PDO 還將發(fā)出一條傳統(tǒng)的 E_WARNING 信息。如果只是想看看發(fā)生了什么問題且不中斷應用程序的流程,那么此設置在調(diào)試/測試期間非常有用。PDO::ERRMODE_EXCEPTION除設置錯誤碼之外,PDO 還將拋出一個?PDOException?異常類并設置它的屬性來反射錯誤碼和錯誤信息。此設置在調(diào)試期間也非常有用,因為它會有效地放大腳本中產(chǎn)生錯誤的點,從而可以非??焖俚刂赋龃a中有問題的潛在區(qū)域(記住:如果異常導致腳本終止,則事務被自動回滾)。異常模式另一個非常有用的是,相比傳統(tǒng) PHP 風格的警告,可以更清晰地構(gòu)建自己的錯誤處理,而且比起靜默模式和顯式地檢查每種數(shù)據(jù)庫調(diào)用的返回值,異常模式需要的代碼/嵌套更少。
PDO 使用 SQL-92 SQLSTATE 來規(guī)范錯誤碼字符串;不同 PDO 驅(qū)動程序負責將它們的本地代碼映射為適當?shù)?SQLSTATE 代碼。?PDO::errorCode()?方法返回一個單獨的 SQLSTATE 碼。如果需要更多此錯誤的細節(jié)信息,PDO 還提供了一個?PDO::errorInfo()?方法來返回一個包含 SQLSTATE 碼、特定驅(qū)動錯誤碼以及此驅(qū)動的錯誤字符串的數(shù)組。
Example #1 創(chuàng)建 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?異常。未捕獲異常是致命的。
Example #2 創(chuàng)建 PDO 實例并在構(gòu)造函數(shù)中設置錯誤模式
<?php $dsn = ’mysql:dbname=test;host=127.0.0.1’; $user = ’googleguy’; $password = ’googleguy’; /* *使用 try/catch 圍繞構(gòu)造函數(shù)仍然有效,即使設置了 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 級別的錯誤,而不是 一個異常 (當數(shù)據(jù)表不存在時)$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
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. windows服務器使用IIS時thinkphp搜索中文無效問題3. Python基于requests實現(xiàn)模擬上傳文件4. ASP.NET MVC實現(xiàn)橫向展示購物車5. 通過CSS數(shù)學函數(shù)實現(xiàn)動畫特效6. python利用opencv實現(xiàn)顏色檢測7. Python 中如何使用 virtualenv 管理虛擬環(huán)境8. ASP.Net Core(C#)創(chuàng)建Web站點的實現(xiàn)9. Python sorted排序方法如何實現(xiàn)10. Python獲取B站粉絲數(shù)的示例代碼
