明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP中 ADOdb 類庫介紹(一)

[摘要]前言為什么要使用數(shù)據(jù)庫類庫?初學(xué)者 (甚至一些非初學(xué)者)常常犯的錯(cuò)誤,就是在開發(fā)應(yīng)用程序的時(shí)候,缺乏對(duì)未來的考慮。假如有一天,你的程序需要使用其它的數(shù)據(jù)庫,難道你還需要重新寫一篇針對(duì)于這個(gè)版本數(shù)據(jù)庫...
前言
為什么要使用數(shù)據(jù)庫類庫?

初學(xué)者 (甚至一些非初學(xué)者)常常犯的錯(cuò)誤,就是在開發(fā)應(yīng)用程序的時(shí)候,缺乏對(duì)未來的考慮。假如有一天,你的程序需要使用其它的數(shù)據(jù)庫,難道你還需要重新寫一篇針對(duì)于這個(gè)版本數(shù)據(jù)庫的程序嗎?這不是不可能發(fā)生的,尤其是當(dāng)目前的數(shù)據(jù)庫可能不適合你當(dāng)前的需要的時(shí)候。 但是當(dāng)你做這一切的時(shí)候 ,你會(huì)發(fā)現(xiàn)絕非你想像的那樣容易:每一個(gè) DBMS 有不同的函數(shù)。舉例來說:在 Mysql 中連接數(shù)據(jù)庫的函數(shù)為 mysql_connect(),而在MSSQL卻是 mssql_connect()。重新查看你所有的代碼,然后修改所有操作數(shù)據(jù)庫的函數(shù)和查詢語法,這絕不是一項(xiàng)簡(jiǎn)單的工作。程序會(huì)經(jīng)常的被捆綁到了錯(cuò)誤的數(shù)據(jù)庫上,以至無法在運(yùn)行時(shí)達(dá)到最優(yōu)性能。數(shù)據(jù)庫類庫就是這樣產(chǎn)生的。它允許你通過同樣的代碼來操作不同的數(shù)據(jù)庫。一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫類庫可以完美的改變這一切。它允許你通過極小的修改,就能轉(zhuǎn)接到其他數(shù)據(jù)庫:無論你要連接什么數(shù)據(jù)庫管理系統(tǒng),只要使用同一個(gè)的函數(shù),和不同的參數(shù)。舉例來說, 在 ADOdb 中,只需簡(jiǎn)單地將 $db = NewADOConnection('access ') 修改為$db = NewADOConnection('mysql'),這樣,你就輕松的把你的程序從 Access 數(shù)據(jù)庫轉(zhuǎn)移到了 Mysql 數(shù)據(jù)庫中。現(xiàn)在網(wǎng)絡(luò)上已經(jīng)有了很多這樣的數(shù)據(jù)庫類庫,比如Pear,PHPlib,我也已經(jīng)在工作中使用它們了,也許你也曾經(jīng)用過。但本文僅將重點(diǎn)放在我所特別關(guān)注的 ADOdb。本文我只簡(jiǎn)要地作一個(gè)介紹,使你能夠馬上運(yùn)用它來開發(fā)你的下一個(gè)項(xiàng)目。以后的文章中我們將會(huì)循序漸進(jìn)的對(duì)它進(jìn)入更深入的了解。

目前,ADOdb 支持的數(shù)據(jù)庫包括 MySQL, PostgreSQL,Interbase,F(xiàn)irebird,Informix,Oracle,MS SQL 7,F(xiàn)oxpro,Access,ADO,Sybase,F(xiàn)rontBase,DB2 和 generic ODBC。

ADOdb 的安裝
安裝 ADOdb 是一件極期容易的事,相信聰明的你一定不會(huì)感到吃力。

首先, 確定你正在運(yùn)行的 PHP 是 4.0.4 版或更新版。 如果不是,我強(qiáng)列建議你升級(jí)!
從 PHP Everywhere 站點(diǎn)下載 .zip 或 .tgz 文件,解壓縮到你所選的路徑下。
這個(gè)路徑不應(yīng)在網(wǎng)頁目錄(WWWTREE,譯者注:如果你的網(wǎng)頁是在/www/下,那么,這個(gè)目錄就不應(yīng)為/www/here)下!雖然ADOdb的包含文件已經(jīng)使用了 .inc.php 的擴(kuò)展名 ,使得服務(wù)器即使是在最糟糕的配置下,也不會(huì)將這些.inc文件通過明文方式在瀏覽器中顯示出來,但是我們向來不提倡將庫函數(shù)文件放在網(wǎng)頁目錄下的行為。然后把下載下來的文件運(yùn)行:tar -zxvf adodb350.tgz 解壓,在Windows下你可以使用一個(gè)你喜歡的解壓軟件來操作,這樣,你會(huì)得到一個(gè) adodb 的目錄其下包括了許多子目錄。

