小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

學(xué)習(xí)PDO中的錯(cuò)誤與錯(cuò)誤處理模式

 硬核項(xiàng)目經(jīng)理 2021-05-31

學(xué)習(xí)PDO中的錯(cuò)誤與錯(cuò)誤處理模式

在 PDO 的學(xué)習(xí)過程中,我們經(jīng)常會(huì)在使用事務(wù)的時(shí)候加上 try...catch 來進(jìn)行事務(wù)的回滾操作,但是大家有沒有注意到默認(rèn)情況下 PDO 是如何處理錯(cuò)誤語句導(dǎo)致的數(shù)據(jù)庫操作失敗問題呢?今天,我們就來學(xué)習(xí)一下。

PDO 中的錯(cuò)誤與錯(cuò)誤處理模式簡介

PDO 提供了三種不同的錯(cuò)誤處理方式:

  • PDO::ERRMODE_SILENT,這是 PDO 默認(rèn)的處理方式,只是簡單地設(shè)置錯(cuò)誤碼,可以使用 PDO::errorCode() 和 PDO::errorInfo() 方法來檢查語句和數(shù)據(jù)庫對象

  • PDO::ERRMODE_WARNING,除設(shè)置錯(cuò)誤碼之外,PDO 還將發(fā)出一條傳統(tǒng)的 E_WARNING 信息。如果只是想看看發(fā)生了什么問題且不中斷應(yīng)用程序的流程,那么此設(shè)置在調(diào)試/測試期間非常有用。

  • PDO::ERRMODE_EXCEPTION,除設(shè)置錯(cuò)誤碼之外,PDO 還將拋出一個(gè) PDOException 異常類并設(shè)置它的屬性來反射錯(cuò)誤碼和錯(cuò)誤信息。

原來默認(rèn)情況下,我們的 PDO 是不會(huì)處理錯(cuò)誤信息的,這個(gè)你知道嗎?如果不信的話,我們繼續(xù)向下看具體的測試情況。不過,首先我們要說明的是,PDO 的錯(cuò)誤處理機(jī)制針對的是 PDO 對象中的數(shù)據(jù)操作能力,如果在實(shí)例化 PDO 對象的時(shí)候就產(chǎn)生了錯(cuò)誤,比如數(shù)據(jù)庫連接信息不對,那么直接就會(huì)拋出異常。( PHP5 中會(huì)直接返回一個(gè) NULL,PHP7會(huì)拋出異常?。?/p>$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test1''root''');
// Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1049] Unknown database 'blog_test1'

blog_test1 表并不存在,所以在 new PDO 的時(shí)候就已經(jīng)直接會(huì)拋出異常了。這個(gè)在實(shí)例化連接數(shù)據(jù)庫過程中的錯(cuò)誤處理機(jī)制是固定的,不是我們能修改的錯(cuò)誤處理機(jī)制,畢竟如果連數(shù)據(jù)庫連接都無法建立的話,就不用談后面的任何操作了。

默認(rèn)情況

$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test''root''');
$pdo->query('select * from aabbcc');
var_dump($pdo->errorCode());
// string(5) "42S02"

var_dump($pdo->errorInfo());
// array(3) {
//   [0]=>
//   string(5) "42S02"
//   [1]=>
//   int(1146)
//   [2]=>
//   string(38) "Table 'blog_test.aabbcc' doesn't exist"
// }

在上面的測試代碼中,我們查詢了 aabbcc 這個(gè)表,但其實(shí)數(shù)據(jù)庫中并不存在這個(gè)表。如果不使用 errorCode() 或者 errorInfo() 的話,這段代碼不會(huì)有任何輸出,也就是說,不會(huì)有任何錯(cuò)誤信息讓你看到,代碼就直接運(yùn)行過去了。

這個(gè)就是 PDO 在默認(rèn)情況下的錯(cuò)誤處理機(jī)制。其實(shí),這樣的處理并不好,因?yàn)槿绻覀兺浽O(shè)置錯(cuò)誤處理機(jī)制的話,就會(huì)導(dǎo)致一些錯(cuò)誤無法呈現(xiàn),而且并不好調(diào)試。

設(shè)置為警告

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$pdo->query('select * from aabbcc');
// Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.aabbcc' doesn't exist

在設(shè)置錯(cuò)誤處理機(jī)制為警告后,PDO 會(huì)拋出一個(gè)不影響程序執(zhí)行的 warning 信息。但是,如果我們修改了 ini 文件中錯(cuò)誤處理機(jī)制后,也可能是看不到警告信息的。不過相對于默認(rèn)處理的情況來說,有一條警告信息已經(jīng)非常好了。

設(shè)置為異常

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query('select * from aabbcc');
// Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.aabbcc' doesn't exist 

最后,我們將錯(cuò)誤處理機(jī)制設(shè)置為拋出異常??偹闶悄茏尦绦蛑兄惯\(yùn)行并且報(bào)出 Fatal error 錯(cuò)誤了,同時(shí),這個(gè)異常信息也是可以通過 try...catch 來捕獲到的。這樣的開發(fā)才是我們最需要的開發(fā)形式。

屬性添加方式

在上述測試代碼中,我們使用的是 setAttribute() 方法來設(shè)置 PDO 的錯(cuò)誤處理屬性,但其實(shí)我們可以在實(shí)例化 PDO 類時(shí)就指定一些需要的屬性。

$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test''root''', [PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING]);
$pdo->query('select * from aabbcc');
// Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'blog_test.aabbcc' doesn't exist

總結(jié)

PDO 已經(jīng)是現(xiàn)在的主流數(shù)據(jù)庫連接擴(kuò)展,也是各種框架的必備連庫擴(kuò)展,但是如果不深入的學(xué)習(xí)的話,很多人可能還真不知道很多關(guān)于 PDO 的一些知識。框架在為我們帶來便利的同時(shí),也讓我們變得更“笨”,所以,學(xué)習(xí)還是要更多地接觸底層地知識,免得在面試的時(shí)候需要手寫代碼的時(shí)候手足無措。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/%E5%AD%A6%E4%B9%A0PDO%E4%B8%AD%E7%9A%84%E9%94%99%E8%AF%AF%E4%B8%8E%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E6%A8%A1%E5%BC%8F.php

參考文檔:

https://www./manual/zh/pdo.error-handling.php

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多