虽然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),才调用该函数.例如:
<?php include_once('conn/conn.php'); $conn -> debug =true; $sql = ' select * form tb_user '; //关键字from ,此处出错. $rst = $conn -> execute( $sql ) or dir( $conn -> errorMsg()); ?>
ps.整理得有点乱...