手机
当前位置:查字典教程网 >编程开发 >php教程 >Adodb的十个实例(清晰版)
Adodb的十个实例(清晰版)
摘要:本想学pear的,可是网上看到的几篇帖子对adodb的评价相当高,所以改学了这个。ADODB的优点有这几个(网上说的,不是我说的):1、速度...

本想学pear的,可是网上看到的几篇帖子对adodb的评价相当高,所以改学了这个。

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].'<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-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().'<BR>';

}//如果插入不成功输出错误信息

?>

--------------------------------------------------------------------------------

在这个例子中,我们看到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>下拉菜单,菜单的<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().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"<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.

【Adodb的十个实例(清晰版)】相关文章:

PHP出错界面

基于qmail的完整WEBMAIL解决方案安装详解

PHP脚本的10个技巧(6)

Smarty实例教学 实例篇

PHP脚本的10个技巧(3)

PHP的十个高级技巧(上中下)第1/3页

PHP脚本的10个技巧(8)

PHP中的traits简单使用实例

php注入实例

PHP生成器简单实例

精品推荐
分类导航