选择显示字体大小

php5 oop编程之代理与定制异常

  一、 dbquery对象

  现在,我们的dbquery对象简单地模仿一个存储过程—一旦被执行,即返回一个必须进行保存的结果资源;并且如果你想使用该结果集上的函数(例如num_rows()或fetch_row())的话,你必须传递mysqldb对象。那么,如果由dbquery对象来实现mysqldb对象(其设计目的是对一个执行查询的结果进行操作)实现的函数,效果如何呢?让我们继续使用上一篇示例中的代码;并且让我们假定,现在由dbquery对象管理我们的结果资源。dbquery类的源码如列表1所示。

  列表1.使用dbquery类。

require 'mysql_db.php';
require_once 'query.php';
$db = new mysqldb;
$db->connect('host', 'username', 'pass');
$db->query('use content_management_system');
$query = new dbquery($db);
$query->prepare('select fname,sname from users where username=:1s and pword=:2s and expire_time<:3i');
try {
 if($query->execute("visualad", "apron", time()))->num_rows() == 1) {
  echo('correct credentials');
 } else {
  echo('incorrect credentials / session expired');
 }
} catch (queryexception $e) {
 echo('error executing query: ' . $e);

  上面修改后的代码中我们最感兴趣的是,catch语句和execute语句。

  · execute语句不再返回一个结果资源,现在它返回dbquery对象本身。

  · dbquery对象现在实现num_rows()函数—我们从db接口中已经熟悉。

  · 如果查询执行失败,它抛出一个queryexception类型的异常。当被转换成一个字符串时,它将返回发生的错误的细节信息。

  为此,你需要使用代理。事实上,你在我们的dbquery对象中已经使用代理了,但是现在将更为深入地使用它来把它与mysqldb对象紧密绑定。该dbquery对象已经被使用一个实现db接口的对象初始化,并且它已经包含一个成员函数execute—由它调用db对象的query()方法来执行该查询。这个dbquery对象本身并不实际地查询数据库,它把这项任务交由db对象来完成。这就是代理,其实是一个进程—借助于这个进程,通过把消息发送给另一个实现相同的或类似行为的对象,一个对象可以实现一个特别的行为。

  为此,你需要修改dbquery对象以便包括所有的函数—它们操作一个来自db对象的结果资源。当执行查询以调用db对象的相应函数并且返回它的结果时,你需要使用存储的结果。下列函数将被添加:

  列表2:使用代理扩展dbquery类。

class dbquery
{
 .....

 public function fetch_array()
 {
  if (! is_resource($this->result)) {
   throw new exception('query not executed.');
  }
  return $this->db->fetch_array($this->result);
 }

 public function fetch_row()
 {
  if (! is_resource($this->result)) {
   throw new exception('query not executed.');
  }
  return $this->db->fetch_row($this->result);
 }

 public function fetch_assoc()
 {
  if (! is_resource($this->result)) {
   throw new exception('query not executed.');
  }
  return $this->db->fetch_assoc($this->result);
 }

 public function fetch_object()
 {
  if (! is_resource($this->result)) {
   throw new exception('query not executed.');
  }
  return $this->db->fetch_object($this->result);
 }

 public function num_rows()
 {
  if (! is_resource($this->result)) {
   throw new exception('query not executed.');
  }
  return $this->db->num_rows($this->result);
 }

  每个函数的实现相当简单。它首先进行检查,以确保已经执行查询,然后把任务代理到db对象,返回它的结果就好象它是查询对象本身(称作是基本数据库函数)一样。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons