1.11 ADODB连接数据库技术专题
PHP为各种版本的数据库定义了庞大的函数群来支持,而且很完整,那为什么本系统要使用ADODB来对数据库进行操作呢?原因在于ADODB的优势:一次编写,无须修改。也就是说,当系统使用的数据库需要更换时,只要更新数据库、数据表即可,不需要再重新编写源码了,这为后期维护节约了一大笔开销,而且不需要长时间关闭网站,这是PHP函数所无法比拟的。下面着重介绍ADODB技术。
1.11.1 ADODB简介
由于PHP存取函数没有标准化,不同数据库间的函数名称、参数差异很大,在更换数据库时,会带来大量的代码修复工作。这时,就需要一组函数库来隐藏不同资料库函数界面间的差异,让开发者可以很简单地去切换资料库,这就是ADODB。ADODB目前支持MySQL、Oracle、Microsoft SQL Server、Sybase、PostgreSQL、Foxpro、Access、ADO和ODBC等大多数知名的、不知名的数据库类型。
1.11.2 ADODB的安装
要使用ADODB来操作数据库,首先就要获取和安装ADODB。读者只要到网上下载ADODB包,解压到Web服务器目录下即可。
说明
要使用ADODB,使用的PHP必须是4.0以上的版本。
1.11.3 ADODB常用函数及说明
下面介绍ADODB中的常用函数。
1.PConnect($host,$user,$password, $database)
该函数中的参数说明如下。
$host:数据库服务器地址。
$user:数据库用户名。
$password:数据库密码。
$database:连接的数据库。
如果连接成功则回传true,失败则回传false。
2.SelectLimit($sql,$numrows=-1,$offset=-1)
该函数中的参数说明如下。
$sql:执行的SQL语句。
$numrows:显示的记录条数。
$offset:从第几条记录开始计算。
这个函数和MySQL里的limit子句相似,但要注意,limit后面的两个参数的顺序(limit offset,numrows)与这个函数是完全相反的。
3.ErrorMsg()
回传错误信息。当Execute()函数出现错误时,使用ErrorMsg()函数可以查看最后出错的相关信息。使用方法如下:
… $recordset = $conn->Execute("select * from tb_audio") if(!$recordset) //判断Execute()函数执行中是否有错误 echo $conn->ErrorMsg(); else{ … }
即使没有出现错误,ErrorMsg()也会回传最后的状态值,在这种情况下一般不需要输出。
4.RecordCount()
回传结果集里的记录数。使用方法如下:
… $sql = 'select * from tb_account'; $rs = $conn->Execute($sql); //执行SQL语句 echo $rs->RecordCount(); //输出查询结果数 …
5.FieldCount( )
回传结果集里的字段数。使用方法同上。
6.MoveNext( )、Move( )、MoveFirst( )、MoveLast( )
MoveNext():移动指针到下一条记录。
Move($to):移动指针到指定的列($to)。这里使用的是绝对定位,如$to是10,就移动到结果集中的第10条记录。如果$to大于记录总数,指针将移动到最后。要注意的是,部分数据库不支持向后移动指针。
MoveFirst( ):实际上就是Move(0),指针移动到结果集头部,部分数据库不支持该函数。
MoveLast( ):指针移动到结果集的尾部,也可以表示为Move($recordCount() -1),部分数据库不支持此函数。
最后介绍ADODB中的常量。
7.$ADODB_FETCH_MODE
该常量决定了结果集以哪种方式将数据回传。在有些数据库中,使用$recordset->fields[]仅支持字段编号为索引,即0、1、2等,不支持字段名(如id、user)为索引,这时,可以使用该常量进行设置,该常量的值有:
define('ADODB_FETCH_DEFAULT',0); //系统默认值 define('ADODB_FETCH_NUM',1); //以字段编号为索引 define('ADODB_FETCH_ASSOC',2); //以字段名称为索引 define('ADODB_FETCH_BOTH',3); //同时用编号和名称
这时上面的步骤可以改为:
… $conn = &ADONewConnection("mysq"); $conn->PConnect("db_online"); $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $recordset = $conn->Execute("select * from tb_audio"); if(!$recordset) //判断Execute()函数执行中是否有错误 echo $conn->ErrorMsg(); else{ while(!$recordset->EOF){ //如果没有错误,则配合while语句循环输出结果 echo $recordset->fields[id]."<br>"; $recordset->movenext(); //指针下移 } } …
这里建议将$ADODB_FETCH_MODE的值固定为ADODB_FETCH_NUM及ADODB_FETCH_ASSOC,不建议使用ADODB_FETCH_BOTH,因为许多驱动程序并不支持该常量。
ADODB的常用函数就介绍这么多了。如果读者感兴趣,可以下载ADODB手册来学习更多内容。
1.11.4 不同数据库之间的转换
使用ADODB的优势就是可以在以后的升级中更换不同的数据库,而不用大量地改动源程序。但不同数据库之间,有的SQL语句或语法是不相同的,这时就要做一些小幅的调整。
在conn.php文件中,更改连接的数据库类型和参数:
$conn = &ADONewConnection('mysql'); //建立MySQL连接 //连接“db_online”数据库 $conn->PConnect("localhost","root","root","db_online");
如使用SQL Server时,上面的连接语句更改为:
$conn = &ADONewConnection('mssql'); $conn->PConnect("localhost","sa","","db_online");
注意包含时间类型的SQL语句。不同的数据库对于时间的表示法是不同的,如MySQL使用时间类型时,就像使用字符类型一样,放到单引号里就可以了,但Access则需要放到“#”之间。Oracle虽然也是使用单引号,但它的格式为“日-月-年”,而其他数据库大多都是“年-月-日”。
尽量使用通用的SQL语句。尽管国际标准化组织(ISO)在1987年创建了SQL的一个标准,但在各种SQL之间仍然存在差别。所以为了增加通用性,最好先了解数据库间的不同。例如,MySQL中的limit子句,在Oracle中就不被支持。