測(cè)試你的安裝
好了,讓我們來測(cè)試一下你的安裝吧。 通過在腳本中添加下列三行代碼來測(cè)試你的安裝是否成功。注意要把代碼中的參數(shù)修改成你自己的。

include("$adodb_path/adodb.inc.php"); // includes the adodb library
$db = NewADOConnection('$database_type'); // A new connection
$db->Connect("$host", "$user", "$password", "$database_name");
現(xiàn)在你已經(jīng)擁有一個(gè)數(shù)據(jù)庫連接對(duì)象 $db 了。 你也可以使用 ADONewConnection 來替換 NewADOConnection —— 這兩個(gè)是同一函數(shù)的不同的名字。 連接的數(shù)據(jù)庫變量 $database_type 需要針對(duì)你的實(shí)際情況改成你所需要的。可以使用以下列表中的一個(gè)(括號(hào)內(nèi)的為描述部分,不要在代碼中使用):

access (Microsoft Access/Jet)
ado (Generic ADO, the base for all the other ADO drivers)
ado_access (Microsoft Access/Jet using ADO)
ado_mssql (Microsoft SQL Server using ADO)
db2 (DB2)
vfp (Microsoft Visual FoxPro)
fbsql (FrontBase)
ibase (Interbase 6 or before)
firebird (Firebird)
informix72 (Informix databases before Informix 7.3)
informix (Informix)
maxsql (MySQL with transaction support)
mssql (Microsoft SQL Server 7)
mssqlpo (Portable mssql driver)
mysql (MySQL without transaction support)
mysqlt (MySQL with transaction support, identical to maxmysql)
oci8 (Oracle 8/9)
oci805 (Oracle 8.0.5)
oci8po (Oracle 8/9 portable driver)
odbc (Generic ODBC, the base for all the other ODBC drivers)
odbc_mssql (MSSQL via ODBC)
odbc_oracle (Oracle via ODBC)
oracle (Oracle 7)
postgres (PostgreSQL)
postgres64 (PostgreSQL 6.4)
postgres7 (PostgreSQL 7, currently identical to postgres )
sqlanywhere (Sybase SQL Anywhere)
sybase (Sybase)
如果你的鏈接代碼出現(xiàn)了錯(cuò)誤的提示,那么你首先要檢查的地方就是在路徑或連接的變量上。在你責(zé)備 ADOdb 之前,請(qǐng)確定你是已經(jīng)正確的使用那些變量。(很多朋友;ㄌ鄷r(shí)間去修正這些顯而易見的錯(cuò)誤。) 如果連接沒有任何錯(cuò)誤提示,那么我們現(xiàn)在已經(jīng)可以在我們的項(xiàng)目中來使用 ADodb 了。

通過你的腳本連接到數(shù)據(jù)庫
把上邊的代碼加入到你的代碼前,讓我們先退一步。我們最好能把上邊的代碼用我們自己的方法來封裝起來。這樣可以使你的程序變得更靈活、更具移植性。如果你直接把上面的代碼插入到你的項(xiàng)目的每個(gè)文件中,如果將來項(xiàng)目的路徑改變了,將會(huì)很容易產(chǎn)生錯(cuò)誤,如果你的密碼改變了,你可能需要對(duì)你所有的腳本進(jìn)行修改,這樣將會(huì)影響我們使用庫函數(shù)的初衷。并且,因?yàn)槟愕拿艽a信息是在WEBTREE下的,這將產(chǎn)生隱患。我推薦將密碼信息放在一個(gè)獨(dú)立的包含文件中,比如在 ADOdb 安裝目錄下的某個(gè)地方。如果你要在其他服務(wù)器上運(yùn)行你的程序時(shí),你就不能保證目錄結(jié)構(gòu)會(huì)是相同的,所以,你要確保這個(gè)路徑是正確的。我建議使用PHP 的自動(dòng)包含功能來自動(dòng)地包含這個(gè)文件。


include("$adodb_path/db_values.inc.php");
include("$adodb_path/adodb.inc.php");
$db = NewADOConnection('$database_type');
$db->Connect("$host", "$user", "$password", "employees");

如果你也想要使用持久連接, 不是每次創(chuàng)造一個(gè)新的連接(這使許多WEB應(yīng)用程序得到了加速,但是要注意有些數(shù)據(jù)庫是不支持的)?梢允褂 PConnect 替換掉 Connect。
文件 db_values.inc.php 是我們的數(shù)據(jù)庫信息文件,內(nèi)容為(你需要把下面代碼中的變量改成你自己的):

<?php
$database_type="mysql";
$host = "localhost"; // 本地?cái)?shù)據(jù)庫
$user = "ian"
$password = "let_me_in"
?>

你可以在 php.ini 配置中設(shè)定自動(dòng)包含我們的配置文件,具體操作可以修改 PHP.ini 的下述行:

