PHP ADODB 1.99版手冊中文翻譯

導讀:
http://www.moocky.net/Manual/adodb.gb.htm
PHP ADODB 1.99版手冊中文翻譯(Tripc)
感謝
記事
PHP ADODB 1.99版手冊中文翻譯
翻譯作者:Tripc
------------------
ADODB
PHP在資料庫的支援上是很令人稱道的,幾乎所有的知名資料庫系統都有對應的函數羣支援,而且支援的很完整。但很不幸的,每一羣資料庫支援函數無論在名稱或叄數結構上,都有很大的差異,這使得PHP的系統開發者在面臨更換資料庫時,總會覺得痛苦萬分。難道這個問題就沒有解決方法嗎?呵呵,當然有,答案就是我現在要介紹的 ADODB 這個PHP物件。
ADODB提供了完整的方法和屬性讓工程師去控制資料庫系統,更棒的是你只要記得它的功能就好了,因爲不同的資料庫系統,只要修改一個屬性值就可以了,ADODB會自動依據設定取用正確的PHP函數。此外,最多再配合資料庫系統修改修改SQL指令,你的PHP系統就可以在最短的時間內更換到另一個資料庫系統了,如果在撰寫程式時,對SQL指令能做妥善規劃,那就更快了。
經過以上的介紹,相信你已經對ADODB的功用有所瞭解,以下爲ADODB的詳細介紹。
取得ADODB
你可以在 http://php.weblogs.com/ADOdb取得最新版的ADODB。我在撰寫本文時,最新版本是1.99版,版權採BSD-Style及LGPL雙軌制,換句話就是Freeware,沒有什麼限制。但在取得ADODB後,最好還是要看一下相關版權說明及用法,並和本文對照一下,以免錯誤。
使用ADODB
基本上使用ADODB是相當容易的,取得壓縮檔後解開,我建議將整個內容都解到ADODB的目錄裏。然後你可以一邊叄考本文,一邊研究裏面的範例,就放在裏面的test目錄下。
由於ADODB附上的說明十分完整詳實,以下的說明大部份來自ADODB的readme.htm,這裏不是全部的內容,我把一些我認爲沒有用的內容都去掉了,像版本差異說明、何撰寫支援ADODB的驅動程式等與應用無關的部份。想要了解全部內容的讀者還是可以自己去叄考 readme.htm。
簡介
特色
安裝
啓動ADODB
ADONewConnection
NewADOConnection
支援的資料庫
學習手冊
範例 1 : Select
範例 2 : 進階 Select
範例 3 : Insert
範例 4 : 除錯及 rs2html 範例
範例 5 : MySQL 及選單
範例 6 : 一次連結兩個資料庫
範例 7 : 產生更新及新增的SQL指令
範例 8 : 用下一筆及上一筆實作捲動
客製化錯誤處理及PEAR錯誤
資料集快取
叄考手冊
ADOConnection
連結資料庫:ConnectPConnect
執行SQL:ExecuteCacheExecuteSelectLimitCacheSelectLimitPreparePrepareSPGetOneGetRow
產生 更新/新增:GetUpdateSQLGetInsertSQL
BLOB : UpdateBlobUpdateClobUpdateBlobFile
換頁/卷頁 : PageExecuteCachePageExecute
清除 : CacheFlushClose
交易 : BeginTransCommitTransRollbackTrans
提取資料 : $ADODB_FETCH_MODEBlankRecordSet
字串 : Concatqstr
日期 : DBDateDBTimeStampUnixDateUnixTimeStamp
"列"管理器 : Affected_RowsInsert_IDGenID
錯誤處理 : ErrorMsgErrorNo
資料辭典 : MetaDatabasesMetaTablesMetaColumnsMetaColumnNames
反對 : Bind(? 沒有說明)
ADORecordSet
取單筆記錄 : FetchRowFetchIntoFetchObjectFetchNextObjectGetRowAssocFieldsGetAssoc
取全部記錄 : GetArrayGetRows
捲動 : MoveMoveNextMoveFirstMoveLastAbsolutePositionCurrentRowAtFirstPageAtLastPageAbsolutePage
選單製作 : GetMenuGetMenu2
日期 : UserDateUserTimeStampUnixDateUnixTimeStamp
記錄資訊 : RecordCountPO_RecordSet
欄位資訊 : FieldCountFetchFieldMetaType
清除 : Close
rs2html 公用函式說明 範例
簡介
由於PHP的資料庫存取函數沒有標準化,所以我們需要一組函數庫或是類別來隱藏不同資料庫函數介面間的差異,讓我們可以很簡單的去切換資料庫,而這,就是ADODB的目的。
ADODB目前支援MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL, FrontBase, Interbase (Firebird 及 Borland 版本), Foxpro, Access, ADO 和 ODBC。ADODB也有透過ODBC成功連結Progress及DB2的報告,我們希望能有更的人提供驅動介面來支援更多的資料庫。
PHP4支援連結變數(session variables),使用者可以透過ADODB儲存連結資訊,以達成真正的可攜性及彈性,相關的用法及資訊請自行叄考ADOdb-session.php這個範例。
另外,如果要撰寫一個具有高度可移植性的SQL碼,也可以叄閱 http://php.weblogs.com/portable_sql這篇文章。
特色
對熟悉Windows的工程師而言,ADODB很容易使用,因爲ADODB裏的很多功能和Microsoft的ADO很像。
與其它的PHP資料庫類別不同,它們大多集中在處理與 select 指令有關的東西,而ADODB對於 inserts 及 update 也提供額外的支援,並且可以很快的連結到多資料庫。所提供的方法更擴及日期的掌握,字串的連結及字串標記字元差異處理(在某些資料庫間字串的連結和標記符號是有差異的)
型別對照系統是內建的,所以我們可以設定或描述像CHAR,TEXT及STRING在不同的資料庫間其實是相同的資料型別。
更容易去移植,因爲所有與資料庫相依的程式碼被都隱藏在後端,所以使用者不再需要去移植類別裏的邏輯。
支援 PHP4 連結變數,請叄考 ADOdb-session.php。
安裝
首先要確定你所使用的PHP版本是 4.01pl2 或是之後的版本(因爲ADODB使用到了 require_once及include_once兩個函數)。解壓縮全部的檔案到你的Web伺服器可以存取的一個目錄裏。
要測試ADODB你需要一個資料庫,開啓 testdatabase.inc.php 這個檔案,並且修改連結叄數,以適合你所使用的資料庫。這個程式會建立一個新的資料表在你的資料庫中,以支援我們提供的測試程式及範例。
就這樣,你安裝好了。
啓動ADODB
當要執行ADODB時,至少有兩個檔案要被載進來,第一個是 ADOdb.inc.php ,這裏麪包含了所有資料庫類中要被使用的函數。而對資料庫實作的程式碼則被置放在ADOdb-????.inc.php檔案裏。
例如說,要連結一個mysql資料庫:
include('/path/to/set/here/ADOdb.inc.php');$conn = &ADONewConnection('mysql');
無論何時你需要連結到一個資料庫時,你必需使用ADONewConnection()函數建立了一個連結物件。ADONewConnection接受一個選擇性叄數, 。如果沒有叄數被指定,它將會使用被 ADOLoadCode() 所載入的最後一個資料庫。 NewADOConnection() 是另一個相同的函數。
當你建立好一個連結物件時,你並沒有真的連結上你的資料庫。你仍需要使用 $conn->Connect()或者 $conn->PConnect()兩個方法來完成真正的連結。
你可以叄考教學手冊裏的範例,對上面的說明做更深入的瞭解。
支援的資料庫
名稱 測試狀態 資料庫 RecordCount() 支援與否 需安裝的驅動程式 作業系統
access B Microsoft Access/Jet. 需要建立一個 ODBC/DSN。 Y/N ODBC Windows only
ado B 一般未經特別指定的資料庫系統, 透過ADO,允許不設定 DSN連結,使用OLEDB以提供較佳的效能。 ? 視資料庫而定 ADO or OLEDB provider Windows only
ado_access B Microsoft Access/Jet 透過ADO,允許不設定 DSN連結,使用OLEDB以提供較佳的效能。 Y/N ADO or OLEDB provider Windows only
ado_mssql B Microsoft SQL Server 透過ADO,允許不設定 DSN連結,使用OLEDB以提供較佳的效能。 Y/N ADO or OLEDB provider Windows only
db2 C DB2. 可以透過ODBC獲得可以信賴的運作效果。 Y/N DB2 CLI/ODBC interface Unix and Windows. Unix install hints.
vfp A Microsoft Visual FoxPro,需要建立一個ODBC/DSN Y/N ODBC Windows only
fbsql C FrontBase. Y ? Unix and Windows
ibase B Interbase 6或更早的版本。有些使用者報告必需使用如下的方式連結
$db->PConnect('localhost:c:/ibase/employee.gdb', "sysdba", "masterkey")目前沒有支援 Affected_Rows 方法
Y/N Interbase client Unix and Windows
firebird C interbase的Firebird版本 Y/N Interbase client Unix and Windows
borland_ibase C Borland 的Interbase 6.5 或更新版 Y/N Interbase client Unix and Windows
informix C Informix Y/N Informix client Unix and Windows
mssql A Microsoft SQL Server 7.也可以和Microsoft SQL Server 2000運作的很好。但在日期格式上仍有一些問題。例如在日期時間的回傳值上,就不會回傳秒數數值。 Y/N Mssql client Unix and Windows.Unix install howto.
mysql A MySQL 不支援交易處理 Y/N MySQL client Unix and Windows
mysqltmaxsql A MySQL 支援交易處理 Y/N MySQL client Unix and Windows
oci8 A Oracle 8/9. 支援比 oracle驅動程式還多的功能 (例如: Affected_Rows). 在連結之前,你可能需要先配好環境變數('ORACLE_HOME=...')
有兩個方式進行連結,用伺服器的IP或服務名稱:
PConnect('serverip:1521','scott','tiger','service')
PConnect(', 'scott', 'tiger', 'tnsname').
Y/N Oracle client Unix and Windows
oci8po A Oracle 8/9 可攜式驅動程式 Y/N Oracle client Unix and Windows
odbc A 標準 ODBC
用 PConnect('DSN','user','pwd').連結。
? depends on database ODBC Unix and Windows. Unix hints.
odbc_mssql C 用 ODBC 連接 MSSQL Y/N ODBC Unix and Windows.
odbc_oracle C 用 ODBC 連接 ORACLE Y/N ODBC Unix and Windows.
oracle C 支援舊的 Oracle 7 client API. 不支援 $ADODB_FETCH_MODE. Y/N Oracle client Unix and Windows
postgres A PostgreSQL 不支援 LIMIT 指令. Y PostgreSQL client Unix and Windows.
postgres7 A PostgreSQL 支援 LIMIT 及其它版本 7 功能 Y PostgreSQL client Unix and Windows.
sqlanywhere C Sybase SQL Anywhere. Y/N SQL Anywhere ODBC client ?
sybase C Sybase. Y/N Sybase client Unix and Windows. Unix hints.
 
測試狀態欄的代碼說明如下:
A=已經經過很多人驗證及測試,可靠度最高。
B=已經測試並使用了,但可能仍有一些功能沒有達成。
C=使用者自行配置或試用的驅動程式,可能沒有完全支援ADODB的功能。
"RecordCount()支援與否",指的是RecordCount()函數是否會回傳用SELECT指令取得的記錄筆數(不支援時傳回-1)。如果這個欄位的值出現了 Y/N ,那表示當全域變數 $ADODB_COUNTER=true 時,會以模擬的方式取得,而這是預設值。要注意的是,如果你預測記錄筆數會很大時,最好把這個值設爲false,也就是關掉這個模擬功能,因爲這會耗掉非常多的記憶體,以做爲快取之用。由於這個變數在每次執行時都會檢查,所以你可以選擇性的使用或不使用。
所有支援$ADODB_FETCH_MODE的資料庫都支援 ADODB_FETCH_NUM(以欄位順序存取) 及 ADODB_FETCH_ASSOC(以欄位名稱存取),兩種模式。而將值設爲 ADODB_FETCH_DEFAULT(資料庫預設模式存取),則是由資料庫的功能來決定的,所以不具備可攜性,而 ADODB_FETCH_BOTH(雙模式存取) 也一樣。
學習手冊
範例 1: Select 指令
任務:連結到 Access 的 Northwind DSN,然後在每一列顯示頭2個欄位。(Northwind 北風資料庫,在ODBC設定的DSN,是Access的標準範例資料庫)
在這個範例中,我們建立一個 ADOConnection 物件,它代表了和資料庫的連結。連結是以 PConnect函數來初始化的,然後會持續的連結着。任何時候我們要查詢資料庫時,我們就呼叫 ADOConnection.Execute() 函數,這將會回傳一個 ADORecordSet物件。事實上它只是一個指向在fields[]陣列中,目前記錄的指標,我們使用MoveNext()來在記錄間移動。
注意:另一個很有用的函數 SelectLimit並沒有在這個範例裏使用,這個函數允許我們去限制顯示的資料筆數。
include('ADOdb.inc.php'); # 載入ADODB$conn= &ADONewConnection('access'); # 建立一個連結$conn->PConnect('northwind'); # 連結到 MS-Access 北風資料庫$recordSet= &$conn->Execute('select * from products');if (!$recordSet) print $conn->ErrorMsg();elsewhile(!$recordSet->EOF) {print$recordSet->fields[0].' '.$recordSet->fields[1].'
';$recordSet->MoveNext();}$recordSet->Close(); # 選擇性執行$conn->Close(); # 選擇性執行?>
在這個例子中,$recordSet回傳了存在$recordSet->fields陣列裏,目前所指向的記錄。以欄位編號爲索引,起始值爲0。我們使用MoveNext()函數來移動到下一筆記錄,當到了最後一筆時,EOF屬性會被設定爲true。當Execute()函數執行有錯誤時,會回傳一個false值,而不是一個recordset物件。
$recordSet->fields[]陣列是由PHP資料庫擴充函數庫所產生的。有一些資料庫擴充函數庫僅支援以編號來進行索引,而不支援以欄位名爲索引。要強迫使用欄位名索引,也就是要使用關連式陣列,請使用 $ADODB_FETCH_MODE 全域變數來設定。當一個資料集被Execute()或是SelectLimit()函數建立時,都會儲存而且使用儲如此類的設定模式。
$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')
上面的範例說明,如果要以順序來存取欄位,就將 $ADODB_FETCH_MODE 的值設爲 ADODB_FETCH_NUM,要以關連式陣列(以欄位名)存取欄位,就要將值設爲 ADODB_FETCH_ASSOC。
要取得在被選到的記錄筆數,你可以使用$recordSet->RecordCount()方法。注意,如果不能確定得到的記錄筆數,會回傳 -1 。
範例 2: 進階的 Select 指令(使用 Field 物件)
任務:選取一個資料表,顯示最前面的二欄。如果第二欄是一個日期或時間型態欄位,將它格式化成US格式。
include('ADOdb.inc.php'); $conn= &ADONewConnection('access'); $conn->PConnect('northwind'); $recordSet= &$conn->Execute('select CustomerID,OrderDate from Orders');if (!$recordSet) print $conn->ErrorMsg();elsewhile(!$recordSet->EOF) {$fld= $recordSet->FetchField(1);$type= $recordSet->MetaType($fld->type);if( $type== 'D' || $type== 'T')print$recordSet->fields[0].' '.$recordSet->UserDate($recordSet->fields[1],'m/d/Y').'
';else print$recordSet->fields[0].' '.$recordSet->fields[1].'
';$recordSet->MoveNext();}$recordSet->Close(); # optional$conn->Close(); # optional?>
在這個例子中,我們使用 FetchField() 函數來檢查第二個欄位的資料型別。這將會回傳一個至少有三個欄位的物件,欄位說明如下:
name: 欄位名
type: 欄位的資料原生型別native field type of column
max_length: 欄位的最大長度,部份資料庫像MySQL,並不回傳欄位的正確值,以這個例子而言,就會回傳 -1 。
然後我們使用 MetaType() 去轉換原生型別成通用型別,目前通用型別定義如下:
C: character 欄位,應該使用 標記來取值。
X: 文字欄位(Text) , 長文字欄位,使用 <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <BR><A href="http://blog.csdn.net/80x88/archive/2005/02/27/304326.aspx</body></html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章