数据库管家----ADODB类库.

    虽然php是构建web的强有力工具,但是由于php的存储函数并没有标准化.这导致在不同数据库间的函数名称和参数有很大的差异,更换数据库也将带来大量的代码修复工作.adodb类库就是为了解决这个问题而产生. adodb作为php程序和数据库间的中间层,为访问数据库定义了一个轻量级的,一致性的接口,他提供了一个数据访问的抽象层.

<ADODB概述>

  ADODB 是active data objects data base 的缩写,是一中php存取数据库的中间函数式组件.adodb 支持的数据库种类有很多,如mysql,postgerSQL,interbase,informix,Oracle,MS SQL7,foxpro,access,ado ,sybase,DB2以及一般的ODBC.

  ADODB的优点:

    a.不管后台使用何种数据库,存取数据库的方式都是一致的.这简化了开发人员学习另一套知识的时间,同时在转移数据库的时候,也不必作很大的改变.

    b. 可以生成smarty循环需要的二维数组,简化smarty开发,同时还支持缓存查询,尽可能提高查询速度.

  ADODB的缺点:

    缺点就是执行效率慢.为了适用于众多数据库,这导致了类库非常庞大.只是主执行类(adodb.inc.php)就有120KB(后续还将继续变化),因此使用该类库的时候,应充分考虑这一点.

 

ps.ADODB的安装方法是先从 http://sourceforge.net/projects/adodb/files/中下载数据包解压,然后将其复制到程序的指定目录下,最后使用include语句在程序中包含文件.使用ADODB,PHP版本必须为4.01以上.

 

<ADODB执行步骤>

  1.载入adodb.inc.php文件,启动ADODB.

  2.使用ADONewConnection()函数连接数据库服务器.

    ADODB连接数据库系统使用的是ADONewConnection()函数.连接数据库时,如果选择持久化连接则使用PConnect()函数,如果选择非持久化连接则使用Connect()函数.

    ADONewConnection()函数连接数据库系统,语法如下:

ADONewConnection($databaseType);//$databaseType 代表连接的数据库系统的名称,如:mysql,mssql等.

  3.使用PConnect()函数连接数据库.   

  应用PConnect()函数实现与数据库的持久化连接.语法如下:

PConnect($host,[$user],[$password],[$database]);
    //$host:数据库系统的服务器所在地址.如果是本机操作,参数为localhost;
    //$user:数据库用户名.
    //$password:数据库密码.
    //$database:用到的数据库.

  应用函数Connect()函数非持久化连接数据库.其语法如下:

Connect($host,[$user],[$password],[$database]);
    //同上.

ps: 持久化与非持久化的区别:

  持久化连接是不用每次都创建新的连接,可以增加程序的执行速度,但有些数据库不支持持久化连接.如果遇到不支持持久化连接的数据库,可以使用Connect()函数代替PConnect();

  4.定义结果集的存取方式.

    公共变量

    ADODB中的公共变量不但可以控制结果集的存取方式,而且可以自动模拟select指令返回的记录总数和设置缓存目录.公共变量有:

  $ADODB_COUNTREECS变量

    当变量设置为true时,RecordCount()函数会在数据库驱动不支持select指令返回的记录总数时进行自动模拟,返回记录数,默认值为true.每次进行查询操作时都会自动检查变量的值.由于此功能十分消耗内存,因此不建议使用.

  $ADODB_CACHE_DIR变量

    改变量可以设置缓存目录,一般在使用缓存函数时会用到:如:CacheExecute()函数.

  $ADODB_FETCH_MODE变量

    可以控制结果集的存取方式,变量的参数表如下:

  参   数  表          说      明     
  define( ' ADODB_FETCH_DEFAULT ' , 0 )       默认值,在未设置该变量时使用.注意:不同类型数据区驱动的默认值是不同的.
  define( ' ADODB_FETCH_NUM ' , 1 )  设置的结果集 以"字段序号" 为索引进行存取.如:$rst -> fields[0] 和 $rst -> fields[1] 
  define( ' ADODB_FETCH_ASSOC ' , 2 )  设置的结果集 以"字段名称 "为索引进行存取.如:$rst -> fields[name] 和 $rst -> fields[ age] 
  define( ' ADODB_FETCH_BOTH ' , 3 )  同时支持NUM 和 both 的参数. .注意:不同类型数据区驱动的默认值是不同的,不建议使用.

  5.定义SQL,执行数据库操作

  ADODB 执行数据库更新,增加的操作方法有两种.一种是直接定义sql语句,调用execute()函数来执行;另外一种是调用ADODB提供的函数来完成.

  execute()函数.

    在众多操作SQL语句的方法中, execute()函数是最为常用的一个,它执行sql语句,成功则返回一个结果集(ADORecordSet),失败则返回false.语法如下:

