一、什麼是DB類 我們首先簡單地了解一下DB類。DB類是PEAR中進行數據操作的幾個類的集合,它的主要目的是提供一個統一的,抽象的數據接口,這個接口與後端的數據庫是無關的。因此,如果你的應用程序使用這個通用的接口來進行數據庫的操作,那麼就能夠平滑地切換到不同的數據庫下面,如mysql,SQL,SYBASE等等。實際上,DB類希望能夠起到簡單的類似ODBC或者是PERL中的DBI的作用。說到這裡,不得不提一下PHP中的另一個優秀的庫:ADODB。ADODB也和DB一樣,提供了一個抽象的中間層,而且ADODB所支持的後端數據庫要比DB多(至少目前如此),不過ADODB沒有直接使用PEAR的一些特性,只是吸取了PEAR的許多思想,包括DB,因此二者的使用方法有許多相似的地方。我不想評論二者孰優孰劣,大家可以根據個人的喜好來使用。
二、為什麼要設計抽象的中間數據層 在詳細討論DB的使用之前,我們先討論一下為什麼要設計中間的數據層,因為這意味著你需要作出一些犧牲和讓步,比如,你需要多寫一些代碼,有的局限於特定數據庫的特性將無法直接使用。 我們回憶一下我們過去的做法,如何連接到MYSQL數據庫?這的確是個小兒科的問題,下面的代碼你一定很熟悉: 好了,現在建立了數據庫連接,我們可以使用它來進行數據庫的操作,我們可能使用類似的代碼: 看起來很不錯,是嗎?你可能在你的代碼裡使用很多類似的代碼片段。但是,不要太高興,問題來了。假如,突然,你的數據庫需要從MYSQL遷移到別的數據庫平台,比如Oracle,SYBASE。遷移的原因很多,也許是你的老板突發奇想,認為這樣能賣個好價錢,或者是你的數據猛增,導致MYSQL的性能下降,總之,遷移是事在必行了。你怎麼做,你也許會想,呵呵,這簡單,把相關的函數替換一下不就行了。 聽起來簡單,但是……首先,連接數據庫的函數要改,需要把mysql_connect和mysql_pconnect替換成OCILogon和OCIPLogon。mysql_errno和mysql_error()當然不能使用,你需要從OCIError()返回的數組中提取響應的信息。 這還不是太糟,最糟的是相關的mysql_fetch_row,mysql_fetch_array等語句遍布於你的許多代碼函數和過程中,你需要逐一查找,分析,然後重新替換或者編寫相應的ORACLE的版本。如果,你的數據庫操作是集中在一個某一個模塊或類中,這項工作還可以接受,否則,等於你重新閱讀和修改了絕大部分的代碼。即使這個不幸的人不是你,那麼他也會暗地裡詛咒你的;=) 以上,我們回憶了我們以前的做法,以及可能帶來的不幸。那麼,如果使用DB類來做類似的操作,應該是什麼樣的呢?下面是相應的DB版本代碼: 除了連接數據庫部分,其他的看起來只是有一些微小的變化,出錯處理使用的是PEAR類似的方式(isError),實際上也是從PEAR繼承來的。同樣的情況,如果你要把數據庫從mysql遷移到別的形式,這次假如說是PostegreSQL,一個Linux中很優秀的數據庫,你所做的只是改變一行代碼: $db_type ="mysql"; 變成: $db_type ="pgsql"; 其他的,不用變動。怎麼樣,升級的感覺是不是很清爽呢,你可以用剩下的時間好好研讀其余的代碼,或者和我繼續往下討論DB的使用方法。
三、 DB的使用入門 DB類由3部分組成: DB.php 這是前端接口,在DB類裡提供了許多"靜態"的公用方法,我們一般只需要INCLUDE_ONCE這個文件就可以了。 DB/common.php 這是後端數據庫的通用抽象類,不同的數據庫的後端類需要繼承並實現這個類中定義的公用方法和屬性,如果你的數據庫不被支持,你可以自己編寫一個支持類,這樣,你的應用程序就可以遷移過來了。 DB/storage.php 這是一個輔助的工具,它可以把SQL查詢做為對象返回,同時能夠維護這些對象,在對象改變的時候,相應地更新數據庫。 DB/ifx.php MSSQL.php MS SQL Server支持類 oci8.php Orcale 8i支持類 pgsql.php PostegreSQL支持類 sybase.php Sybase支持類 ibase.php ibase支持類 msql.php mSQL 支持類 mysql.php mysql支持類 odbc.php odbc 支持類 這些是相應後端數據庫的支持類了。相應具體的數據庫的操作是由這些支持類來實現的。 下面,我們首先詳細介紹DB.PHP中的一些"靜態"方法: connect()方法 這個方法是最重要的靜態方法了,我們通過得到一個DB_COMMON對象,並且連接到相應的數據庫。這個方法的原型如下: function &connect($dsn, $options = false) $dsn是數據源名稱(data source name)的縮寫,可以是字符串,或者是特定的數組形式。 一般來說,$dsn是一個字符串,它的格式如下: phptype(dbsyntax)://username:passWord@protocol+hostspec/database * phptype: php後端數據庫的類型名稱(如mysql, odbc 等等.) * dbsyntax: 數據庫所使用的SQL語法標准,一般不用。 * protocol: 使用的通訊協議。(如tcp, unix 等等.) * hostspec: 數據庫所在的主機的描述。(形式是:主機名[:端口號]) * database: 數據庫的名稱。 * username: 登陸的用戶名。 * password: 登陸的密碼。 對於DSN,常用的形式如下: * phptype://username:password@protocol+hostspec:110//usr/db_file.db * phptype://username:password@hostspec/database_name * phptype://username:password@hostspec * phptype://username@hostspec * phptype://hostspec/database * phptype://hostspec * phptype(dbsyntax) * phptype 對於省略的部分,將使用缺省值。 當然,$dsn也可以是一個數組,數組的形式如下: $dsn = array( 'phptype' => 'mysql', 'dbsyntax' => '', 'protocol' => '', 'hostspec' => 'localhost', 'database' => 'test', 'username' => 'root', 'password' => '' ) $options 是數據庫的選項,混合型。如果是布爾型,那麼一般來說,這個參數指明是否使用持久性連接(persistent connect),如果後端數據庫支持,當$options是TRUE的時候,將使用持久性連接。如果是數組,那麼表示這是特定的後端數據庫的選項,這些選項將傳遞到DB_common類中的set_option方法中,後端數據庫通過實現或重載這個方法,可以自己決定如何使用這些選項。 isError($value) 這個方法用來判斷DB的一些方法返回的結果是否是一個錯誤對象,你可以使用這個方法來判定某個操作的結果是否是拋出了異常。 當然,如果你的應用程序從是PEAR繼承的,也可以直接使用PEAR的isError來判斷,尤其是當你的程序中拋出的異常的可能是數據庫以外的異常的時候,這個方法只能判斷是否是DB_Errro對象,其他的PEAR_Err