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