PEAR的MDB2使用心得

来源:互联网 发布:天猫 淘宝商城棉服 编辑:程序博客网 时间:2024/06/06 07:06

http://hi.baidu.com/sing520/item/8442ab3d2b37e7627d034b3f

http://baike.baidu.com/link?url=C7pz01E_Wm6BE_82U6UiEnoT3WvbWsTALOQW_lW4-KQofJmS-20jtKbUbTW479Ji


PEAR的MDB2使用心得 | | 分类:技术探讨 | 作者: ziming | 发表于: 2007/12/12 01:19说使用心得还有点谈不上,刚接触MDB2不到两周。由于服务器升级,新的服务器系统不再安装DB包,PEAR的官方站也明确表示“This package has been superseded, but is still maintained for bugs and security fixes. Use MDB2 instead.”。不得已,研究了一个下午,终于入门了。到现虽然只在两个小项目上小试牛刀,还是有些心得体会的。现在信息扩展之迅速,技术更新之快,倘若你的头脑缓存周期太长,恐怕你费尽心血写出来的东西还没来得及上线下一个版本就出来了。

入题:
"PEAR MDB2 is a merge of the PEAR DB and Metabase php database abstraction layers.”, 这是PEAR官网上的一句话,大致是说“PEAR是建立在PHP和数据库之间的一个层”。既然是一个中间层,那么它一定有丰富的扩展功能和灵活的可移植 性。就是说你可以把mysql数据库转换为sql server数据库而不需要重写程序,只需要把连接数据库的函数修改一下即可。这点好处我还没有体会到。不过官方文档中还说它有更方便的错误机制处理更安 全,Agree.
这里不谈安装,只讲使用。因为打包特别简单,到http://pear.php.net/package/MDB2/download下载解压到你的php include path里即可,不要忘记下载MDB2 Driver哦。或者直接使用命令"$ pear install MDB2 $ pear install MDB2#mysql”。
第一步:连接数据库
MDB2 提供两种连接方式:DSN&Socket,首选DSN。提供三个连接函数:factory()、connect()、singleton(),分别表示 Efficient, Eager, Available连接,就是说factory()是最有效率的连接函数,因为在你只调用factory()的时候它并没有去连接数据库,只有在你发送 query请求的时候才会连接;connect()调用时立即连接数据库;而singleton()顾名思义“单独”,为你一个进程只建立一个连接时方便 使用,它同样是一个"lazy connecting".
示例函数如下:(其中有一项:$mdb2->setFetchMode(2)是设置数据结果返回的形式为数组)
<?php
/*********************************************************
* MDB2 function
* connect to primary database & slave database
*
* Ziming <jorygong@gmail.com>
* 2007-12-6
**********************************************************/

require_once("MDB2.php");

//Connecting primary database;
function &open_pdb()
{
   $dsn = array(
     'phptype'   => "mysql",
     'username' => "root",
     'password' => "",
     'hostspec' => "localhost",
     'port'     => 3306,
     'database' => "test",
   );
   $mdb2 = &MDB2::singleton($dsn);
   if (PEAR::isError($mdb2))
   {
     exit($mdb2->getMessage());
   }
   $mdb2->setFetchMode(2);
   return $mdb2;
}

//Connecting slave database;
function &open_sdb()
{
   $dsn = array(
     'phptype'   => "mysql",
     'username' => "root",
     'password' => "",
     'hostspec' => "localhost",
     'port'     => 3306,
     'database' => "test",
   );
   $mdb2 = &MDB2::singleton($dsn);
   if (PEAR::isError($mdb2))
   {
     exit($mdb2->getMessage());
   }
   $mdb2->setFetchMode(2);
   return $mdb2;
}

//Disconnecting a database
function close_db(&$mdb2)
{
   if(is_object($mdb2))
   {
     $mdb2->disconnect();
     $mdb2 = "";
   }
}

?>
打包下载:下载文件 (已下载 31 次)点击这里下载文件: mysql.rar
第二步:发送请求
MDB2 有两种Performing queries方法:query()和exec(),它们分别产生两种结果:成功时返回执行结果和失败时返回MDB2_Error对象。但它们又有不 同,query()是请求并取值,它一般用于SELECT,SHOW等,返回符合条件的数据;而exec()是执行的意思,所以它一般用于INSERT、 UPDATE或DELETE,返回语句成功执行后所影响的行数。
例如:

<?PHP
//假设你已经建立MDB2对象$mdb2
$sql = "SELECT * FROM tableA";
$res = $mdb2->query($sql);
//习惯性检查语句是否被正确执行
if (PEAR::isError($res))
{
     exit($res->getMessage());
}

