ADODB的优点有这几个(网上说的,不是我说的):
1、速度比pear快一倍;
2、支持的数据库类型比pear多很多,甚至可以支持ACCESS;
3、无须安装,无须服务器支持(对新手来说,这点很重要吧)
不知道adodb是什么或是想下载adodb的朋友可以去这个链接看看:http://www.phpe.net/class/106.shtml
另外,如果哪位兄弟翻译了README的全文或知道哪里有译文请给我回个帖,谢谢。
Tutorial
Example1:SelectStatement
任务:连接一个名为Northwind的Access数据库,显示每条记录的前两个字段.
在这个实例里,我们新建了一个ADOC连接(ADOConnection)对象,并用它来连接一个数据库.这个连接采用PConnect方法,这是一个持久连接.当我们要查询数据库时,我们可以随时调用这个连接的Execute()函数.它会返回一个ADORecordSet对象whichisactuallyacursorthatholdsthecurrentrowinthearrayfields[].我们使用MoveNext()从一个记录转向下一个记录.
NB:有一个非常实用的函数SelectLimit在本例中没有用到,它可以控制显示的记录数(如只显示前十条记录,可用作分页显示).
PHP:--------------------------------------------------------------------------------
include('adodb.inc.php');#载入ADOdb
$conn=&ADONewConnection('access');#新建一个连接
$conn->PConnect('northwind');#连接到一个名为northwind的MS-Access数据库
$recordSet=&$conn->Execute('select*fromproducts');#从products数据表中搜索所有数据
if(!$recordSet)
print$conn->ErrorMsg();//如果数据搜索发生错误显示错误信息
else
while(!$recordSet->EOF){
print$recordSet->fields[0].''.$recordSet->fields[1].'
';
$recordSet->MoveNext();//指向下一个记录
}//列表显示数据
$recordSet->Close();//可选
$conn->Close();//可选
?>
--------------------------------------------------------------------------------
$recordSet在$recordSet->fields中返回当前数组,对字段进行数字索引(从0开始).我们用MoveNext()函数移动到下一个记录.当数据库搜索到结尾时EOFproperty被设置为true.如果Execute()发生错误,recordset返回flase.
$recordSet->fields[]数组产生于PHP的数据库扩展。有些数据库扩展只能按数字索引而不能按字段名索引.如果坚持要使用字段名索引,则应采用SetFetchMode函数.无论采用哪种格式索引,recordset都可以由Execute()或SelectLimit()创建。
PHP:--------------------------------------------------------------------------------
$db->SetFetchMode(ADODB_FETCH_NUM);
$rs1=$db->Execute('select*fromtable');//采用数字索引
$db->SetFetchMode(ADODB_FETCH_ASSOC);
$rs2=$db->Execute('select*fromtable');//采用字段名索引
print_r($rs1->fields);#showsarray([0]=>'v0',[1]=>'v1')
print_r($rs2->fields);#showsarray(['col1']=>'v0',['col2']=>'v1')--------------------------------------------------------------------------------
如果要获取记录号,你可以使用$recordSet->RecordCount()。如果没有当前记录则返回-1。
实例2:AdvancedSelectwithFieldObjects
搜索表格,显示前两个字段.如果第二个字段是时间或日期格式,则将其改为美国标准时间格式显示.
PHP:--------------------------------------------------------------------------------
include('adodb.inc.php');///载入adodb
$conn=&ADONewConnection('access');//新建一个连接
$conn->PConnect('northwind');//连接名为northwind的MS-Access数据库
$recordSet=&$conn->Execute('selectCustomerID,OrderDatefromOrders');//从Orders表中搜索CustomerID和OrderDate两个字段
if(!$recordSet)
print$conn->ErrorMsg();//如果数据库搜索错误,显示错误信息
else
while(!$recordSet->EOF){
$fld=$recordSet->FetchField(1);//把第二个字段赋值给$fld
$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();//可选
$conn->Close();//可选
?>
--------------------------------------------------------------------------------
在这个例子里,我们用FetchField()函数检查了第二个字段的格式.它返回了一个包含三个变量的对象
name:字段名
type:字段在其数据库中的真实格式
max_length:字段最大长度,部分数据库不会返回这个值,比如MYSQL,这种情况下max_length值等于-1.
我们使用MetaType()把字段的数据库格式转化为标准的字段格式
C:字符型字段,它应该可以在
X:文本型字段,存放比较大的文本,一般作用于
实例3:Inserting
在订单数据表中插入一个包含日期和字符型数据的记录,插入之前必须先进行转换,eg:thesingle-quoteinthewordJohn's.
PHP:--------------------------------------------------------------------------------
include('adodb.inc.php');//载入adodb
$conn=&ADONewConnection('access');//新建一个连接
$conn->PConnect('northwind');//连接到ACCESS数据库northwind
$shipto=$conn->qstr("John'sOldShoppe");
$sql="insertintoorders(customerID,EmployeeID,OrderDate,ShipName)";
$sql.="values('ANATR',2,".$conn->DBDate(time()).",$shipto)";
if($conn->Execute($sql)===false){
print'errorinserting:'.$conn->ErrorMsg().'
';
}//如果插入不成功输出错误信息
?>
--------------------------------------------------------------------------------
在这个例子中,我们看到ADOdb可以很容易地处理一些高级的数据库操作.unix时间戳(一个长整数)被DBDate()转换成正确的Access格式,andtherightescapecharacterisusedforquotingtheJohn'sOldShoppe,whichisJohn''sOldShoppeandnotPHP'sdefaultJohn'sOldShoppewithqstr().
观察执行语句的错误处理.如果Execute()发生错误,ErrorMsg()函数会返回最后一个错误提示.Note:php_track_errorsmighthavetobeenabledforerrormessagestobesaved.
实例4:Debugging
include('adodb.inc.php');//载入adodb
$conn=&ADONewConnection('access');//新建一个连接
$conn->PConnect('northwind');//连接到ACCESS数据库northwind
$shipto=$conn->qstr("John'sOldShoppe");
$sql="insertintoorders(customerID,EmployeeID,OrderDate,ShipName)";
$sql.="values('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug=true;
if($conn->Execute($sql)===false)print'errorinserting';
?>
在上面这个例子里,我们设置了debug=true.它会在执行前显示所有SQL信息,同时,它也会显示所有错误提示.在这个例子里,我们不再需要调用ErrorMsg().要想显示recordset,可以参考rs2html()实例.
也可以参阅CustomErrorHandlers的部分内容。
实例5:MySQLandMenus
连接到MySQL数据库agora,并从SQL声明中产生一个<select>下拉菜单,菜单的
PHP:--------------------------------------------------------------------------------
include('adodb.inc.php');#loadcodecommontoADOdb
$conn=&ADONewConnection('mysql');//eateaconnection
$conn->PConnect('localhost','userid','','agora');//SQL数据库,数据库名为agora
$sql='selectCustomerName,CustomerIDfromcustomers';//搜索字段name用于显示,id用于返回值
$rs=$conn->Execute($sql);
print$rs->GetMenu('GetCust','MaryRosli');//显示菜单
?>
--------------------------------------------------------------------------------
在这里我们定义了一个名为GetCust的菜单,其中的'MaryRosli'被选定.SeeGetMenu().我们还有一个把记录值返回到数组的函数:GetArray(),andasanassociativearraywiththekeybeingthefirstcolumn:GetAssoc().
实例6:Connectingto2DatabasesAtOnce
PHP:--------------------------------------------------------------------------------
include('adodb.inc.php');#loadcodecommontoADOdb
$conn1=&ADONewConnection('mysql');#createamysqlconnection
$conn2=&ADONewConnection('oracle');#createaoracleconnection
$conn1->PConnect($server,$userid,$password,$database);
$conn2->PConnect(false,$ora_userid,$ora_pwd,$oraname);
$conn1->Execute('insert...');
$conn2->Execute('update...');
?>//同时连接两个数据库
--------------------------------------------------------------------------------
7:GeneratingUpdateandInsertSQL
ADOdb1.31以上的版本支持两个新函数:GetUpdateSQL()和GetInsertSQL().Thisallowyoutoperforma"SELECT*FROMtablequeryWHERE...",makeacopyofthe$rs->fields,modifythefields,andthengeneratetheSQLtoupdateorinsertintothetableautomatically.
我们来看看这两个函数在这个工作表中是如何执行的:(ID,FirstName,LastName,Created).
Beforethesefunctionscanbecalled,youneedtoinitializetherecordsetbyperformingaselectonthetable.IdeaandcodebyJonathanYoungerjyounger#unilab.com.
PHP:--------------------------------------------------------------------------------
#==============================================
#SAMPLEGetUpdateSQL()andGetInsertSQL()code
#==============================================
include('adodb.inc.php');
include('tohtml.inc.php');//奇怪,这句似乎有没有都一样,哪位朋友知道原因请给个解释
#==========================
#Thiscodetestsaninsert
$sql="SELECT*FROMADOXYZWHEREid=-1";#查找一个空记录$conn=&ADONewConnection("mysql");#createaconnection
$conn->debug=1;
$conn->PConnect("localhost","admin","","test");#connecttoMySQL,testdb
$rs=$conn->Execute($sql);#获取一个空记录
$record=array();#建立一个数组准备插入
#设置插入值$record["firstname"]="Bob";
$record["lastname"]="Smith";
$record["created"]=time();
#Passtheemptyrecordsetandthearraycontainingthedatatoinsert
#intotheGetInsertSQLfunction.Thefunctionwillprocessthedataandreturn
#afullyformattedinsertsqlstatement.#插入前会格式化变量
$insertSQL=$conn->GetInsertSQL($rs,$record);
$conn->Execute($insertSQL);#在数据库中插入数据
#==========================
#下面这段程序演示修改数据,大致与上一段程序相同
$sql="SELECT*FROMADOXYZWHEREid=1";
#Selectarecordtoupdate
$rs=$conn->Execute($sql);#Executethequeryandgettheexistingrecordtoupdate
$record=array();#Initializeanarraytoholdtherecorddatatoupdate
#Setthevaluesforthefieldsintherecord
$record["firstname"]="Caroline";
$record["lastname"]="Smith";#UpdateCaroline'slastnamefromMirandatoSmith
#Passthesinglerecordrecordsetandthearraycontainingthedatatoupdate
#intotheGetUpdateSQLfunction.Thefunctionwillprocessthedataandreturn
#afullyformattedupdatesqlstatementwiththecorrectWHEREclause.
#Ifthedatahasnotchanged,norecordsetisreturned
$updateSQL=$conn->GetUpdateSQL($rs,$record);
$conn->Execute($updateSQL);#Updatetherecordinthedatabase
$conn->Close();
?>
--------------------------------------------------------------------------------
实例8ImplementingScrollingwithNextandPrevious
下面的演示是个很小的分页浏览程序.
PHP:--------------------------------------------------------------------------------
include_once('../adodb.inc.php');
include_once('../adodb-pager.inc.php');
session_start();
$db=NewADOConnection('mysql');
$db->Connect('localhost','root','','xphplens');
$sql="select*fromadoxyz";
$pager=newADODB_Pager($db,$sql);
$pager->Render($rows_per_page=5);--------------------------------------------------------------------------------
运行上面这段程序的结果如下:
|<<<>>>|
IDFirstNameLastNameDateCreated
36AlanTuringSat06,Oct2001
37SerenaWilliamsSat06,Oct2001
38YatSunSunSat06,Oct2001
39WaiHunSeeSat06,Oct2001
40StevenOeySat06,Oct2001
Page8/10
调用Render($rows)方法可以分页显示数据.如果你没有给Render()输入值,ADODB_Pager默认值为每页10个记录.
你可以在SQL里选择显示任意字段并为其定义名称:
$sql='selectidas"ID",firstnameas"FirstName",
lastnameas"LastName",createdas"DateCreated"fromadoxyz';
以上代码你可以在adodb/tests/testpaging.php中找到,ADODB_Pager对象在adodb/adodb-pager.inc.php中.你可以给ADODB_Pager的代码加上图像和改变颜色,你可以通过设置$pager->htmlSpecialChars=false来显示HTML代码.
SomeofthecodeusedherewascontributedbyIvánOlivaandCornelG.
Example9:ExportinginCSVorTab-DelimitedFormat
Weprovidesomehelperfunctionstoexportincomma-separated-value(CSV)andtab-delimitedformats:
PHP:--------------------------------------------------------------------------------
include_once('/path/to/adodb/toexport.inc.php');include_once('/path/to/adodb/adodb.inc.php');
$db=&NewADOConnection('mysql');$db->Connect($server,$userid,$password,$database);$rs=$db->Execute('selectfnameas"FirstName",surnameas"Surname"fromtable');
print"
";printrs2csv($rs);#returnastring,CSVformatprint'";
';$rs->MoveFirst();#note,somedatabasesdonotsupportMoveFirstprintrs2tab($rs,false);#returnastring,tab-delimited
#false==suppressfieldnamesinfirstlineprint'
';$rs->MoveFirst();rs2tabout($rs);#sendtostdoutdirectly(thereisalsoanrs2csvoutfunction)
print"
$rs->MoveFirst();$fp=fopen($path,"w");
if($fp){rs2csvfile($rs,$fp);#writetofile(thereisalsoanrs2tabfilefunction)
fclose($fp);}--------------------------------------------------------------------------------
Carriage-returnsornewlinesareconvertedtospaces.Fieldnamesarereturnedinthefirstlineoftext.Stringscontainingthedelimitercharacterarequotedwithdouble-quotes.Double-quotesaredouble-quotedagain.ThisconformstoExcelimportandexportguide-lines.
Alltheabovefunctionstakeasanoptionallastparameter,$addtitleswhichdefaultstotrue.Whensettofalsefieldnamesinthefirstlinearesuppressed.
Example10:RecordsetFilters
Sometimeswewanttopre-processallrowsinarecordsetbeforeweuseit.Forexample,wewanttoucwordsalltextinrecordset.
PHP:--------------------------------------------------------------------------------
include_once('adodb/rsfilter.inc.php');
include_once('adodb/adodb.inc.php');
//ucwords()everyelementintherecordset
functiondo_ucwords(&$arr,$rs)
{
foreach($arras$k=>$v){
$arr[$k]=ucwords($v);
}
}
$db=NewADOConnection('mysql');
$db->PConnect('server','user','pwd','db');
$rs=$db->Execute('select...fromtable');
$rs=RSFilter($rs,'do_ucwords');--------------------------------------------------------------------------------
TheRSFilterfunctiontakes2parameters,therecordset,andthenameofthefilterfunction.Itreturnstheprocessedrecordsetscrolledtothefirstrecord.Thefilterfunctiontakestwoparameters,thecurrentrowasanarray,andtherecordsetobject.Forfuturecompatibility,youshouldnotusetheoriginalrecordsetobject.