execute( $sql [ , $inputarr=false]);
    //$sql 指定要执行的sql语句.
    // $inputarr: 用于设置传入的结合变量,如果没有设置$inputarr, $sql为普通的SQL语句.

  ps:使用结合绑定变量,可以加速sql指令编译以及读取的速度,提高效率.

  提高:

  将查询到的结果保存到缓存中,使用CacheExecute()函数,该函数不但具有execute()的功能,还能将查询到的结果保存到缓存中去.下一次查询,如果存在相同的查询,就可以直接从缓存中获取.

  应用selectLimit()函数控制select查询语句的起始位置.

    mysql数据库中有一个limit关键字,通过它可以控制查询语句从第几条记录开始查询,查询多少条记录.ADODB中的SelectLimit()函数模拟了limit关键字.语法格式如下:

SelectLimit( $sql [$numrows=-1] [,$offset = -1] [, $inputarr = false] );
    // $sql: 要执行的select 查询语句.
    // $numrows: 要查询的记录数.如果该值为-1,则查询到最后一条记录.
    // $offset: 表示从第几条记录开始查询.
    // $inputarr: 结合变量.

  SelectLimit() 也有一个可以将查询结果保存到缓存中的函数 CacheSelectLimit(),该函数将查询到的结果保存到缓存中去.下一次查询,如果存在相同的查询,就可以直接从缓存中获取. 该函数只是增加了一个控制缓存数据存储时间的$sec参数.语法如下:

CacheSelectLimit([$sec,] $sql [$numrows=-1] [,$offset = -1] [, $inputarr = false] );

提高:清除ADODB的缓存.

  前面我们知道支持缓存功能的两个函数,当然也有清除缓存的方法:

    第一种方法:让缓存超过保存缓存时所设置的时间,超过缓存时间,系统将会自动清除.

    第二种方法:调用CacheFlush()函数,它可以清除ADODB中所有的缓存.

ADODB提供的函数:

  应用GetInsertSQL(),GetUpdateSQL()函数增加,更新数据.

  1.使用GetInsertSQL()函数向数据库中添加新的记录.语法如下:

GetInsertSQL( &$rs , $arrFields );
    //参数$rs 用于设置要添加记录的结果集
    //参数 $arrFields用于设置新记录的字段值及字段名称.

  2.使用GetUpdateSQL()函数更新数据库中指定的记录.语法如下:

GetUpdateSQL( &$rs , $arrFields , $forceUpdate =false );
    //$rs: 用于指定要更新的结果集
    //$arrFields: 指定要更新的字段和内容.
    //$forceUpdate: 控制更新操作是否执行.如果 该值为true,则无论 $rs,$arrFields 的值是否相等都将更新.

扩展:操作sql语句的其他方法

  除了常用的方法调用sql语句外,还有一些方法能够实现特殊的操作,这些方法用得相对较少.

 

  函数语法  说 明
DBDate($date) 实现不同数据库之间时间格式的转换.如mysql数据库使用的时间是Y-M-D,而 oracle 则为 D-M-Y.参数$date 是要存储的时间.
qstr($string) 使用引号来处理字符串.例如.一个字符串包含了单引号" ' ",在mysql 中可以直接使用" ' "表示,但在其他数据库中则使用" '' "表示.使用qstr()函数可以解决这个问题.
affected_rows()  该函数用于获取最后更新或被删除的记录数.如果数据库不支持,则返回false.

 

Insert_ID()   返回最后插入的记录Id 值.如果数据库不支持,则返回false.

  

  6.获取结果集.

    对sql语句进行操作后多数会返回一个结果集(ADORecordSet对象).通过对改对象进行各种操作.要对其进行操作,

  首先要确认结果集中指针的位置.控制指针的方法说明如下:

方法 说                明
fields 变量   保存当前指针所指向的记录.  
EOF  变量   记录当前指针所指向是否为最后一条记录.如果是返回true,否则返回false.
MoveNext()函数   将当前指向指针指向下一条记录.
Move($to)函数 将当前的执行指针移动到结果集的知道位置.如果$to=0,则指向第一条,如果$to的值大于结果集的记录数,则指向最后一条.
MoveFirst()函数   将指向指针移动到第一条记录,等价于Move(0);
MoveLast()函数. 将指向指针移动到最后一条记录,等价于Move(RecordCount()-1);

    控制结果集内容的方法.方法说明如下:

