用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第19讲 ADODB的简介,优缺点,下载与安装,操作mysql流程,公共变量,主要函数,公共函数,错误,导常,事务处理例子

上次修改时间: 2016-03-17 21:39:46      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\PHP入门到精通笔记\      下一页

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 '出现意外。';
 }