博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PHP数据库抽象层PDO、ADODB、PHPLib

Posted on 2010-08-12 22:58  阳光-浪漫  阅读(1870)  评论(0编辑  收藏  举报

首先说一下数据库抽象层的定义,也就是什么是PHP的数据库抽象层:
所谓PHP数据库抽象层就是指,封装了数据库底层操作的介于PHP逻辑程序代码和数据库之间的中间件。
目的是为了隐藏各种数据库因为数据库方言的不同,而在存取中存在的差异。使PHP编码系统在数据库变更的时候,做到改动最小,或者只需要修改数据库配置文件即可。

当你使用了PHP数据库抽象层的时候,底层的数据库是什么对你来说已经不重要,重要的是这个抽象层的统一的语法格式。这样开发工作者就不必为了适应某种数据库而再去学习一套Sql的语法。

打个比喻来说:
PHP数据库抽象层就是一个SQL语言的翻译。象我们在国际环境中看到的翻译一样,能够把我们的语言翻译成各种数据库需要的语言。

我们尽管说中文,至于外国人是否听的懂那是翻译的事情,我们不至于为了和英国人说话去学习英语;有一天我们遇到了印第安人就必须学习印第安语言。只要这个翻译听的懂汉语又能够翻译成英语、印第安语……等对方需要的语言就行了!
这里的我们就像PHP程序,翻译就是数据库抽象层,印第安人和英国人就是各种不同的数据库!

显然,衡量一个PHP数据库抽象层的“优秀”(其实只有合适你的才是优秀的,这里说的优秀是按照上文的定义来说的)与否主要就是:

针对不同数据库的操作,是否具有统一的方法和语法;
数据库发生变更的时候,PHP程序是否需要大量改动。

于是我们就用这两个标准来看一下流行的三种PHP数据库抽象层:PDO、ADODB、PHPLib
其实还有更多,但是我们只说说这三个具有代表性的层。

PHP数据抽象层PDO(PHP Data Objects Layer):

PDO以PHP 5.1为基础进行设计,它使用C语言做底层开发,设计沿承PHP的特点,以简洁易用为准,从严格意义上讲,PDO应该归为PHP 5的SPL库之一,而不应该归于数据抽象层,因为其本身和MySQL和MySQLi扩展库的功能类似。

但是在使用上依然使用原生的SQL,这就使他没有在PHP环境中的数据库发生变化的时候做出相应的反应,例如这个在Oracle中很平常的语句,在Mysql中就就会收到一个未知字段的错误:
select * from area where rownum<10;
也就是说PDO是不适合用在打算或者有可能会变更数据库的系统中的。

PHP数据抽象层ADODB(Active Data Objects Data Base):

ADODB不管后端数据库如何,存取数据库的方式都是一致的;
转移数据库平台时,程序代码也不必做太大的更动,事实上只需要改动数据库配置文件。
例如从Mysql移植到Oracel你需要把下边语句中ADONewConnection的参数修改为oci8:
ADONewConnection(’mysql’);
很简单吧?

因为他在用户拼装Sql语句的时候提供了大量的拼装方法,目的就是针对不同的数据库在抽象层的底层对这些语句进行针对性的翻译,以适应不同的数据库方言!

比如从MS SQL Server转移到MySQL,在MS SQL Server中使用指令“SELECT TOP 15 name FROM employee”取得数据的前15条,可在MySQL中却不支持这种写法,而要写成:SELECT name FROM employee LIMIT 15。
它似乎对我们敲响了警钟,应该停止在查询语句中使用非标准SQL指令,而去认真地学习标准的SQL。
幸运的是,ADODB有一个处理 LIMIT的方法:SelectLimit(),这样我们就根本不用管连接的是MySQL还是MS SQL Server,ADODB会在底层为我们自动转换,请见下面的脚本例子:

 

这样ADODB已经比PDO更加强大了,但是这个抽象层似乎体积过于庞大了,全部文件大概有500K左右,如果你做一个很小的网站的话,用这个似乎大材小用了——还可能是你的网站程序文件看起来也会过于肥胖,呵呵!

PHP数据库抽象层PHPLib :

PHPLib可能是伴随PHP一同成长最老的数据库抽象层(但和ADODB相比,它只算是一个MySQL抽象类库),当前最新版本为7.4a。我们只需要它的数据库访问功能,除了支持MySQL外,它也同时支持访问Oracle 8以上版本的数据库。

这个抽象类使用方法相当简单,实例化他一个对象就可以使用$obj->query();发送语句,$obj->next_record();移动记录指针,$obj->f(‘column-name’)取得结果了。体积小,是小型网站开发不错的选择。当然他也使用的是原生的Sql,自然也存在数据库移植的问题。

view source
< id="highlighter_536706_clipboard" title="copy to clipboard" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="16" height="16" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" type="application/x-shockwave-flash">
print?
01 <?php
02 include_once("libs/adodb/adodb.inc.php");
03 // 创建一个mysql连接实例对象
04 $db= NewADOConnection("mysql");
05 // 打开一个数据库连接
06 $db->Connect("localhost","root","passwd","adodb") or die("Unable to connect!");
07 // 构造并执行一个查询
08 // 我们要取得5行记录,从符合记录的第3行开始取
09 $query="SELECT * FROM library";
10 $resul=$db->SelectLimit($query,5,3) or die("Error in query: $query. ".$db->ErrorMsg());
11 // 遍历记录集
12 while(!$result->EOF){
13  echo $result->fields[1]." - ".$result->fields[2]."\n";
14  $result->MoveNext();
15 }
16 // 清理无用的对象
17 $db->Close();
18 ?>