Adodb的十个实例(清晰版)


Posted in PHP onDecember 31, 2006

本想学pear的,可是网上看到的几篇帖子对adodb的评价相当高,所以改学了这个。 
ADODB的优点有这几个(网上说的,不是我说的): 
1、速度比pear快一倍; 
2、支持的数据库类型比pear多很多,甚至可以支持ACCESS; 
3、无须安装,无须服务器支持(对新手来说,这点很重要吧) 
不知道adodb是什么或是想下载adodb的朋友可以去这个链接看看:http://www.phpe.net/class/106.shtml  
另外,如果哪位兄弟翻译了README的全文或知道哪里有译文请给我回个帖,谢谢。 
Tutorial  
Example 1: Select Statement  
任务: 连接一个名为Northwind的Access数据库, 显示 每条记录 的前两个字段.  

在这个实例里, 我们新建了一个ADOC连接(ADOConnection)对象, 并用它来连接一个数据库. 这个连接采用PConnect 方法, 这是一个持久 连接. 当我们要查询数据 库时, 我们可以随时调 用这个连接的Execute()函数. 它会返回一个ADORecordSet对象 which is actually a cursor that holds the current row in the array fields[]. 我们使用MoveNext()从一个记录转向下一个记录 .  

NB: 有一 个非常实用的函数 SelectLimit在本例中没有用到, 它可以控制显示的记录数(如只显示前十条记录 ,可用作分页显示 ).  

PHP:-------------------------------------------------------------------------------- 

<?  
include('adodb.inc.php'); #载入ADOdb  
$conn = &ADONewConnection('access'); # 新建一个连接  
$conn->PConnect('northwind'); # 连接到一个名为northwind的MS-Access数据库  
$recordSet = &$conn->Execute('select * from products'); #从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() 函数移动到下一个记录 . 当数据库搜索到结尾时EOF property被 设置 为true. 如果Execute()发生错误 , recordset返回flase.  

$recordSet->fields[]数组产生于PHP的数据库扩展。有些数据库扩展只能按数字索引而不能按字段名索引.如果坚持要使用字段名索引,则应采用SetFetchMode函数.无论采用哪种格式索引,recordset都可以由Execute()或SelectLimit()创建。  

PHP:-------------------------------------------------------------------------------- 
$db->SetFetchMode(ADODB_FETCH_NUM);  
$rs1 = $db->Execute('select * from table'); //采用数字索引  
$db->SetFetchMode(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->RecordCount()。如果没有当前记录则返回-1。  

实例 2: Advanced Select with Field Objects  
搜索表格,显示前两个字段. 如果第二个字段是时间或日期格式,则将其改为美国标准时间格式显示.  

PHP:-------------------------------------------------------------------------------- 

<?  
include('adodb.inc.php'); ///载入adodb  
$conn = &ADONewConnection('access'); //新建一个连接  
$conn->PConnect('northwind'); //连接名为northwind的MS-Access数据库  
$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders'); //从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: 字符型字段,它应该可以在<input type="text">标签下显示.  
X: 文本型字段,存放比较大的文本,一般作用于<textarea>标签  
B: 块,二进制格式的大型对象,如图片  
D: 日期型字段  
T: 时间型字段  
L: 逻辑型字段 (布尔逻辑或bit-field)  
I: 整型字段  
N: 数字字段. 包括自动编号(autoincrement), 数字(numeric), 浮点数(floating point), 实数(real)和整数(integer).  
R: 连续字段. 包括serial, autoincrement integers.它只能工作于指定的数据库.  
如果metatype是日期或时戳类型的,我们用用户定义的日期格式UserDate()函数来输出,UserDate()用来转换PHP SQL 日期字符串格式到用户定义的格式,MetaType()的另一种用法是在插入和替换前确认数据有效性.  

实例 3: Inserting 
在订单数据表中插入一个包含日期和字符型数据的记录,插入之前必须先进行转换, eg: the single-quote in the word John's.  

PHP:-------------------------------------------------------------------------------- 

<?  
include('adodb.inc.php'); // 载入adodb  
$conn = &ADONewConnection('access'); //新建一个连接  

$conn->PConnect('northwind'); //连接到ACCESS数据库northwind  
$shipto = $conn->qstr("John's Old Shoppe");  

$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";  
$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";  

if ($conn->Execute($sql) === false) {  
print 'error inserting: '.$conn->ErrorMsg().'<BR>';  
} //如果插入不成功输出错误信息  
?>  
-------------------------------------------------------------------------------- 

在这个例子中,我们看到ADOdb可以很容易地处理一些高级的数据库操作. unix时间戳 (一个长整数)被DBDate()转换成正确的Access格式, and the right escape character is used for quoting the John's Old Shoppe, which is John''s Old Shoppe and not PHP's default John's Old Shoppe with qstr().  

观察执行语句的错误处理. 如果Execute()发生错误, ErrorMsg()函数会返回最后一个错误提示. Note: php_track_errors might have to be enabled for error messages to be saved.  

实例 4: Debugging  
<?  
include('adodb.inc.php'); // 载入adodb  
$conn = &ADONewConnection('access'); //新建一个连接  
$conn->PConnect('northwind'); //连接到ACCESS数据库northwind  
$shipto = $conn->qstr("John's Old Shoppe");  
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";  
$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";  
$conn->debug = true;  
if ($conn->Execute($sql) === false) print 'error inserting';  
?>  

在上面这个例子里,我们设置了debug = true.它会在执行前显示所有SQL信息, 同时,它也会显示所有错误提示. 在这个例子里,我们不再需要调用ErrorMsg() . 要想显示recordset, 可以参考 rs2html()实例.  

也可以参阅 Custom Error Handlers 的部分内容。  

实例 5: MySQL and Menus  
连接到MySQL数据库agora, 并从SQL声明中产生一个<select>下拉菜单 ,菜单的 <option> 选项显示为第一个字段, 返回值为第二个字段.  

PHP:-------------------------------------------------------------------------------- 

<?  
include('adodb.inc.php'); # load code common to ADOdb  
$conn = &ADONewConnection('mysql'); //eate a connection  
$conn->PConnect('localhost','userid','','agora'); //SQL数据库,数据库名为agora  
$sql = 'select CustomerName, CustomerID from customers'; //搜索字段name用于显示,id用于返回值  
$rs = $conn->Execute($sql);  
print $rs->GetMenu('GetCust','Mary Rosli'); //显示菜单  
?>  
-------------------------------------------------------------------------------- 

在这里我们定义了一个名为GetCust的菜单,其中的'Mary Rosli'被选定. See GetMenu(). 我们还有一个把记录值返回到数组的函数: GetArray(), and as an associative array with the key being the first column: GetAssoc().  

实例 6: Connecting to 2 Databases At Once  

PHP:-------------------------------------------------------------------------------- 

<?  
include('adodb.inc.php'); # load code common to ADOdb  
$conn1 = &ADONewConnection('mysql'); # create a mysql connection  
$conn2 = &ADONewConnection('oracle'); # create a oracle connection  

$conn1->PConnect($server, $userid, $password, $database);  
$conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);  

