色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

ADODB的數(shù)據(jù)庫(kù)封包程序庫(kù)

php可以用最少的功夫以及最多的樂趣來(lái)建立動(dòng)態(tài)的網(wǎng)站,要建立動(dòng)態(tài)網(wǎng)站我們需要使用數(shù)據(jù)庫(kù)來(lái)擷取登入帳號(hào)資訊、散布動(dòng)態(tài)新聞、儲(chǔ)存討論區(qū)的文章。就以使用最通用的MySQL資料來(lái)說(shuō),你們公司已經(jīng)完成了如此神奇的工作,讓你們的網(wǎng)站比你們所能想像的還要出名。接著你們也發(fā)現(xiàn)MySQL無(wú)法應(yīng)付實(shí)際的工作量了,是該更換數(shù)據(jù)庫(kù)系統(tǒng)的時(shí)候了。

不幸地,在php中所有數(shù)據(jù)庫(kù)的存取都有些微的不同。與MySQL連結(jié)你要使用 mysql_connect(),當(dāng)你決定升級(jí)到Oracle或Microsoft SQL Server時(shí),你必須分別改用ocilogon() 或 mssql_connect()。更糟糕的是不同連結(jié)所使用的參數(shù)也都不一樣,有的數(shù)據(jù)庫(kù)說(shuō)po-tato(馬鈴薯的發(fā)音),別的數(shù)據(jù)庫(kù)又說(shuō)pota-to(馬鈴薯的另一個(gè)發(fā)音),喔…..天啊。

我們不要放棄
當(dāng)你需要確保你程式的可攜性的時(shí)候,一個(gè)叫做ADODB的數(shù)據(jù)庫(kù)封包程序庫(kù)已經(jīng)出現(xiàn)了。它提供了共通的應(yīng)用程序介面來(lái)跟所有支援的數(shù)據(jù)庫(kù)溝通,因此你無(wú)須放棄!

ADODB是Active Data Object DataBase的縮寫(很抱歉!玩電腦的有時(shí)候不是很有原創(chuàng)性)。ADODB目前支援MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以從 http://php.weblogs.com/adodb下載 ADODB。

MySQL的例子
php中最通用的數(shù)據(jù)庫(kù)是MySQL,所以我想你會(huì)喜歡下面的程序代碼,它連結(jié)到localhost的MySQL服務(wù)器,數(shù)據(jù)庫(kù)名稱是mydab,并且執(zhí)行一個(gè)SQL的select命令查詢,查詢結(jié)果會(huì)一列列地印出來(lái)。

$db = mysql_connect("localhost", "root", "password");mysql_select_db("mydb",$db);$result = mysql_query("SELECT * FROM employees",$db);if ($result === false) die("failed"); while ($fields = mysql_fetch_row($result)) { for ($i=0, $max=sizeof($fields); $i < $max; $i++) {    print $fields[$i].' '; } print "<br>n";} 

上列的程序代碼用顏色標(biāo)出分段,第一段是連結(jié)的部分,第二段是執(zhí)行SQL命令,最後一段則是顯示欄位,while回圈掃描結(jié)果的每一列,而for回圈掃描到每列的欄位。

接下來(lái)是以ADODB的程序代碼得到同樣的結(jié)果:

 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 < $max; $i++)      print $result->fields[$i].' ';  $result->MoveNext();  print "<br>n"; } 

現(xiàn)在改成指向Oracle數(shù)據(jù)庫(kù),程序代碼只要修改第二行成為 NewADOConnection('oracle'),讓我們看一下完整的程序代碼...

與數(shù)據(jù)庫(kù)連結(jié)

include("adodb.inc.php");$db = NewADOConnection('mysql');$db->Connect("localhost", "root", "password", "mydb");

連結(jié)的程序代碼比起原來(lái)MySQL的程序代碼有老練一些,因?yàn)槲覀冋切枰暇毿T贏DODB我們使用面向?qū)ο蟮姆椒▉?lái)管理多樣數(shù)據(jù)庫(kù)的復(fù)雜性,我們用不同類型(class)來(lái)控制不同數(shù)據(jù)庫(kù)。假如你不熟悉面向?qū)ο蟪淌皆O(shè)計(jì),別擔(dān)心!所有的復(fù)雜事情都隱藏在NewADOConnection()函數(shù)之後。

為了節(jié)省記憶體,我們只載入與你所連結(jié)數(shù)據(jù)庫(kù)相關(guān)的php程序代碼,我們透過(guò)呼叫NewADOConnection(databasedriver)來(lái)完成這件事,合法的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程式包含mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase以及許多其他的驅(qū)動(dòng)程式。

接著我們透過(guò)呼叫NewADOConnection(),來(lái)從連結(jié)類型產(chǎn)生一個(gè)新的物件實(shí)體,最後我們使用$db->Connect()來(lái)連結(jié)數(shù)據(jù)庫(kù)。

執(zhí)行SQL命令

$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");

直接傳送SQL命令到服務(wù)器,當(dāng)成功執(zhí)行之後,Execute()將傳回一個(gè)recordset物件,你可以如同上面所列來(lái)檢查$result。

一個(gè)初學(xué)者容易混淆的議題是,在ADODB有兩種類型的物件,連結(jié)物件以及recordset物件,我們何時(shí)用這些物件呢?

連結(jié)物件($db)是負(fù)責(zé)連結(jié)數(shù)據(jù)庫(kù),格式化你的SQL查詢。而recordset物件($result)則是負(fù)責(zé)擷取結(jié)果并將回應(yīng)資料規(guī)格化成文字或陣列。

唯一我需要增加的事情是,ADODB提供許多有用的函數(shù)來(lái)讓INSERT及UPDATE命令更容易些,這點(diǎn)我們?cè)谶M(jìn)階的章節(jié)會(huì)提到。

擷取資料

while (!$result->EOF) {  for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)    print $result->fields[$i].' ';  $result->MoveNext();  print "<br>n";}

前面取得資料的范例很像從檔案讀資料,在每一行我們首先檢查是否到了檔案的結(jié)尾(EOF),若還沒到結(jié)尾,回圈掃過(guò)每列中的欄位,然後移到下一行(MoveNext)接著重復(fù)同樣的事情。

$result->fields[]陣列是由php數(shù)據(jù)庫(kù)延伸系統(tǒng)所產(chǎn)生的,有些數(shù)據(jù)庫(kù)延伸系統(tǒng)并不會(huì)以欄位名稱建立該陣列的索引,要強(qiáng)迫以名稱排序索引該陣列,使用$ADODB_FETCH_MODE的通用變數(shù)。

	$ADODB_FETCH_MODE = ADODB_FETCH_NUM;	$rs1 = $db->Execute('select * from table');	$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;	$rs2 = $db->Execute('select * from table');	print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')	print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')

如同你所見的上面例子,兩個(gè)recordset儲(chǔ)存并使用不同的取用模式,當(dāng)recordset由Execute()產(chǎn)生後再設(shè)定$ADODB_FETCH_MODE。

ADOConnection

連結(jié)到數(shù)據(jù)庫(kù)的物件,執(zhí)行SQL命令并且有一組工具函數(shù)來(lái)標(biāo)準(zhǔn)格式化SQL命令,比如關(guān)聯(lián)與日期格式等命令。

其他有用的函數(shù)

$recordset->Move($pos)卷動(dòng)目前的資料列,ADODB支援整個(gè)數(shù)據(jù)庫(kù)往前卷動(dòng),有一些數(shù)據(jù)庫(kù)并不支援往後的卷動(dòng),這倒不會(huì)是個(gè)問題,因?yàn)槟隳軌蛴脮捍婕o(jì)錄到快取來(lái)模擬往後卷動(dòng)。

$recordset->RecordCount()傳回SQL命令存取到的紀(jì)錄筆數(shù),有些數(shù)據(jù)庫(kù)會(huì)因?yàn)椴恢г鴤骰?1。

$recordset->GetArray()以陣列的方式傳回結(jié)果。

rs2html($recordset)函數(shù)將傳進(jìn)的recordset轉(zhuǎn)為HTML的表格格式。下例中以粗體字顯示相關(guān)用法:

  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 */ 

還有許多其他有用的函數(shù)列示在文件之中,可從下列網(wǎng)址查得 http://php.weblogs.com/adodb_manual

進(jìn)階題材

新增及更新

假設(shè)你要新增下列資料到數(shù)據(jù)庫(kù)中。

ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off

當(dāng)你改用別的數(shù)據(jù)庫(kù),可能就沒辦法新增資料。

第一個(gè)問題是,每一個(gè)數(shù)據(jù)庫(kù)各自有不同的內(nèi)定日期格式,MySQL使用 YYYY-MM-DD 格式,而其他數(shù)據(jù)庫(kù)則有不同的內(nèi)定格式,ADODB提供DBDate()函數(shù)來(lái)轉(zhuǎn)換不同數(shù)據(jù)庫(kù)之間的日期內(nèi)定格式。

