《laravel框架中PHP操作數據庫的Mysql和PDO擴展應用》要點:
本文介紹了laravel框架中PHP操作數據庫的Mysql和PDO擴展應用,希望對您有用。如果有疑問,可以聯系我們。
在Laravel中,對數據庫的訪問可以通過查詢構造器或Eloquent ORM實現,不同的方法實現不同的底層封裝,這兩種封裝都有同一個目的,即對底層不同數據庫提供統一的操作接口.默認情況下,Laravel支持四種數據庫系統,即MySQL、Postgres、SQLite和SQL Server.也就是說,當服務器程序數據庫改變時(如從SQLite遷移到MySQL上),如果對數據庫的操作是通過查詢構造器或Eloquent ORM實現的,那么只需要修改數據庫配置文件的相關配置,對于程序不需要進行任何修改就可以實現,這樣將會極大提高Laravel框架的擴展性.查詢構造器的底層其實用到的還是PHP數據庫抽象層的PDO擴展,該擴展是一個“輕量級”的數據庫擴展,數據庫的操作需要自己設計SQL語句來執行,而Laravel框架的查詢構造器是在PDO擴展基礎上設計的一個“重量級”的數據庫擴展,它將SQL語句的設計都進行了封裝,將需要變化的部分進行了分離并以配置文件的方式進行設置,對數據庫常用的操作進行了封裝,提供了統一的接口,更加方便使用.下面將通過PHP中數據庫的操作、數據庫連接的封裝、查詢構造器的實現、查詢構造器的使用和查詢構造器的數據庫操作五個部分進行介紹,介紹過程將以MySQL數據庫為例.
一般關系型數據庫采用的是“客戶機/服務器”的體系結構,客戶端通過SQL語句操作服務端.在PHP中,有兩大類操作數據庫的擴展,一種是針對各數據庫開發的專用擴展,如MySQL擴展、SQLite3擴展;另一種是數據庫抽象層,如PDO(PHP Data Objects,PHP數據對象)、ODBC(Open Database Connectivity,開放數據庫互連).在PHP開發中,以前的開發中大多使用專用擴展,因為PDO是在PHP5.1版本才引入的,而目前開發中大多使用PDO擴展.Laravel框架中關于數據庫操作的底層使用的就是PDO擴展.
那么這兩種擴展有什么區別呢?一是開發思想不同,針對各數據庫開發的專用擴展采用的是面向過程的思想開發的,而PDO擴展采用的是面向對象的思想開發的.二是提供的接口針對的數據庫范圍不同,專用擴展只是針對某一種數據庫開發的,如MySQL擴展提供的接口只能操作MySQL數據庫,當更改底層數據庫時,就要重新安裝相應數據庫的擴展,也需要對數據庫的操作代碼重新編程;而數據庫抽象層則針對多種數據庫提供統一的接口,采用這種接口編寫的程序,在更改底層數據庫時,不需要重新安裝數據庫抽象層,但需要安裝對應的數據庫驅動,代碼部分只需要修改少許的連接和設置等操作,其他對數據的操作不需要修改,擴展性好,其作用方式如圖所示.三是平安性,在關系型數據庫中,使用專用擴展需要解決SQL注入的問題,而使用PDO擴展可以避免這個問題.
下面針對MySQL數據庫介紹專用擴展和PDO擴展的用法,一是使讀者了解兩者的區別和效果,二是有助于讀者了解Laravel框架關于數據庫操作底層的實現.1.MySQL擴展應用;前面提到,專用MySQL擴展是采用面向過程的思想開發的,當PHP安裝了MySQL擴展后,就可以直接使用相應的函數來執行SQL語句,從而完成對數據庫的操作,這里用到的是mysql_query()函數執行SQL語句.一般將SQL語句分為兩類:一類是執行SQL語句后有返回結果的,如select語句、desc語句等;第二類是沒有返回結果的,如delete語句、insert語句等.對于沒有返回結果的語句不需要設置返回值,可以通過mysql_insert_id()函數獲取最后操作數據的行數及通過mysql_affected_rows()獲取操作影響的行數.對于有返回結果的語句需要設置返回值,可以通過mysql_fetch_assoc()函數實現返回值的獲取.下面給出一個簡單的對數據庫進行操作的源碼:
通過上述源碼可以看出,操作一個數據庫需要四個步驟:一是連接數據庫的服務端;二是選擇數據庫;三是準備SQL語句并執行;四是關閉數據庫.這些步驟所用到的函數都是對應數據庫專用的擴展函數,在擴展方面無法遷移到其他數據庫,在平安性方面,因為是一次性完成SQL語句命令和數據的設定及編譯(一般數據庫將SQL語句從客戶端發送到服務端時需要先編譯才能執行),所以容易受到SQL注入的攻擊.
2.PDO擴展應用;目前,在PHP程序設計中對數據庫的操作廣泛采用PDO擴展方式,因為該擴展對不同數據庫提供統一的接口,只需要添加相應數據庫的驅動就可以實現數據庫的遷移,擴展性更好.同時,PDO將服務器端命令語句的編譯和數據添加的分離思想應用到客戶端,可以避免SQL注入的攻擊,平安性更好.下面給出基于PDO擴展來操作MySQL數據庫的源碼:
通過上述源碼可以看出,采用PDO擴展對數據庫操作的步驟與采用專用MySQL擴展對數據庫操作的步驟幾乎相同,但在實現方式上卻不同.一是在PDO擴展中對MySQL數據庫的操作方法中幾乎沒有與該數據庫關聯的部分,只有在建立連接時構造DSN(Data Source Name,數據源名稱)時以“mysql:host=localhost;dbname=Laravel”的方式聲明了數據庫類型,而具體對數據庫的操作方法與數據庫類型無關,所以在數據庫遷移時,只需要修改這個連接參數就可以實現,擴展性更好;二是在執行數據庫操作時,可以先通過PDO類的prepare()方法將操作命令發送到服務端編譯,再通過PDOStatement類的execute()方法將數據發送到服務端并執行,這種方法既可以提高多次執行同一條操作命令時的速度,也可以避免SQL注入的危險,所以效率、平安性都更高.
維易PHP培訓學院每天發布《laravel框架中PHP操作數據庫的Mysql和PDO擴展應用》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。