$conn1->Execute('insert ...');  
$conn2->Execute('update ...');  
?> //同时连接两个数据库  
-------------------------------------------------------------------------------- 

7: Generating Update and Insert SQL  
ADOdb 1.31以上的版本支持两个新函数: GetUpdateSQL( ) 和 GetInsertSQL( ). This allow you to perform a "SELECT * FROM table query WHERE...", make a copy of the $rs->fields, modify the fields, and then generate the SQL to update or insert into the table automatically.  
我们来看看这两个函数在这个工作表中是如何执行的: (ID, FirstName, LastName, Created).  

Before these functions can be called, you need to initialize the recordset by performing a select on the table. Idea and code by Jonathan Younger jyounger#unilab.com.  

PHP:-------------------------------------------------------------------------------- 

<?  
#==============================================  
# SAMPLE GetUpdateSQL() and GetInsertSQL() code  
#==============================================  
include('adodb.inc.php');  
include('tohtml.inc.php'); // 奇怪,这句似乎有没有都一样,哪位朋友知道原因请给个解释  
#==========================  
# This code tests an insert  

$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; #查找一个空记录 $conn = &ADONewConnection("mysql"); # create a connection  
$conn->debug=1;  
$conn->PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb  
$rs = $conn->Execute($sql); # 获取一个空记录  
$record = array(); # 建立一个数组准备插入  
# 设置插入值$record["firstname"] = "Bob";  
$record["lastname"] = "Smith";  
$record["created"] = time();  

# Pass the empty recordset and the array containing the data to insert  
# into the GetInsertSQL function. The function will process the data and return  
# a fully formatted insert sql statement.# 插入前会格式化变量  
$insertSQL = $conn->GetInsertSQL($rs, $record);  

$conn->Execute($insertSQL); # 在数据库中插入数据  

#==========================  
# 下面这段程序演示修改数据,大致与上一段程序相同  

$sql = "SELECT * FROM ADOXYZ WHERE id = 1";  
# Select a record to update  

$rs = $conn->Execute($sql); # Execute the query and get the existing record to update  

$record = array(); # Initialize an array to hold the record data to update  

# Set the values for the fields in the record  
$record["firstname"] = "Caroline";  
$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith  

# Pass the single record recordset and the array containing the data to update  
# into the GetUpdateSQL function. The function will process the data and return  
# a fully formatted update sql statement with the correct WHERE clause.  
# If the data has not changed, no recordset is returned  
$updateSQL = $conn->GetUpdateSQL($rs, $record);  

$conn->Execute($updateSQL); # Update the record in the database  
$conn->Close();  
?>  
-------------------------------------------------------------------------------- 

