实战突击
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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中就不被支持。