方法 说        明
CurrentRow   返回当前指针所指的记录序号.第一条记录为0.  
FieldCount()   返回结果集中的字段数
RecordCount()   返回结果集中的记录数.
GetArray([$number_of_rows])   返回从当前指针开始,到($number_of_rows -1)行的全部记录的数组.$number_of_rows是给出的记录行.如果没有,则一直到EOF才停止.
FetchRow()   返回当前指针指向的记录的数组,如果是EOF,返回false.FetchRow()不要与MoveNext()混用.
FetchField($cloumn_number) 返回一个对象,包括字段$cloumn_number的名称和空间长度等相关信息.$cloumn_number 用于指定要查看的字段名称.
FetchNextObject( [$toupper = true] )   返回当前指针所指向的记录的对象形式,并且指针自动下移一行.$toupper值为true,则字段名为大写形式.
UserData($str , [$fmt]) 将日期字符串$str转换为$fmt设置的日期格式.$str为被转换的日期格式,$fmt 为要转换成的日期格式.默认为Y-m-d
UserTimeStamp( $str,[$fmt]) 将时间字符串$str转换为$fmt设置的时间格式.$str为被转换的时间格式,$fmt 为要转换成的时间格式.默认为Y-m-d H:i:s
MetaType($nativeDBType [,$field_max_length] ,[$fieldobj])   不同的数据库对相同的数据类型有不同的表示方法.如支持超长文本的类型,有这些表示方法:text,long character,clob 等.此函数将这些表示方法统一起来.如D(日期),T(时间),C(字符)等.$nativeDBType 表示数据表中的数据类型, $field_max_length 表示字段的最大长度 ,$fieldobj用于表示字段对象.

 MetaType()函数支持的标准化数据类型:

  数据类型         含    义    
C 支持 char ,varchar等字符类型
X 支持text,long character等长类型  
B blob 或binary image类型
D 日期类型.
T 时间类型timestamp
L 逻辑类型和位类型.
N 包含编号,整型和浮点型等数字类型
R 好汉序列和自动增加整数等序列类型.

  7.关闭连接.

     关闭连接当然是调用close()方法.如$conn ->close();  //^_^

 

<ADODB中的分页.>

  ADODB有属于自己的分页函数,它完美的解决了ADODB浏览大量数据的问题.分页函数如下:

  函  数     说  明  
PageExecute( $sql, $nrows, $page ) 执行分页功能.参数 $sql 用于指定查询语句;$nrows 为每页显示的记录数;$page 用于获取当前页码,默认为1.
CachePageExecute( $sec, $sql, $nrows, $page )   见名知义,它不但有PageExecute()的功能,而且可以将其存储到缓存中,并且在$sec 秒内重复查询,则在缓存中存取数据.
AbsolutePage($page = -1)             返回当前的页数.它需要与PageExecute()函数配合使用.
AtFirstPage( $status = '')     如果当前页是第一页,则返回ture.它需要与PageExecute()函数配合使用.
AtLastPage( $status = '') 如果当前页是最后一页,则返回ture.它需要与PageExecute()函数配合使用.

扩展:一个小巧的分页函数.ADODB_Pager()函数.

  ADODB_Pager()函数 是ADODB_Pager类中的一个构造函数,通过类中的Render()函数可以实现分页功能.语法如下:

ADODB_Pager( $conn, $sql, $id = 'adodb', $showPagelinks=false);
    //id:每个分页的id 号;
    //$showPagelinks:用于设置是否显示每个分页的连接,默认为false.

  实现该分页函数的前提条件就是:要包含adodb中的adodb.inc.php 和adodb-pager.inc.php文件.

  

<错误处理.>

  操作过程中,难免会出现错误.ADODB处理和调试错误的方法有:

  1. debug变量.

    如果变量被设置为true,那么当有输出操作时,同时也输出调试信息(debug 被启动,则会自动调用 ErrorMessage() 函数.).

  2. ErrorMessage()

    ErrorMessage()函数返回最后的状态或者出错信息.即使没有错误信息发生,也会返回一个字符串.所以一般情况下,只有在发生错误时(返回false),才调用该函数.例如:

View Code
<?php
    include_once('conn/conn.php');
    $conn -> debug =true;
    $sql = ' select * form tb_user '; //关键字from ,此处出错.
    $rst = $conn -> execute( $sql ) or dir( $conn -> errorMsg());
?>

 

ps.整理得有点乱...

posted @ 2012-09-24 00:49  time4cnblogs  阅读(785)  评论(1编辑  收藏  举报