实例 8 Implementing Scrolling with Next and Previous  
下面的演示是个很小的分页浏览程序.  

PHP:-------------------------------------------------------------------------------- 
include_once('../adodb.inc.php');  
include_once('../adodb-pager.inc.php');  
session_start();  

$db = NewADOConnection('mysql');  

$db->Connect('localhost','root','','xphplens');  

$sql = "select * from adoxyz ";  

$pager = new ADODB_Pager($db,$sql);  
$pager->Render($rows_per_page=5);-------------------------------------------------------------------------------- 

运行上面这段程序的结果如下:  

|< << >> >|  
ID First Name Last Name Date Created  
36 Alan Turing Sat 06, Oct 2001  
37 Serena Williams Sat 06, Oct 2001  
38 Yat Sun Sun Sat 06, Oct 2001  
39 Wai Hun See Sat 06, Oct 2001  
40 Steven Oey Sat 06, Oct 2001  

Page 8/10  

调用Render($rows)方法可以分页显示数据.如果你没有给Render()输入值, ADODB_Pager默认值为每页10个记录.  

你可以在 SQL里选择显示任意字段并为其定义名称:  

$sql = 'select id as "ID", firstname as "First Name",  
lastname as "Last Name", created as "Date Created" from adoxyz';  
以上代码你可以在adodb/tests/testpaging.php 中找到, ADODB_Pager 对象在adodb/adodb-pager.inc.php中. 你可以给ADODB_Pager 的代码加上图像和改变颜色,你可以通过设置$pager->htmlSpecialChars = false来显示HTML代码.  

Some of the code used here was contributed by Iván Oliva and Cornel G.  

Example 9: Exporting in CSV or Tab-Delimited Format  
We provide some helper functions to export in comma-separated-value (CSV) and tab-delimited formats:  

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('select fname as "First Name", surname as "Surname" from table');  

print "<pre>";print rs2csv($rs); # return a string, CSV formatprint '<hr>'; $rs->MoveFirst(); # note, some databases do not support MoveFirstprint rs2tab($rs,false); # return a string, tab-delimited  
# false == suppress field names in first lineprint '<hr>';$rs->MoveFirst();rs2tabout($rs); # send to stdout directly (there is also an rs2csvout function)  
print "</pre>";  

$rs->MoveFirst();$fp = fopen($path, "w");  
if ($fp) { rs2csvfile($rs, $fp); # write to file (there is also an rs2tabfile function)  
fclose($fp);}-------------------------------------------------------------------------------- 

Carriage-returns or newlines are converted to spaces. Field names are returned in the first line of text. Strings containing the delimiter character are quoted with double-quotes. Double-quotes are double-quoted again. This conforms to Excel import and export guide-lines.  

All the above functions take as an optional last parameter, $addtitles which defaults to true. When set to false field names in the first line are suppressed.  

Example 10: Recordset Filters  
Sometimes we want to pre-process all rows in a recordset before we use it. For example, we want to ucwords all text in recordset.  

PHP:-------------------------------------------------------------------------------- 
include_once('adodb/rsfilter.inc.php');  
include_once('adodb/adodb.inc.php');  

// ucwords() every element in the recordset  
function do_ucwords(&$arr,$rs)  
{  
foreach($arr as $k => $v) {  
$arr[$k] = ucwords($v);  
}  
}  

$db = NewADOConnection('mysql');  
$db->PConnect('server','user','pwd','db');  

$rs = $db->Execute('select ... from table');  
$rs = RSFilter($rs,'do_ucwords');-------------------------------------------------------------------------------- 

The RSFilter function takes 2 parameters, the recordset, and the name of the filter function. It returns the processed recordset scrolled to the first record. The filter function takes two parameters, the current row as an array, and the recordset object. For future compatibility, you should not use the original recordset object. 

PHP 相关文章推荐
web server使用php生成web页面的三种方法总结
Oct 28 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php读取csc文件并输出
May 21 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
php校验公钥是否可用的实例方法
Sep 17 PHP
ADODB的数据库封包程序库
Dec 31 #PHP
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 #PHP
介绍几个array库的新函数 php
Dec 29 #PHP
简单的过滤字符串中的HTML标记
Dec 25 #PHP
一个PHP模板,主要想体现一下思路
Dec 25 #PHP
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 #PHP
php预定义常量
Dec 25 #PHP
You might like
php后退一页表单内容保存实现方法
2012/06/17 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
php+mysql数据库查询实例
2015/01/21 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
js实现常用排序算法
2016/08/09 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
在Python web中实现验证码图片代码分享
2017/11/09 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
重阳节活动总结
2014/08/27 职场文书
领导干部保密承诺书
2014/08/30 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
财务会计岗位职责
2015/02/03 职场文书
2015年暑假工作总结
2015/07/13 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
检讨书范文
2019/04/16 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS