`
thunderbow
  • 浏览: 154556 次
  • 性别: Icon_minigender_1
  • 来自: beijing
社区版块
存档分类
最新评论

PEAR DB将数据库工作简化

阅读更多

有经验的PHPer应该对PEAR*都不会陌生,不过对新手来说,简单的练习PEAR应该不必派上用场,不过在开始接触复杂的编程时,PEAR对PHPer来说可以说是一个很有效的工具。到底什么是PEAR我这里不详细讨论了,因为答案都在pear.php.net,不过这里得介绍一个很好用的工具 -- DB,这是一个以PEAR为基础的数据库抽象层;虽然PHP已经有内建的数据库函式,不过功能有限,而且不容易转移平台。例如通常连接MySQL的函式是mysql_connect(),而PostgreSQL则是pg_connect(),虽然你大可将mysql_[x]改成pg_[x],不过如果你的数据库抽象层的源码超过500行的话这将是一个恶梦!如果你的数据库函式是散布在你的源码,那就更恐怖了。所以,这时候需要有一个跨平台的数据库界面抽象层来为你完成大部分的工作,包括连接,query,update等等,而且还需要提供debug的功能。PEAR DB正是一个这样的工具,提供多种平台包括dbase, Frontbase, InterBase, Informix, MiniSQL, MSSQL, MySQL, Oracle, ODBC, PostgreSQL, SQLite, Sybase。PEAR DB可以完全作为一个PHP程序的数据库层,而且速度也很理想(当然不比直接用mysql_query来得快,不过在大型的程序中可以凸现它的效果),所有的功能都包含在三个类型中,用法也很简单。以下我将介绍这三种类型:

1.DB类
DB类为PEAR DB的主干,所有的函式以静态呼叫,所以在运用的时候不需要实体化,可以直接呼叫。当你有了其中一个以上所提到的数据库之后,第一步就是连接数据库了,利用DB::connect()再加上一个[url=http://pear.php.net/manual/en/package.database.db.intro-dsn.php]DSN[/url](一段连接数据库所需的字串。DSN的格式如下:

[code]
sqltype://username:passwd@protocol+host/database?option=value
Example: $dsn =  “mysql://username:passw0rD@localhost/mydb”
[/code]

Sqltype是指数据库平台,详细的字串可以到DSN网页参考。
接下来再把DSN传入DB::connect()参数
[code]
$conn = & DB::connect($dsn);

If(Pear::isError($conn)){
        die($conn->getMessage());
}
[/code]
$conn是由DB::connect()传回来的一个界面实体,接下来它将扮演一个很重要的角色;注意下面一段,这里运用到PEAR::isError()来检查$conn是否是DB error物件,要是有错误的话,$conn将会自动释出错误信息。getMessage()这个函式存在于DB error类型,随时可以调用。



*PEAR一般上是随PHP一起安装的,如果要另外安装的话,可以下在PHP的完整压缩包,执行里面的do-pear.bat就可以了。(DB已经包含在PEAR安装包里面了,所以不需要另外下载。)


 

 
2.DB::common界面

刚刚的$conn就是这个界面类型的实体,这个界面将负责大部分的数据工作,包括select, update, insert等等。这个界面包含了大量功能强大的函式,不过我将介绍几个重要的。

[code]
--Select

$sql = “SELECT * FROM blah”;
$conn->setFetchMode(DB_FETCHMODE_ASSOC);

$result = $conn->query($sql);

$row = $result->fetchRow();
print_r($row);

$conn->disconnect();
[/code]

如果你熟悉PHP的数据库方法的话,应该对[x]_fetch_assoc不会陌生,没错,意思大致上相同。DB::common 的默认设定是DB_FETCHMODE_ORDERED, 和[x]_fetch_row大致上相同,以上例子我将fetchmode利用DB::common::setFetchMode()将它改为DB_FETCHMODE_ASSOC,得出的$result将会和[x]_fetch_assoc相同,都是以fieldname作为引索。这里的$result( DB::result ) 和mysq_query()所传回的差不多,是PEAR DB里面另外一个重要的类型,稍候会作介绍;如果需要得到一行的数据,可以用DB::result::fetchRow(),就可传回一个数据行的阵列。

之前所提到的PEAR::isError()也可以用来检查$result的结果是否有错误。编码如下:
[code]
if(PEAR::isError($result)){
        die($result->getMessage());
}
[/code]
和之前一样如法炮制,只是将对象由DB::common改成DB::result。
DB::common也提供了两个很方便的方法让PHP能够简单地处理INSERT和UPDATE,prepare()和execute(),这两个组合可以让你很轻松的同时处理多个INSERT和UPDATE  statement。prepare()主要现载入需要执行的statement,而execute将负责执行,同时也载入所需的参数。看看以下的例子:
[code]

$conn->prepare(“INSERT INTO foo (fname, fage, flocation) VALUES (? , ? , ? )”);
$data = array(“foo”,23,”earth”);
$conn->execute($stn, $data);

if(PEAR::isError($stn)){
        die($stn->getMessage());
}

$conn->freePrepared();
[/code]

“?”这里是代表参数,$data里面的数据会依次序被传入prepare()里面的statement里面的”?”参数。所有的数据将会自动呼叫escaped string来将一些意义符号字串化,而且execute()也会自动辨认数据类型,例如数字,字串等等。那么如果要输入超过一行以上的数据呢?可以简化吗?答案是肯定可以了,参考下面的例子你就会发现,DB是多么不可思议了
[code]

$conn->prepare(“INSERT INTO foo (fname, fage, flocation) VALUES (? , ? , ? )”);
$data = array(array(“foo”,23,”earth”),
array(“faa”,21,”moon”),
array(“fee”,25,”mars”)
array(“fii”,19,”Pluto”));
$conn->executeMultiple($stn, $data);

if(PEAR::isError($stn)){
        die($stn->getMessage());
}

$conn->freePrepared();
[/code]
几个繁杂的程序在几行就可以完成了,关键就在于$data和DB::common::executeMultiple()。$stn是execute()或executeMultiple()所传回的结果,他有三种可能性:第一,DB::result,可以将statement的结果数据转为result实体;第二,定义常数DB_OK,代表statement成功执行;第三,DB error实体,后面的PEAR::isError()就是检查传回是否为DB error。如果要用同一个DB::common资源进行另一个query,必须呼叫DB::common::freePrepared()来清除之前prepared()内的statement。

DB::common可以说是PEAE DB的最重要的工作界面,大部分和数据的接触都在这里进行,而且功能也强大。除了以上说明的几个方法之外,DB::common还有很多个方法也是很实用的。详细的说明可以到pear.php.net查看。

待续..


 

 
3.DB result

顾名思义,DB result是由DB::common在query之后传回的数据组合。DB result本身是一个物件,所以内付几个很方便的方法。

--fetchInto()和fetchRow()
以上两个方法用法大致上相同,唯一个差别就在于前者将结果传给参数( $result->fetchInto($row));后者本身传回结果($row = $result->fetchRow()) 。与PHP内建的方法一样,fetchrow()每次将一行资料传回。

--numCols()和numRows()
这两个方法将分别传回DB result内Columns和Rows的数量。

--free()
将DB result内的资料从记忆体中撤走。

这个例子是将以上几种方法一起运用:
[code]
$conn->setFetchMode(DB_FETCHMODE_ASSOC);
$result = $conn->query($sql);

echo “There are “.$result->numRows().” Results found and “.$result->numCols().” fields are available.”;

while( $row = $result->fetchRow()){
        echo $row[‘name’];
}

$result->free();
[/code]

后记:
以上资料是基础篇,如果想要再深入可以到http://pear.php.net/package/DB PHP PEAR的网页,里面有详细的文件供参考。除了DB之外,PEAR网页内也有各式各样的数据库抽象层让人免费下载,包括LDAP, ADODB,还有类似DB的MDB2也是一个不错的选择。
分享到:
评论

相关推荐

    perl pear db

    PEAR 数据库操作插件 提供mysql,mssql,....的数据库德操作

    揭露PHP 应用程序中出现的五个常见数据库问题

    例如,使用 PEAR DB 模块可以将数据库连接字符串抽象出来,使代码更加易于维护和修改。 问题 2:不使用自动增量功能 不使用自动增量功能是另一个常见问题。自动增量功能可以自动为每条记录生成惟一标识符,避免了...

    PEAR:创建中间的数据库应用层

    PEAR 博文链接:https://spamer.iteye.com/blog/158148

    PEAR中Database(DB)使用介绍.mht

    PEAR中Database(DB)使用介绍

    Pear DB 新手入门指南教程第1/3页

    Pear DB,提供这样一系列的类: n 数据库抽象 n 高级错误处理机制 n 以及其它 2. 下载、安装Pear 由于现在Pear项目仍处于紧锣密鼓的开发之中,所以得到它的最好办法就是从CVS获得(Pear DB发行包已经跟随PHP4.0.6...

    PEAR

    下载后在PHP安装目录下...这个包是我最近才更新的,因为Pear是实时更新的,所以并不保证是最新版,有能力自己安装的朋友还是自己安装的为好。 如何安装Pear和使用Pear可以参考文章:不能正常看请您注册或登陆! ...

    PEAR教程PEAR教程PEAR教程

    不用多说了,一本pear的好书,值得下载,机不可失 不用多说了,一本pear的好书,值得下载,机不可失 不用多说了,一本pear的好书,值得下载,机不可失 不用多说了,一本pear的好书,值得下载,机不可失

    PHP核心教程 php pear php pear

    PHP核心教程 php pear php pear php pear php pear php pear php pear

    pear手册

    pear 英文版 对于入门级 pear 选手 适合

    pear包安装器go-pear

    老版PHP用go-pear.php,新版用go-pear.phar 用cmd命令行下:php.exe 文件名 试一下就知道了

    pear_2.3.5_D.apk

    pear_2.3.5_D.apk

    pear_2.1.6(2).apk

    pear_2.1.6(2).apk

    php-pear install

    php pear install pear安装包

    go-pear.phar

    go-pear go-pear go-pear go-pear go-pear go-pear

    PHP PEAR 安装包

    PHP PEAR 安装包 go-pear.phar

    Windows安装Pear所需文件

    Windows 安装Pear所需的文件,包含了go-pear.php以及go-pear.phar

    PEAR::DB::OO-开源

    PEAR::DB::OO 是一个抽象层,用于访问面向对象范式中的数据库表。 它面向 PHP 开发人员,是用 PHP 编写的。 它建立在 PEAR 的过程数据库抽象层 (PEAR::DB) 之上——请参阅 http://pear.php.net。

Global site tag (gtag.js) - Google Analytics