起因
一直沒有注意看數據庫相關知識
幾個月之前,無意打開如下一段代碼:
被人吐槽是N年前的寫法。後來也是學習需要,單一mysql已經不合適了。於是上網搜了一下好方法,PDO迎面而來。
誘惑
上網浏覽時,看見了一段話:
The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP. Each database driver that implements the PDO interface can expose database-specific features as regular extension functions. Note that you cannot perform any database functions using the PDO extension by itself; you must use a database-specific PDO driver to access a database server.
PDO provides a data-access abstraction layer, which means that, regardless of which database you're using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn't rewrite SQL or emulate missing features. You should use a full-blown abstraction layer if you need that facility.
給出網友的翻譯:
PDO擴展為PHP定義了一個訪問數據庫的輕量的,持久的接口。實現了PDO接口的每一種數據庫驅動都能以正則擴展的形式把他們各自的特色表現出來。注意;利用PDO擴展本身並不能實現任何數據庫函數。你必須使用一個特定的數據庫PDO驅動去訪問數據庫。
PDO提供了一個數據訪問抽象層,這就意味著,不管你使用的是哪種數據庫,你都可以用同樣的函數去進行查詢的獲取數據。PDO並不提供數據提取,它不會重寫SQL語句,或者模仿這些功能。你需要使用一個成熟的提取層,如果你需要的話。
它可以不受數據庫特定語法限制,讓數據庫平台切換更無痛,很誘人啊有木有
初見
工欲善其事必先利其器。php5的安裝就累述了,下面說一下關於pdo的php.ini的配置
首先,你需要知道:
在php.ini裡面,分號表示注釋,去掉前面的分號就代表該功能可以用
Ok,現在打開php.ini(可以用記事本打開)
在文件裡,找到以下行
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
把前面的分號去掉(我這裡已經去掉)就可以了。
在配置php.ini到時候要小心,修改前先備份。我曾經改錯一次,使得php無法工作,還愣是不知道哪裡有問題。。
這樣子,pdo就安裝完畢了
把玩
第一件事當然是想看看怎麼連接數據庫啦
它有一個PDO類,說是創建一個新的pdo對象,應該是這個了
看看語法,第一個語句出來啦~\(≧▽≦)/~
在裡面,mysql就是數據庫類型,localost是主機名,test是數據庫名,dbuser是用戶名,dbpass是密碼
請注意try/catch代碼塊,你應該始終將您 PDO 的操作封裝在一個 try/catch 代碼塊內並使用異常機制
下面有一個網友的語句圖,把我的集合成一句話
下面是錯誤處理
PDO 提供了3中不同的錯誤處理策略。
PDO::ERRMODE_SILENT
這是默認使用的模式。PDO會在statement和database對象上設定簡單的錯誤代號,你可以使用PDO->errorCode() 和 PDO->errorInfo() 方法檢查錯誤;如果錯誤是在對statement對象進行調用時導致的,你就可以在那個對象上使用 PDOStatement->errorCode() 或 PDOStatement->errorInfo() 方法取得錯誤信息。而如果錯誤是在對database對象調用時導致的,你就應該在這個database對象上調用那兩個方法。
PDO::ERRMODE_WARNING
作為設置錯誤代號的附加,PDO將會發出一個傳統的E_WARNING信息。這種設置在除錯和調試時是很有用的,如果你只是想看看發生了什麼問題而不想中斷程序的流程的話。
PDO::ERRMODE_EXCEPTION
作為設置錯誤代號的附件,PDO會拋出一個PDOException異常並設置它的屬性來反映錯誤代號和錯誤信息。這中設置在除錯時也是很有用的,因為他會有效的"放大(blow up)"腳本中的出錯點,非常快速的指向一個你代碼中可能出錯區域。(記住:如果異常導致腳本中斷,事務處理回自動回滾。)
異常模式也是非常有用的,因為你可以使用比以前那種使用傳統的PHP風格的錯誤處理結構更清晰的結構處理錯誤,比使用安靜模式使用更少的代碼及嵌套,也能夠更加明確地檢查每個數據庫訪問的返回值。
回到上面的代碼,如果發生了錯誤,一個PDOException異常對象將被拋出,然後catch會捕捉到,然後按照開發者設定的內容進一步處理。
連接就玩到這裡。。
進擊
連接之後該干什麼了呢?沒錯,處理數據,要不數據庫干嘛用的。下面所有將給出兩個版本:
假設有個表zjyz
id
name
1
aaa
2
bbb
數據查詢
我們要查詢id為1的數據
MYSQL版本:
PDO版本:
诶,貌似沒差多少的樣子~~
數據更新
我們要更新id為1的數據,name值改為ccc
MYSQL版本:
PDO版本:
感覺這個exec清爽多了
刪除數據
我們要刪除id為1的數據
MYSQL版本:
PDO版本:
呵呵,還是exec返回行數
插入數據
我們要插入數據 id = 3 ,name = ccc
MYSQL版本:
PDO版本:
好玩的exec()
上面出現了很多次這個函數,現在簡單介紹一下
PDO::exec() 在一個單獨的函數調用中執行一條 SQL 語句,返回受此語句影響的行數。
PDO::exec() 不會從一條 SELECT 語句中返回結果。對於在程序中只需要發出一次的 SELECT 語句,可以考慮使用 PDO::query()。對於需要發出多次的語句,可用 PDO::prepare() 來准備一個 PDOStatement 對象並用 PDOStatement::execute() 發出語句。
總結
雖然這個技術有點老了,但是相對於陳舊的語句,依然活力四射。隨著學習的深入,樓樓還學到了很多本文沒提到的東西。謝謝各位大神啦~\(≧▽≦)/~
這些等等很多。。。所有涉及數據庫的操作也基本換成了PDO
很高興吶
技術是死的,人是活的。利用舊技術,創造新未來。
本文參考資料:
版權所有