$sql = "INSERT INTO tableB (`id`, `nickname`) VALUES ($id, '$nickname')";
$affected = $mdb2->exec($sql);
//习惯性检查语句是否被正确执行
if (PEAR::isError($affected))
{
     die($res->getMessage());
}

?>
注意:当你使用$mdb2->query()后得到的并不是数组矩阵,而是$mdb2对象,你需要使用fetchOne(),fetchRow(),fetchCol()或fetchAll()来获得你想要的值,这将在接下来讲到。

第三:引用包含Quoting and escaping
MDB2提供两个函数来引用SQL语句里的值,分别是Quoting() and escaping()。
在DB库发展到后期,开发人员推荐使用quoteSmart()或escapeSimple()来代替quote().
"This method has been deprecated. Use quoteSmart() or escapeSimple() instead."
但是在MDB2里,我们需要更多地使用quote(),它有4个参数,quote(要quote的值,值的类型,是否使用quote对值进行处理,是否escape通配符),只有第一个参数是必须的。例如:

<?PHP
$sql = "INSERT INTO tableA (`id`, `nickname`, `is_member`) VALUES ("
   .$mdb2->quote($id, "integer").","
   .$mdb2->quote($nickname, "text", true).","
   .$mdb2->quote($is_member, "boolean", false).")";
echo $sql;
//输出结果形如
//INSERT INTO tableA (`id`, `nickname`, `is_member`) VALUES (2, 'jory', 1)

?>
允许的类型有:text, boolean, integer, decimal, float, time stamp, date, time, clob, blob.
其中clob和blob是两种存储不限制长度的大数据对象格式,clob表示以字符串形式存储,blob表示以二进制的形式存储。它们的区别请查阅相关资料。
这 样做对SQL语句的严格要求来减少数据库的安全隐患。用的时候你会发现如果类型为text时,当传入变量值为空时,quote后的SQL语句对应值为 null,所以我们在设计数据库结构的时候要注意不能把所有的字段都设为not null,允许为空的字段要设计为null.


第四:取得结果数据
上面说到使用query()函数得到的返回值是MDB2对象而不是我们需要的数据,那怎样获得我们存储的数据内容呢,就需要在请求query()后再去取,四种方法:
fetchOne(), fetchRow(), fetchCol() and fetchAll().使用过DB库的朋友们看这些函数是不是很眼熟,对的,它就是获取结果集:取一个,取一行,取一列,取所有(比如一个数组矩阵),配 合setFetchMode()方法获取你想要的数据形式。
例如:(由于我已经在前的数据库连接函数内使用了$mdb2->setFetchMode(2),这里的返回结果是字符串索引的数组)

<?PHP
$sql = "SELECT `id`, `nickname` FORM tableA";
$res = $mdb2->query($sql);
if (PEAR::isError($res))
{
     exit($res->getMessage());
}
$data = $res->fetchAll();

print_r($data);

/*
将打印出如下形式数据
Array
(
     [0] => Array
         (
             [0] => 1
             [1] => jory
         )

     [1] => Array
         (
             [0] => 2
             [1] => ziming
         )

     [2] => Array
         (
             [0] => 3
             [1] => gong
         )

)
*/

?>

这样每次取数据都要写两行程序,使用MDB2库并没有减少我们敲击键盘的次数。别急,当然更好的方法能让你一步达成:
queryOne(), queryRow(), queryCol() and queryAll(). "All of the fetch methods are also available in a variant that executes a query directly"
ex.

<?PHP
//建立数据库连接对象$mdb2后
$sql = "SELECT * FROM tableA";
//一步达成
$data = $mdb2->queryAll($sql);
//结果显示
print_r($data);

?>
第五:预编译及批量处理Prepare & Execute
很多人都喜欢使用prepare()和execute()方法,而我就不太喜欢。我觉得她功能强大但使用起来过于复杂,但事实是她使用起来也很方便的。我喜欢简约一些的,或许是我还没有跨过那道门槛吧。正在尝试...相信有一天我会和她混熟的。
既然是“预编译+批量处理”,那么你只需要简单的两步就能实现对一堆数据的处理:
第一步,整理你的SQL语句(prepare the statement)。第二步,执行(execute it)。
例如:

<?php
//已经建立一个数据库连接对象$mdb2
$types = array('integer', 'text', 'text');
$sql = "INSERT INTO tableA VALUES (?, ?, ?)";
$sth = $mdb2->prepare($sql, $types);
$data = array(1, 'jory', 'I do');
$affectedRows = $sth->execute($data);

?>
OK, MDB2的基本使用就说到这里吧,其它的关于事务处理、扩展模块、API接口等等非三二句话能讲得清楚的,欲深究请查阅手册和相关技术文档。

0 0
原创粉丝点击