一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ADODB的數據庫封包程序庫

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 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";} 

上列的程序代碼用顏色標出分段,第一段是連結的部分,第二段是執行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 < $max; $i++)      print $result->fields[$i].' ';  $result->MoveNext();  print "<br>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 < $max; $i++)    print $result->fields[$i].' ';  $result->MoveNext();  print "<br>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;	$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')

如同你所見的上面例子,兩個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,$sql,$nrows,$offset)等設定的時間間隔到達之後,才真正去做數據庫的查詢以節省時間。

php4 Session支援

ADODB也支援php4 session handler,你可以存放你的session變數在數據庫中,相關功能訊息請參考 http://php.weblogs.com/adodb-sessions

鼓勵商業使用

假如你計劃寫商用的php應用軟體來銷售,你也可以使用ADODB,我們依據GPL來出版ADODB,也就是說你可以合法地在商用應用軟體中引用,并保有你程序代碼的所有權。強烈地鼓勵ADODB的商業應用,我們自己內部也正以這個理由如此使用中。

php技術ADODB的數據庫封包程序庫,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 六月丁香婷婷网 | 国产精品中文 | 最近中文字幕完先锋资源 | 黑人和黑人激情一级毛片 | 精品欧美一区二区三区在线观看 | 精品区 | 国产自在线 | 99精品视频一区在线视频免费观看 | 97在线播放视频 | 激情综合网址 | 成人免费xxx在线观看 | 婷婷在线视频 | 另类图片综合网 | 韩国在线观看一区二区三区 | 欧美视频久久久 | 国产啪在线91 | 日本欧美强乱视频在线 | 日韩一区二区三区视频 | 欧美激情性色生活片在线观看 | www.亚洲视频 | 色婷婷在线视频 | 色偷偷7777www人 | 成人三级视频 | 99免费在线观看视频 | 午夜在线日韩免费精品福利 | 一区二区三区影院 | 91麻豆国产精品91久久久 | 久久伊人中文字幕 | 国产三级国产精品国产普男人 | 精品午夜久久福利大片免费 | 欧美另类丰满69xxxxx | 国产精品第一页在线观看 | 高清不卡免费一区二区三区 | 91精品免费高清在线 | 亚洲 欧美 在线观看 | 亚洲第一区在线观看 | 亚洲激情成人网 | 国产精品视_精品国产免费 国产精品视频1区 | 一区二区成人国产精品 | 亚洲国产精品综合久久一线 | 中文婷婷 |