學(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ò)誤處理方式:
原來默認(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> 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', '');在上面的測試代碼中,我們查詢了 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);在設(shè)置錯(cuò)誤處理機(jī)制為警告后,PDO 會(huì)拋出一個(gè)不影響程序執(zhí)行的 warning 信息。但是,如果我們修改了 ini 文件中錯(cuò)誤處理機(jī)制后,也可能是看不到警告信息的。不過相對于默認(rèn)處理的情況來說,有一條警告信息已經(jīng)非常好了。 設(shè)置為異常$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);最后,我們將錯(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]);總結(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 |
|
|