雖然 PHP 是建構 Web 系統強而有力的工具,但是 PHP 訪問資料庫的功能,一直未能標準化,每一種資料庫,都使用另一種不同且不相容的應用程式介面(API)。為了填補這個缺憾,因此才有 ADODB 的出現。一旦存取資料庫的介面加以標準化,就能隱藏各種資料庫的差異,若欲轉換至其它不同的資料庫,將變得十分容易。
目前ADODB最新版本是V4.62,支援的資料庫種類非常多,例如:MySQL, PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的ODBC (其中PostgreSQL、Informix、Sybase 的driver 是由自由軟體社群發展之後貢獻出來的)。
使用ADODB 最大的優點之一是:不管後端資料庫如何,存取資料庫的方式都是一致的,開發設計人員不必為了某一套資料庫,而必須再學習另一套不同的存取方法,這大大減輕開發人員的知識負擔,過去的知識往後仍可繼續使用,轉移資料庫平台時,程式碼也不必做太大的更動。
其實 ADODB 這樣的發展理念,並不是首創的,DBI 比 ADODB 出現得更早,它提供 Perl 訪問資料庫時,使用一致的 API 呼叫介面。相信用過 Perl + DBI 的朋友,再來用 ADODB 時,會有一種似曾相識的感覺。
另外,ADODB 對用過 ASP 的人而言,應該不陌生,這類朋友對 ADODB 應該很容易接受。
Adodb官方:http://adodb.sourceforge.net/
PHP可以用最少的精力以及最多的樂趣來建立動態的網站,要建立動態網站我們需要使用資料庫來擷取登錄帳號資訊、發布動態新聞、儲存討論區的文章。 就以使用最通用的 MySQL 資料來說,你們公司已經完成瞭如此神奇的工作,讓你們的網站比你們所能想像的還要出名。接著你們也發現MySQL無法應付實際的工作量了,是該更換資料庫 系統的時候了。
不幸地,在PHP中所有資料庫的存取都有些細微的不同。與MySQL連結你要使用 mysql_connect(),當你決定升級到 Oracle 或 Microsoft SQL Server 時,你必須分別改用 ocilogon() 或 mssql_connect()。更糟的是不同連結所使用的參數也都不一樣,有的資料庫說po-tato(馬鈴薯的發音),別的資料庫又說pota-to(馬鈴薯的另一個發音),喔…..天啊。
我們不要放棄
當你需要確保你程式的可移植性的時候,一個叫做 ADODB 的資料庫封包連結庫已經出現了。它提供了共通的應用程式介面來跟所有支援的資料庫溝通,因此你無須放棄!
ADODB是Active Data Object DataBase的縮寫(很抱歉!玩電腦的有時候不是很有原創性)。 ADODB目前支援MySQL、PostgreSQL、Oracle、 Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以從 http://php.weblogs.com/adodb下載 ADODB。
MySQL的範例
PHP中最通用的資料庫是MySQL,所以我想你會喜歡下面的程式碼,它連結到localhost 的MySQL 伺服器,資料庫名稱是mydab,並且執行一個SQL 的select 指令查詢,查詢結果會一列列地印出來。
$db = mysql_connect("localhost", "root", "password");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM loy loyees",$ db);
if ($result === false) die("failed");
while ($fields = mysql_fetch_row($result)) {
for ($i=0, $max= sizeof($fields); $i print $fields[$i].' ';
}
print "
n";
}
上列的程式碼以顏色標示分段,第一段是連結的部分,第二段是執行SQL指令,最後一段則是顯示字段,while循環掃描結果的每一列,而for迴圈掃描到每列的欄位。
接下來是以ADODB的程式碼得到相同的結果:
include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db-> Connect("localhost", "root", "password", "mydb");
$result = $db->Execute("SELECT * FROM employees");
if ($result === false ) die("failed");
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i print $result->fields[$i].' ';
$result->MoveNext();
print "
n";
}
現在改成指向Oracle資料庫,程式碼只要修改第二行成為NewADOConnection('oracle'),讓我們來看看完整的程式碼...
與資料庫連結
include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");
連結的程式碼比起原來MySQL的程式碼有老練一些,因為我們正是需要更老練些。在ADODB我們使用物件導向的方法來管理多元資料庫的複雜 性,我們用不同類別(class)來控制不同資料庫。假如你不熟悉物件導向程式設計,別擔心!所有的複雜事情都隱藏在 NewADOConnection() 函數之後。
為了節省內存,我們只載入與你所連結資料庫相關的PHP程式碼,我們透過呼叫NewADOConnection(databasedriver) 來完成這件事,合法的資料庫驅動程式包含mysql,mssql,oracle,oci8,postgres, sybase,vfp,access,ibase 以及許多其它的驅動程式。
接著我們透過呼叫 NewADOConnection() 來從連結類別產生一個新的物件實體,最後我們使用 $db->Connect() 來連結資料庫。
執行SQL指令
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
直接傳送SQL指令到伺服器,當成功執行之後,Execute()將傳回recordset對象,你可以如同上面所列來檢查$result。
一個初學者容易混淆的議題是,在ADODB有兩種類型的對象,連結對像以及recordset對象,我們何時用這些對象呢?
連結物件($db)是負責連結資料庫,格式化你的SQL查詢。而recordset物件($result)則是負責擷取結果並將回應資料規格化成文字或陣列。
唯一我需要增加的是,ADODB提供許多有用的函數來讓INSERT及UPDATE指令更容易些,這點我們在進階的章節會提到。
擷取資料
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i print $result->fields[$i].' ';
$result->MoveNext();
print "
n";
}
前面取得資料的範例很像從檔案讀數據,在每一行我們首先檢查是否到了檔案的結尾(EOF),若還沒到結尾,循環掃過每列中的字段,然後移到下一行(MoveNext)接著重複同樣的事情。
$result->fields[]數組是由PHP資料庫延伸系統所產生的,有些資料庫延伸系統並不會以欄位名稱建立該數組的索引,要強迫以名稱排序索引該數組,使用$ADODB_FETCH_MODE的通用變數。
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$2 * from table');
print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')
print_r($rs2-> fields); // shows array(['col1']=>'v0',['col2'] =>'v1')
如同你所見的上面例子,兩個recordset儲存並使用不同的取用模式,當recordset由Execute()產生後再設定$ADODB_FETCH_MODE。
ADOConnection
連結到資料庫的對象,執行SQL指令並且有一組工具函數來標準格式化SQL指令,例如關聯與日期格式等指令。
其它有用的函數
$recordset->Move($pos)捲動目前的資料列,ADODB支援整個資料庫往前捲動,有一些資料庫並不支援往後的捲動,這倒不會是個問題,因為你能夠用暫存紀錄到緩存來模擬往後捲動。
$recordset->RecordCount()傳回SQL指令所存取的紀錄筆數,有些資料庫會因為不支援而傳回-1。
$recordset->GetArray()以陣列的方式傳回結果。
rs2html($recordset)函數將傳進的recordset轉為HTML的表格格式。下例以粗體字顯示相關用法:
include('adodb.inc.php');
include('tohtml.inc.php'); /* includes the rs2html function */
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->Execute('select * from table');
rs2html($rs); /* recordset to html table */
還有許多其它有用的函數列示在文件之中,可從下列網址查得http:// php.weblogs.com/adodb_manual
進階題材
新增及更新
假設你要新增下列資料到資料庫。
ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off
當🎜>當🎜>當🎜>當🎜>當🎜>當🎜>當你改用別的資料庫,可能就沒辦法新增資料。 第一個問題是,每個資料庫各自有不同的內定日期格式,MySQL使用YYYY-MM-DD 格式,而其它資料庫則有不同的內定格式,ADODB提供DBDate()函數來轉換不同資料庫之間的日期內定格式。 次一個問題是單引號(don't)的表示法,在MySQL可以直接使用單引號(don't),但在其它資料庫如Sybase、Access、 Microsoft SQL Server,則用兩個單引號表示(don''t),qstr()函數可以解決此問題。
我們如何使用這些函數?如此:
$sql = "INSERT INTO table (id, thedate,note) values ("
. $ID . ','
. $db->DBDate($TheDate) .', '
. $db->qstr($Note).")";
$db->Execute($sql);
ADODB還有$connection->Affected_Rows()函數,傳回受最後update或delete指令影響的資料列數, 及$recordset->Insert_ID()函數,傳回最後因insert指令而自動產生的資料列編號,預先提醒大家,沒有任何資料庫有提供這兩個函數。
MetaTypes
你可以得到關於字段的更多信息,透過recordset的方法FetchField($fieldoffset)傳回對象的3個屬性:name,type,max_length。
舉例說明:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
結果$f0->name的內容是'adata',$f0->type將是'date',假如max_length不知道,其內容將會是-1。
處理不同資料庫的一個問題是,每個資料庫對於相同的資料型態會有不同的稱呼,例如timestamp型態在某資料庫稱為datetime,而另一個資料庫稱為time,所以ADODB提供MetaType($type,$max_length)函數來標準化下列的資料型態:
C: character and varchar types
X: text or long character (eg. more than 255 bytes wide).
B: blob or binary image
D: date
T: timestamp
L: logical (boolean)
I: integer
N: numeric (float, double, money)
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
$type = $recordset->MetaType( $f0->type, $f0->max_length);
print $type; /* should print 'D' */
Select指令的Limit及Top支援
ADODB有個$connection->SelectLimit ($sql,$nrows,$offset)函數讓你擷取recordset的部分集合,這是採用Microsoft產品中的SELECT TOP用法,及PostgreSQL與MySQL中的SELECT...LIMIT用法的優點,即使原來的資料庫並沒有提供此用法,本函數也模擬提供此使用方式。
快取支援
ADODB允許你在你的檔案系統中暫存recordset的數據,並且在$connection->CacheExecute($ secs2cache,$sql)及$connection->CacheSelectLimit($secs2cache,$secs2cache,$sql ,$nrows,$offset)等設定的時間間隔到達之後,才真正去做資料庫的查詢以節省時間。
PHP4 Session支援
ADODB也支援PHP4 session handler,你可以存放你的session變數在資料庫中,相關功能請參考http://php.weblogs.com/adodb-sessions
鼓勵商業使用
假如你打算寫商用的PHP應用軟體來銷售,你也可以使用ADODB,我們依據GPL來出版ADODB,也就是說你可以合法地在商用應用軟體中引用,並保有你程式碼的所有權。強烈鼓勵ADODB的商業應用,我們自己內部也正以此理由如此使用中。
以上就介紹了adodb.recordset php adodb介紹,包含了adodb.recordset方面的內容,希望對PHP教學有興趣的朋友有幫助。