

ADODB的简介,优缺点,下载与安装,操作mysql流程,公共变量,主要函数,公共函数,错误,导常,事务处理例子
19.1 什么是ADODB
全称Active Data Objects Data Base,它是用以存取数据库的一组函数,PHP存取函数没有标准化,不同数据库的存取函数差异较大
切换数据库时会带来大量的代码修复工作。使用ADODB类库后不同数据库可以使用同一种存取函数,使之很简单的存取数据库。
19.2 为什么使用ADODB
优点:安装简单,易学,语法与微软ADODB相似,以标准sql语句写的程序更换数据库时不需改变源程序。可生成smarty需要的二维数组,简化smarty开发
缺点:执行效率较低,类库庞大,光主执行类库(adodb.inc.php)就有120K
19.3 ADODB支持的数据库
mysql,oracle,MSSQL,Sybase,PostgreSQL,Foxpro,Access,ADO和ODBC等绝大多数的,知名或不知名数据库
19.4 下载与安装ADODB
从网上下载adodb包,解压到web服务器www下相应目录
19.5 使用ADODB操作MySQL
1) 使用ADODB的一般流程,
a. 加载adodb.inc.php文件
b. 建立连接 //使用ADONewConnection()函数
c. 连接数据库 //使用用PCconnect()函数
d. 执行数据库操作 //使用Execute方法
e. 操作结果集
f. 关闭链接
例:
include_once ('../adodb5/adodb.inc.php') //载入adodb.inc.php文件
$conn= ADONewConnection('mysql'); //建立连接或设置连接数据库类型
$conn -> PConnect('localhost','root','root','db_database19'); //使用Connect()或PConnect()成员方法连接数据库,PConnect是持续性连接,connect是非持续性连接
//connect()和PConnect成功方法的语法相同:Connect(服务器地址,用户名,密码,数据名);
$conn -> execute('set names gb2313'); //设置编码
$rst = $conn -> Execute('select * from tb_object') or die('执行错误'); //执行sql语句操作
while(!$rst -> EOF) { //判断eof属性表明记录指针指向最后一条记录
echo $rst -> fields['bigclass'].' '; //输出字段,每字段后加空格
$rst -> movenext(); //指针下移
}
$rst -> close(); //释放内存, 关闭结果集
$conn -> close(); //关闭连接
19.6 ADODB类库
主要介绍常用的类库,包括公共变量,主要函数,公共函数,结果集adorecordset
1) 公共变量
$ADODB_COUNTRECS
//该变量值为true时,当对不支持select指令的数据执行RecordCount()函数返回记录数时进行自动模拟
//该功能消耗内存,不建议使用
$ADODB_CACHE_DIR //该变量用以在使用缓存函数时设置缓存目录,如CacheExecute()函数
$ADODB_FETCH_MODE //该变量决定结果集以那种方式存取,有4个值0-3
define('ADODB_FETCH_DEFAULT',0);
define('ADODB_FETCH_NUM',1);
define('ADODB_FETCH_ASSOC',2);
define('ADODB_FETCH_BOTH',3);
2) 类库的16个主要函数
1. ADONewConnection($databaseType)
2. PConnect($host,[$user],[$password],[$database])
3. Execute($sql[,$inputarr=false])
4. CacheExecute([$sec,]$sql[,$inputarr=false])
5. SelectLimit($sql,[,$numrows=-1][,$offset=-1][,$inputarr=false])
6. CacheSelectLimit([$sec,] $sql[, $numrows=-1][,$offset=-1][,$inputarr=false])
7. CachFlush()
8. GetUpdateSQL(&$rs, $arrFields, $forceUpdate=false)
9. GetInsertSQL(&$rs, $arrFields)
10. PageExecute($sql, $nrows, $page) //主要实现分页功能
11. ChchePageExecute($sec, $sql, $nrows, $page)
12. CacheSelectLimit
13. GetUpdateSQL
例子1:conn.php页面代码
include_once ('../adodb5/adodb.inc.php') //载入adodb.inc.php文件
$conn= NewADOConnection('mysql'); //建立连接或设置连接数据库类型
$conn -> Connect('localhost','root','root','db_database19');
$conn -> execute('set names gb2313'); //设置编码
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
例子:index.php代码
include_once 'conn/conn.php';
$sqlstr = 'select * from tb_object where id = 2';
$rst = $conn -> execute($sqlstr) or die ('Error: '.$conn -> errorMsg());
echo '修改前的数据,时间为'.$rst -> fields['d_time'}.'<br>';
$fields = array();
$fields['d_time'] = date("Y-m-d H:i:s");
$update = $conn -> getUpdateSQL($rst,$fields) or die ('update error: '.$conn -> errorMsg());
$conn -> execute($update);
echo '修改后的数据,时间为';
$rst = $conn -> execute($sqlstr);
echo $rst -> fields('d_time);
例子3:
include_once 'conn/conn.php';
$sqlstr = 'select * from tb_object where id = -1';
$rst = $conn -> execute($sqlstr) or die ('Error: '.$conn -> errorMsg());
$fields = array();
$fields['bigclass'] = '卫生洁具';
$fields['d_time'] = date("Y-m-d H:i:s");
$insert = $conn -> getInsertSQL($rst,$fields) or die('update error: '.$conn -> errorMsg());
$conn -> execute($insert);
echo '添加的数据为:';
$showsql = "select * from tb_object where d_time = '".$fields['d_time']."'";
$rst = $conn -> execute($showsql);
foreach($rst -> fields as $nm => $vl)
echo $nm.'=>'.$vl.' ';
12. BeginTrans()
13. CommitTrans()
14. RollbackTrans()
15. GetOne($sql) //判断记录是否存在
例子:
include 'conn/conn.php';
$sqlstr = 'select * from tb_object where id =2';
$rst = $conn -> getOne($sqlstr);
if($rst)
var_dump($rst);
else
echo '记录不存在';
16. GetRow($sql)
3) 公共函数
DBData($date) //转换不同数据库之间的日期格式,如mysql为y-m-d,oracle为d-m-y
qstr($string) //可用引号来处理字符串,不同数据库的单引号要使用不同的引号引
Affected_rows() //返回最后更新或删除的记录数,数据库如不支持返回false,例:
include_once 'conn/conn.php';
$sqlstr = 'update tb_object set d_time = new() where id =2';
$rst = $conn -> execute($sqlstr) or die('update error: '.$conn -> errorMsg());
echo '被修改的记录数是:'.$conn -> Affected_rows();
Insert_ID() //返回最后插入的记录的ID,数据库不支持返回false
4) ADORecordSet结果集
1. fileds //当前指向的
2. EOF //是否指向最后一条记录
3. GetArray([$number_of_rows]) //反回当前指定的,结果是一个数组,返回所有记录
4. GetMenu($name, [$default_str = ''], [$blank = true], [$multiple_select = false], [$size = 0], [$moreAttr ='']) //
5. GetMenu2($name, [$default_str = ''], [$blank1stItem = true], [$multiple_select = false], [$size = 0], [$moreAttr =''])
6. UserDate($str, [$fmt]) //日期转换
7. UserTimeStamp($str, [$fmt]) //转换时间
8. MoveNext() //指针下移
9. Move($to) //移动指定位置
10. MoveFirst() //移到第一条
11. MoveLast() //移到最后一条
12. AbsolutePage($page=-1)
13. AtFirstPage($status='')
14. AtLastPage($status='')
15. FetchRow()
16. FetchField($column_number)
17. FetchNextObject($toupper=true])
18. FieldCount()
19. RecordCount()
20. CurrentRow() //返回记录序号
21. MetaType($nativeDBType [,$field_max_length],[$fieldobj]) //不同数据库数据类型表示法统一
代码段一:
include_once 'conn/conn.php';
$sqlstr = 'select bigclass,id from tb_object';
$rst = $conn -> execute($sqlstr) or die('execute error: '.$conn -> errorMsg());
代码段二:
<form method='post' action=''>
请选择购买商品的类别:
<?php echo $rst -> getMenu2('bigclass',$_POST[bigclass],false);?>
<input type='submit' name='submit' value='提交' />
</form>
<?php
代码段三:
if(isset($_POST[bigclass])){
echo '您选择的商品类别是:'.$_POST[bigclass];
}
?>
代码段四:
include_once 'conn/conn.php';
$sqlstr = 'select * from tb_object where id = 1';
$rst = $conn -> execute($sqlstr) or die('error: '.$conn -> errorMsg());
if(false !== $rst) {
for($i = 0; $i < $rst -> fieldcount(); $i++ {
$fields = $rst -> fetchField($i);
$type = $fields -> type;
echo '=>';
echo $rst -> metaType($type,-1,$fields);
if($rst -> metaType($type,-1,$fields) == "T")
echo '('.$conn -> DBDate($rst -> fields[$i]).')';
else
echo '('.$rst -> fields[$i].')';
}
}
5) 载入其他页面
1. rs2html($rst,[$table_attributes],[$col_titles]) //返回一个html表格格式的结果集
//参数$rst为要返回的结果集,table_attributes对表格的参数及属性设置,col_title对字段的重命名
注:使用该函数要加载tohtml.inc.php文件
2. ADODB_Pager($conn, $sql,$id='adodb',$showPageLinks=false) //类ADODB_Pager的构造函数,可通过类的render()函数实现小巧分页操作
注:使用该函数要加载adodb_paper.inc.php文件
//参数$conn为数据库链接对象,$sql为要执行的sql语句,$id为每个分页的id号,$showPageLinks是否显示每个页的链接,默认false
例子
include_once 'conn/conn.php';
include_once '../adodb5/tohtml.inc.php';
$rst = $conn -> execute('select * from tb_object') or die('execute error: '.$conn -> errormsg());
rs2html($rst,'border=1 bgcolor=f0f0f0',array('序号','大类','添加时间'));
例子2
include_once 'conn/conn.php';
include_once '../adodb5/adodb-paper.inc.php';
$pager = new ADODB_Pager($conn,"select id,bigclass as '大类',d_time as '添加时间' from tb_object");
$pager -> Render(2);
6) 错误处理与调试
Debug变量 //该变量为true时,有输出操作时也输出调试信息
ErrorMsg() //返回最后的状态或出错信息,没错误也返回一个字串,
//一般只有在发生错误(返回false)才调用该函数,当启用dubug后有错误就自动调用该函数
例:
include_once 'conn/conn.php';
$conn -> debug =true;
$sql = 'select * form tb_object';
$rst = $conn -> execute($sql) or die($conn -> errorMsg());
19.7 ADODB类库的应用
1) 实现分页,例:
代码段1:
include_once 'conn/conn.php';
include('../adodb5/tohtml.inc.php');
$sql = 'select * from tb_object';
$num = 2; //每页显示记录数
if(isset($_GET['n_page'])){
$c_page = $_GET[n_page];
}else{
$c_page =1;
}
$rst = $conn -> PageExecute($sql,$num,$c_page);
if(false !== $rst) {
if(!$rst -> AtfirstPage()){
代码段2: //输出向上翻页超链接
<a href ="<?php echo '?n_page=1' ?>">首页</a>
<a href ="<?php echo '?n_page'.($rst -> absolutePage() -1); ?>">下一面</a>
代码段3:
}
if(!$rst -> AtlastPage()){
代码段4: //输出向下翻页超链接
<a href ="<?php echo '?n_page='.($rst -> absolutePage() + 1); ?>">下一页</a>
<a href ="<?php echo '?n_page'.($rst -> LastPageNo()); ?>">尾页</a>
代码段5:
}
rs2html($rst,'width=350 border=5',array('id','大类','时间'));
}
代码段5:
<font color='#999'>当前是第<?php echo $rst -> absolutePage(); ?>页/一共 <?php echo $rst ->LastPageNo();?>页</font>
2) 处理事务,例
include_once 'conn/conn.php';
$conn -> BeginTrans();
$sql = 'delete from tb_object where id=49';
$rst = $conn -> execute($sql) or die('execute error: '.$conn -> ErrorMsg());
$num = $conn -> Affected_rows();
if($rst) {
if($num != 0) {
$conn -> CommitTrans();
echo '删除成功!';
exit();
} else {
echo '没有数据,或数据已删除!';
exit();
}
}else{
$conn -> RollbackTrans();
echo '出现意外。';
}