; Automatically add files before or after any PHP document.
auto_prepend_file = /usr/local/build/apache/www/tool_lib/defaults.inc
auto_append_file =


文件 defaults.inc 包含了 $adbdb_path 的值:

<?
$adodb_path = "/usr/local/build/apache/www/tool_lib/";
?>

還有其他方式來實(shí)現(xiàn)它,但是我發(fā)現(xiàn)這種方法在移植時(shí),可以相對(duì)地減少復(fù)雜度。


從一個(gè)數(shù)據(jù)庫中進(jìn)行選擇(SELECT)操作
當(dāng)同時(shí)使用開發(fā)良好的庫函數(shù),和PHP自身提供的函數(shù)時(shí),可以有多種方法來訪問數(shù)據(jù)庫。用什么方法,完全取決于你自己的喜好。
這里是一個(gè)簡(jiǎn)單的例子:

$sql = "SELECT surname, age FROM employees";
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg(); // Displays the error message if no results could be returned
}
else {
while (!$rs->EOF) {
print $rs->fields[0].' '.$rs->fields[1].'<BR>';
// fields[0] is surname, fields[1] is age
$rs->MoveNext(); // Moves to the next row
}
}


在上例中,$rs->fields 是一個(gè)包含返回值的數(shù)組。數(shù)組索引被賦予了初始的數(shù)字,你也可以按下面的方法來指定其索引:

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg(); // Displays the error message if no results could be returned
}
else {
while (!$rs->EOF) {
print $rs->fields['surname']." ".$rs->fields['age']."<BR>";
$rs->MoveNext(); // Moves to the next row
} // end while
} // end else


對(duì)結(jié)果瀏覽的另一個(gè)可選的方法是將每條記錄作為一個(gè)對(duì)象返回。 ADOdb 有一個(gè) FetchNextObject() 的函數(shù)來實(shí)現(xiàn)這一功能,指針會(huì)自動(dòng)地移到下一條記錄。

$sql = "SELECT surname, age FROM employees";
$db->SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array
$rs = &$db->Execute($sql);
if (!$rs) {
print $db->ErrorMsg(); // Displays the error message if no results could be returned
}
// loop through results
while ($row = $rs->FetchNextObject()) {
// The field names need to be uppercase
print $row->SURNAME." ".$row->AGE."<BR>";
}


插入、更新記錄
基本的 INSERT 操作方便、快捷, 擁有與SELECT一樣的語法。

$sql = "INSERT INTO employees (surname, age) values ('Clegg','43')";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'<BR>';
}


庫函數(shù)真正的優(yōu)點(diǎn),在于它允許你通過相同的語法將記錄放入不同的數(shù)據(jù)庫之內(nèi),這在以前是絕對(duì)不可能的。通常有兩種發(fā)生的情形。

第一種,引號(hào)。所有的引號(hào)需要用脫字符(即`符號(hào),鍵位在Tab鍵的上邊)代替,否則會(huì)引起語法錯(cuò)誤。但是一些數(shù)據(jù)庫使用一個(gè)單引號(hào),另外一些則使用兩個(gè)單引號(hào)。所以,你應(yīng)當(dāng)使用 ADOdb 中的 qstr() 而不是 PHP 中的 addslashes()。這樣,返回值就將與你所使用的數(shù)據(jù)庫相吻合了。

第二種,日期。許多數(shù)據(jù)庫接受跟他們的日期類型不一致的、不兼容的格式。 ADOdb 有一個(gè) DBDate() 函數(shù),可以將 Unix 的 timestamp, 或 ISO(Y-m-d) 格式轉(zhuǎn)換成任意格式,以此來滿足你的數(shù)據(jù)庫的需求。 見下例:

$employee_surname = $db->qstr("d'Angelo");
$arrival_time = $db->DBDate(time());
// The above two functions also add the enclosing quotes, so, $arrival_time, not '$arrival_time'
$sql = "INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)";
if (!($db->Execute($sql))) {
print 'Error inserting: '.$db->ErrorMsg().'<BR>';
}

你可以以完全相同的方式更新數(shù)據(jù)庫,舉例來說:

$sql = "UPDATE employees SET age='44' WHERE id='121')";
if (!($db->Execute($sql))) {
print 'Error updating: '.$db->ErrorMsg().'<BR>';
}

以上僅僅是 Adodb 的一些基本操作 —— 下次我們將會(huì)關(guān)注一些 ADOdb 提供的比較深層次的東西。 如果我已經(jīng)使你胃口大開,而且你已經(jīng)不能再等待, 我建議你去PHP Everywhere看一下,這個(gè)站點(diǎn)是ADOdb的專業(yè)站點(diǎn),里面有很多有用的幫助信息。

本文原文地址: http://www.databasejournal.com/features/php/article.php/2222651