2010-08-26 96 views
1

我有一个概念性的问题来处理PHP类和错误处理。下面是一个基本的类展示我的问题。PHP - 返回多个状态,而不仅仅是真/假

创建数据库记录的函数名称为“domain_create”。该函数调用一个辅助函数来确保要创建的域在数据库表中不存在。

在过去,我一直使用true或false来反映函数是否发现了一条记录,但这在我的逻辑中创建了一个缺陷。当domain_lu函数返回false时插入记录,但是应该在遇到错误,如选择失败?返回false将导致创建函数相信没有发现任何东西,并继续创建过程。

我的问题是如何在这种情况下反映多个状态?这种情况有没有“最佳做法”?

<?php 

require_once('auth.base.class.php'); 
require_once('mysql.class.php'); 

class auth extends base 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    /* 
    * User 
    */ 

    public function domain_create($args='') 
    { 
     if (domain_lu($args['dname']) === FALSE) 
     { 
     return $error['Domain already in use']; 
     } 
    } 

    /* 
    * Domain 
    */ 

    private function domain_lu($dname) 
    { 
     $sql = "SELECT name FROM domain WHERE name = '$dname'"; 
     $this->_mysql->SQLQuery($sql); 

     if ($this->_mysql->numRow() > 0) return true; 
     else return false; 
    } 
} 

?> 
+2

很明显,第三个选项应该是FILE_NOT_FOUND(http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx) – 2010-08-26 10:22:16

回答

8

您应该使用Exceptions。如果存在查询错误,则抛出异常,说明失败的原因。如果该域已存在,则抛出一个异常,指出该域已存在。这里是一个非常简单的例子:

public function domain_create($args='') 
    { 
     if (!$this->domain_lu($args['dname'])) 
      throw new Exception('domain already in use'); 
    } 

    private function domain_lu($dname) 
    { 
     $sql = "SELECT name FROM domain WHERE name = '$dname'"; 
     $this->_mysql->SQLQuery($sql); // SQLQuery should throw an exception if it fails 
     return ($this->_mysql->numRow() > 0); 
    } 

你真的应该建立专门的异常类,以便用户可以捕获特定异常不依靠单独的异常消息,在PHP文档有更多的信息。但基本上这样做的事情只要抛出一个异常就会从函数中退出,并且只要代码捕捉到异常就返回。或者如果它没有被抓到,PHP将终止脚本。

4

你有两个选择:使用异常或错误定义的常量,像

class auth extends base 
{ 
    const E_OK = 0; 
    const E_NOTFOUND = 1; 
    const E_FAILURE = 2; 
//[snip] 

    private function domain_lu($dname) 
    { 
     $sql = "SELECT name FROM domain WHERE name = '$dname'"; 
     if(!$this->_mysql->SQLQuery($sql)) return self::E_FAILURE; 
     if ($this->_mysql->numRow() > 0) return self::E_OK; 
     else return self::E_NOTFOUND; 
    } 
} 
0

国际海事组织,你正在处理这个错误的地方。如果您需要确保数据库列不能包含重复的值,你应该create this column with a UNIQUE key constraint

一个UNIQUE指数产生,使得该指数的所有值必须是不同的约束。如果尝试使用与现有行匹配的键值添加新行,则会发生错误。对于所有引擎,UNIQUE索引允许包含NULL的列的多个NULL值。

DB往返通常是应用的瓶颈,所以这是你不需要派遣两个查询你的数据库(一个检查,一个插入)的优势。只要运行你的查询,看看它是否成功,如果没有,得到并返回错误或抛出适当的Exceptions

+0

这实际上已经到位了......问题更多的是沿着概念而不是实现。我想将这里讨论的概念应用到其他地方.. – Lee 2010-08-26 10:35:33

+0

@Lee异常无疑是一种很好的方法。我upvoted太 – Gordon 2010-08-26 10:40:32

+0

谢谢:) ..我会读入他们一些.. – Lee 2010-08-26 10:44:07

相关问题