次一個(gè)問題是單引號(hào)(don't)的表示法,在MySQL可以直接使用單引號(hào)(don't),但在其他數(shù)據(jù)庫(kù)如Sybase、Access、 Microsoft SQL Server,則用兩個(gè)單引號(hào)表示(don''t),qstr()函數(shù)可以解決此問題。

我們?nèi)绾问褂眠@些函數(shù)?就像這樣:

$sql = "INSERT INTO table (id, thedate,note) values ("   . $ID . ','  . $db->DBDate($TheDate) .','  . $db->qstr($Note).")";$db->Execute($sql);

ADODB還有$connection->Affected_Rows()函數(shù),傳回受最後update或delete命令影響的資料列數(shù),及$recordset->Insert_ID()函數(shù),傳回最後因insert命令而自動(dòng)產(chǎn)生的資料列編號(hào),預(yù)先提醒大家,沒有任何數(shù)據(jù)庫(kù)有提供這兩個(gè)函數(shù)。

MetaTypes

你可以得到關(guān)於欄位的更多資訊,透過(guò)recordset的方法FetchField($fieldoffset)傳回物件的3個(gè)屬性:name,type,max_length。

舉例說(shuō)明:

$recordset = $conn->Execute("select adate from table");$f0 = $recordset->FetchField(0);

結(jié)果$f0->name的內(nèi)容是'adata',$f0->type將是'date',假如max_length不知道,其內(nèi)容將會(huì)是-1。

處理不同數(shù)據(jù)庫(kù)的一個(gè)問題是,每一個(gè)數(shù)據(jù)庫(kù)對(duì)於相同的資料型態(tài)會(huì)有不同的稱呼,比如timestamp型態(tài)在某數(shù)據(jù)庫(kù)中稱為datetime,而另一個(gè)數(shù)據(jù)庫(kù)則稱為time,所以ADODB提供MetaType($type,$max_length)函數(shù)來(lái)標(biāo)準(zhǔn)化下列的資料型態(tài):

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有個(gè)$connection->SelectLimit($sql,$nrows,$offset)函數(shù)讓你擷取recordset的部分集合,這是采用Microsoft產(chǎn)品中的SELECT TOP用法,及PostgreSQL與MySQL中的SELECT...LIMIT用法的優(yōu)點(diǎn),即使原來(lái)的數(shù)據(jù)庫(kù)并沒有提供此用法,本函數(shù)也模擬提供該使用方式。

快取支援

ADODB允許你在你的檔案系統(tǒng)中暫存recordset的資料,并且在$connection->CacheExecute($secs2cache,$sql)及 $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等設(shè)定的時(shí)間間隔到達(dá)之後,才真正去做數(shù)據(jù)庫(kù)的查詢以節(jié)省時(shí)間。

php4 Session支援

ADODB也支援php4 session handler,你可以存放你的session變數(shù)在數(shù)據(jù)庫(kù)中,相關(guān)功能訊息請(qǐng)參考 http://php.weblogs.com/adodb-sessions

鼓勵(lì)商業(yè)使用

假如你計(jì)劃寫商用的php應(yīng)用軟體來(lái)銷售,你也可以使用ADODB,我們依據(jù)GPL來(lái)出版ADODB,也就是說(shuō)你可以合法地在商用應(yīng)用軟體中引用,并保有你程序代碼的所有權(quán)。強(qiáng)烈地鼓勵(lì)A(yù)DODB的商業(yè)應(yīng)用,我們自己內(nèi)部也正以這個(gè)理由如此使用中。

php技術(shù)ADODB的數(shù)據(jù)庫(kù)封包程序庫(kù),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 大洼县| 民勤县| 淄博市| 皋兰县| 广汉市| 锡林浩特市| 海宁市| 宜州市| 宁夏| 婺源县| 贵州省| 安溪县| 濉溪县| 南城县| 博野县| 德化县| 原阳县| 永康市| 海伦市| 营山县| 册亨县| 卢湾区| 孟州市| 高青县| 丹东市| 宁明县| 洞口县| 越西县| 萨迦县| 武隆县| 东兰县| 西宁市| 静宁县| 固镇县| 沅陵县| 宜城市| 泗水县| 忻城县| 博爱县| 正镶白旗| 宿州市|