Home » php

Pear DB 入门指南

10 02月 2010 Views: No Comment Tags:

很久之前转的一篇文章,非常好,迁移blog的时候丢掉了,现补上,原址找不到了。
1. 简介 ———————————————————————————–1
2. 下载、安装 Pear————————————————————————-1
3 使用Pear DB—————————————————————————-1
3.1 连接,断开数据库
3.2 执行数据库
3.3 获得select的数据
3.3.1 获取数据的函数
3.3.2 选择获取数据的格式
3.3.3 设置获取数据的格式
3.3.4 控制获取数据数量
3.3.5 清除结果,释放变量
3.4 快速retrieve数据 ————————————————————————–2
3.5 从查询结果获得更多信息(numRows, numCols, affectedRows, tableInfo)
3.6 自动增长(Sequences)
3.7 Prepare & Execute/ExcuteMultiple
3.8 autoCommit, commit and rollback
4. 可用方法列表 —————————————————————————3
5 错误处理机制 —————————————————————————3
5.1 从Pear DB Error获得错误信息
5.2 Debug Pear DB Errors
5.3 对错误采取自动处理
1. 简介
这是一部指导我们如何使用Pear DB扩展。Pear DB,提供这样一系列的类:

数据库抽象 高级错误处理机制 以及其它

2. 下载、安装Pear
由于现在Pear项目仍处于紧锣密鼓的开发之中,所以得到它的最好办法就是从CVS获得(Pear DB发行包已经跟随PHP4.0.6以后版本捆绑发布)。所以,我们只需要把Pear的根目录放到php.ini配置文件 include_path中。也可以通过这样设置:

_set(‘include_path’, ‘/pear_base_dir’).

以下是strp by step示例:
存放Pear的目录:

# cd /usr/local/lib

用“phpfi“口令登录:

# cvs -d :pserver:cvsread@cvs.php.net:/repository login

用以下命令得到所有的pear文件,同时也可以用来更新已经下载的文件。其他的参数有:”today”, “last month”,等。我推荐用”last week”参数,因为一般bugs的提交和修改都是每周一次。

# cvs -d :pserver:cvsread@cvs.php.net:/repository export -D “last week” php4/pear

编辑php.ini文件加上下面一段在include_path处:

/usr/local/lib/php4/pear

如果没有修改的权限,可以通过这条语句在代码中实现:

ini_set(‘include_path’, ‘path_to_pear’);

获得PHP CVS的完全文档
注意Pear DB必需PHP版本4.0.4以上,而在Pear中的一些其他包如:XML Parser of the pear installer script需要PHP4.0.5以上版本。 3. 使用Pear DB
3.1 连接,断开数据库

<?php
 // The pear base directory must be in your include_path
 require_once 'DB.php';
 $user = 'foo';
 $pass = 'bar';
 $host = 'localhost';
 $db_name = 'clients_db';
 
 // Data Source Name: This is the universal connection string
 $dsn = "mysql://$user:$pass@$host/$db_name";
 
 // DB::connect will return a Pear DB object on success
 // or a Pear DB Error object on error
 // You can also set to TRUE the second param
 // if you want a persistent connection:
 // $db = DB::connect($dsn, true);
 $db = DB::connect($dsn);
 
 // With DB::isError you can differentiate between an error or
 // a valid connection.
 if (DB::isError($db)) {
         die ($db->getMessage());
 }
 ....
 // You can disconnect from the database with:
 $db->disconnect();
 ?>

数据源(上例中的$dsn 参数)有以下允许的格式:(从Pear/DB.php的parseDSN方法复制而来)

* phptype: Database backend used in PHP (mysql, odbc etc.)
* dbsyntax: Database used with regards to SQL syntax etc.
* protocol: Communication protocol to use (tcp, unix etc.)
* hostspec: Host specification (hostname[:port])
* database: Database to use on the DBMS server
* username: User name for login
* password: Password for login
*
* The format of the supplied DSN is in its fullest form:
*
* phptype(dbsyntax)://username:password@protocol+hostspec/database
*
* Most variations are allowed:
*
* phptype://username:password@protocol+hostspec:110//usr/db_file.db
* phptype://username:password@hostspec/database_name
* phptype://username:password@hostspec
* phptype://username@hostspec
* phptype://hostspec/database
* phptype://hostspec
* phptype(dbsyntax)
* phptype

现在支持的数据库有 (在 phptype DSN 部分):

