佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 808|回复: 2

[PHP]PEAR DB将数据库工作简化

[复制链接]
发表于 4-11-2005 07:33 PM | 显示全部楼层 |阅读模式
有经验的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()再加上一个DSN(一段连接数据库所需的字串。DSN的格式如下:


  1. sqltype://username:passwd@protocol+host/database?option=value
  2. Example: $dsn =  “mysql://username:passw0rD@localhost/mydb”
复制代码


Sqltype是指数据库平台,详细的字串可以到DSN网页参考。
接下来再把DSN传入DB::connect()参数

  1. $conn = & DB::connect($dsn);

  2. If(Pear::isError($conn)){
  3.         die($conn->getMessage());
  4. }
复制代码

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

待续..

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

[ 本帖最后由 苦瓜汤 于 4-11-2005 08:24 PM 编辑 ]

评分

参与人数 1积分 +21 收起 理由
Sirius + 21 精品文章

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 4-11-2005 08:49 PM | 显示全部楼层

2.DB::common界面

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


  1. --Select

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

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

  5. $row = $result->fetchRow();
  6. print_r($row);

  7. $conn->disconnect();
复制代码


如果你熟悉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的结果是否有错误。编码如下:

  1. if(PEAR::isError($result)){
  2.         die($result->getMessage());
  3. }
复制代码

和之前一样如法炮制,只是将对象由DB::common改成DB::result。
DB::common也提供了两个很方便的方法让PHP能够简单地处理INSERT和UPDATE,prepare()和execute(),这两个组合可以让你很轻松的同时处理多个INSERT和UPDATE  statement。prepare()主要现载入需要执行的statement,而execute将负责执行,同时也载入所需的参数。看看以下的例子:


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

  4. if(PEAR::isError($stn)){
  5.         die($stn->getMessage());
  6. }

  7. $conn->freePrepared();
复制代码


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


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

  7. if(PEAR::isError($stn)){
  8.         die($stn->getMessage());
  9. }

  10. $conn->freePrepared();
复制代码

几个繁杂的程序在几行就可以完成了,关键就在于$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查看。

待续..
回复

使用道具 举报

 楼主| 发表于 5-11-2005 10:45 AM | 显示全部楼层

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内的资料从记忆体中撤走。

这个例子是将以上几种方法一起运用:

  1. $conn->setFetchMode(DB_FETCHMODE_ASSOC);
  2. $result = $conn->query($sql);

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

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

  7. $result->free();
复制代码


完。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 21-9-2024 12:34 PM , Processed in 0.096073 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表