Adodb的十个实例(清晰版)
2018-09-07 14:05
本想学pear的,可是网上看到的几篇帖子对adodb的评价相当高,所以改学了这个。
ADODB的优点有这几个(网上说的,不是我说的):
1、速度比pear快一倍;
2、支持的数据库类型比pear多很多,甚至可以支持ACCESS;
3、无须安装,无须服务器支持(对新手来说,这点很重要吧)
不知道adodb是什么或是想下载adodb的朋友可以去这个链接看看:
另外,如果哪位兄弟翻译了README的全文或知道哪里有译文请给我回个帖,谢谢。
Tutorial
Example1:SelectStatement
任务:连接一个名为Northwind的Access数据库,显示每条记录的前两个字段.
在这个实例里,我们新建了一个ADOC连接(ADOConnection)对象,并用它来连接一个数据库.这个连接采用PConnect方法,这是一个持久连接.当我们要查询数据库时,我们可以随时调用这个连接的Execute()函数.它会返回一个ADORecordSet对象whichisactuallyacursorthatholdsthecurrentrowinthearrayfields[].我们使用MoveNext()从一个记录转向下一个记录.
NB:有一个非常实用的函数SelectLimit在本例中没有用到,它可以控制显示的记录数(如只显示前十条记录,可用作分页显示).
PHP:--------------------------------------------------------------------------------
<?
$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].<BR>;
$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).<BR>;//如果字段格式为日期或时间型,使其以美国标准格式输出
else
print$recordSet->fields[0]..$recordSet->fields[1].<BR>;//否则以原样输出
$recordSet->MoveNext();//指向下一个记录
}
$recordSet->Close();//可选
$conn->Close();//可选
?>
--------------------------------------------------------------------------------
在这个例子里,我们用FetchField()函数检查了第二个字段的格式.它返回了一个包含三个变量的对象
name:字段名
type:字段在其数据库中的真实格式
max_length:字段最大长度,部分数据库不会返回这个值,比如MYSQL,这种情况下max_length值等于-1.
我们使用MetaType()把字段的数据库格式转化为标准的字段格式
C:字符型字段,它应该可以在<inputtype=text>标签下显示.
X:文本型字段,存放比较大的文本,一般作用于<textarea>标签
B:块,二进制格式的大型对象,如图片
D:日期型字段
T:时间型字段
L:逻辑型字段(布尔逻辑或bit-field)
I:整型字段
N:数字字段.包括自动编号(autoincrement),数字(numeric),浮点数(floatingpoint),实数(real)和整数(integer).
R:连续字段.包括serial,autoincrementintegers.它只能工作于指定的数据库.
如果metatype是日期或时戳类型的,我们用用户定义的日期格式UserDate()函数来输出,UserDate()用来转换PHPSQL日期字符串格式到用户定义的格式,MetaType()的另一种用法是在插入和替换前确认数据有效性.
实例3:Inserting
在订单数据表中插入一个包含日期和字符型数据的记录,插入之前必须先进行转换,eg:thesingle-quoteinthewordJohns.
PHP:--------------------------------------------------------------------------------
<?
include(adodb.inc.php);//载入adodb
$conn=&ADONewConnection(access);//新建一个连接
$conn->PConnect(northwind);//连接到ACCESS数据库northwind
$shipto=$conn->qstr(JohnsOldShoppe);
$sql=insertintoorders(customerID,EmployeeID,OrderDate,ShipName);
$sql.=values(ANATR,2,.$conn->DBDate(time()).,$shipto);
if($conn->Execute($sql)===false){
printerrorinserting:.$conn->ErrorMsg().<BR>;
}//如果插入不成功输出错误信息
?>
--------------------------------------------------------------------------------
在这个例子中,我们看到ADOdb可以很容易地处理一些高级的数据库操作.unix时间戳(一个长整数)被DBDate()转换成正确的Access格式,andtherightescapecharacterisusedforquotingtheJohnsOldShoppe,whichisJohnsOldShoppeandnotPHPsdefaultJohnsOldShoppewithqstr().
观察执行语句的错误处理.如果Execute()发生错误,ErrorMsg()函数会返回最后一个错误提示.Note:php_track_errorsmighthavetobeenabledforerrormessagestobesaved.
实例4:Debugging
<?
include(adodb.inc.php);//载入adodb
$conn=&ADONewConnection(access);//新建一个连接
$conn->PConnect(northwind);//连接到ACCESS数据库northwind
$shipto=$conn->qstr(JohnsOldShoppe);
$sql=insertintoorders(customerID,EmployeeID,OrderDate,ShipName);
$sql.=values(ANATR,2,.$conn->FormatDate(time()).,$shipto);
$conn->debug=true;
if($conn->Execute($sql)===false)printerrorinserting;
?>
在上面这个例子里,我们设置了debug=true.它会在执行前显示所有SQL信息,同时,它也会显示所有错误提示.在这个例子里,我们不再需要调用ErrorMsg().要想显示recordset,可以参考rs2html()实例.
也可以参阅CustomErrorHandlers的部分内容。
实例5:MySQLandMenus
连接到MySQL数据库agora,并从SQL声明中产生一个<select>下拉菜单,菜单的<option>选项显示为第一个字段,返回值为第二个字段.
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().ThisallowyoutoperformaSELECT*FROMtablequeryWHERE...,makeacopyofthe$rs->fields,modifythefields,andthengeneratetheSQLtoupdateorinsertintothetableautomatically.
我们来看看这两个函数在这个工作表中是如何执行的:(ID,FirstName,LastName,Created).
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;#UpdateCarolineslastnamefromMirandatoSmith
#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=selectidasID,firstnameasFirstName,
lastnameasLastName,createdasDateCreatedfromadoxyz;
以上代码你可以在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(selectfnameasFirstName,surnameasSurnamefromtable);
print<pre>;printrs2csv($rs);#returnastring,CSVformatprint<hr>;$rs->MoveFirst();#note,somedatabasesdonotsupportMoveFirstprintrs2tab($rs,false);#returnastring,tab-delimited
#false==suppressfieldnamesinfirstlineprint<hr>;$rs->MoveFirst();rs2tabout($rs);#sendtostdoutdirectly(thereisalsoanrs2csvoutfunction)
print</pre>;
$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.