mysql -> MySQL
pgsql -> PostgreSQL
ibase -> InterBase
msql -> Mini SQL
mssql -> Microsoft SQL Server
oci8 -> Oracle 7/8/8i
odbc -> ODBC (Open Database Connectivity)
sybase -> SyBase
ifx -> Informix
fbsql -> FrontBase

注意并不是所有数据库特征都支持,可以从根目录>/DB/STATUS 得到详细的清单。
3.2 执行数据库

<?php
 // Once you have a valid DB object
 ...
 $sql = "select * from clients";
 // If the query is a "SELECT", $db->query will return
 // a DB Result object on success.
 // Else it simply will return a DB_OK
 // On failure it will return a DB Error object.
 $result = $db->query($sql);
 // Always check that $result is not an error
 if (DB::isError($result)) {
         die ($result->getMessage());
 }
 ....
 ?>

3.3 获得select的数据
3.3.1 获取数据的函数

<?php
 // Once you have a valid DB Result object
 ...
 // Get each row of data on each iteration until
 // there is no more rows
 while ($row = $result->fetchRow()) {
     $id = $row[0];
 }
 ?>

除了fetchRow()还可以使用fetchInto()直接插入$row的值。

<?php
 ...
 while ($result->fetchInto($row)) {
     $id = $row[0];
 }
 ?>

3.3.2 选择获取数据的格式
获取模式有

DB_FETCHMODE_ORDERED(默认)
DB_FETCHMODE_ASSOC
DB_FETCHMODE_OBJECT

从获取数据方法返回的结果示例:

<?php
 $res = $db->query('select id, name, email from users');
 $row = $res->fetchRow($mode);
 
 //With $mode = DB_FETCHMODE_ORDERED
 //The default behavior is to return an ordered array.
 $row = array (
     0 => <column "id" data>,
     1 => <column "name" data>,
     2 => <column "email" data>
 );
 
 $id = $row[0];
 
 //With $mode = DB_FETCHMODE_ASSOC
 //Returns an associative array with column names as array keys:
 $row = array (
     'id'    => <column "id" data>,
     'name'  => <column "name" data>,
     'email' => <column "email" data>
 );
 
 $id = $row['id'];
 
 //With $mode = DB_FETCHMODE_OBJECT
 //Returns a DB_row object with column names as properties:
 $row = db_row Object 
 (
     [id]    => <column "id" data>,
     [name]  => <column "name" data>,
     [email] => <column "email" data>
 )
 
 $id = $row->id;
 ?>

3.3.3 设置获取数据的格式
可以使用 fetchrow() / fetchInto() 方法或者为你的DB实例设置一个默认的模式。

<?php
 ...
 // 1) Set the mode per call:
 while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
     [..]
 }
 while ($result->fetchInto($row, DB_FETCHMODE_ASSOC)) {
     [..]
 }
 
 // 2) Set the mode for all calls:
 $db = DB::connect($dsn);
 // this will set a default fetchmode for this Pear DB instance
 // (for all queries)
 $db->setFetchMode(DB_FETCHMODE_ASSOC);
 $result = $db->query(...);
 while ($row = $result->fetchRow()) {
     $id = $row['id'];
 }
 ?>

3.3.4 控制获取数据数量
同时Pear DB获取数据可以带有额外的参数,可以使用一个数字参数来获取需要的数据数量。在你只需要获得数据中的一部分时这时候特别有用(比如在做分页程序的时候)

<?php
 ...
 // the row to start fetching
 $from = 50;
 // how many results per page
 $res_per_page = 10;
 // the last row to fetch for this page
 $to = $from + $res_per_page;
 foreach (range($from, $to) as $rownum) {
     if (!$row = $res->fetchrow($fetchmode, $rownum)) {
         break;
     }
     $id = $row[0];
     ....
 }
 ?>

3.3.5 清除结果,释放变量
当你完成查询的时候,可以用free()方法来结束:

<?php
 ...
 $result = $db->query('SELECT * FROM clients');
 while ($row = $result->fetchRow()) {
     ...
 }
 $result->free();
 ?>

原创文章如转载,请注明:转载自Xixis Blog [ http://www.xixis.net/ ]
本文链接地址:http://www.xixis.net/archives/change-pear-db-getting-started-guide-2.html

Pages: 1 2 3

Leave your response!

Add your comment below, or trackback from your own site. You can also subscribe to these comments via RSS.

Be nice. Keep it clean. Stay on topic. No spam.

You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

This is a Gravatar-enabled weblog. To get your own globally-recognized-avatar, please register at Gravatar.