PHP - 返回多个状态,而不仅仅是true / false

时间:2010-08-26 10:10:46

标签: php class error-handling return-value

我有一个与PHP类和错误处理有关的概念问题。下面是一个演示我的问题的基本类。

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

在过去,我总是使用true或false来反映函数是否找到了记录,但是这会在我的逻辑中产生一个缺陷。当domain_lu函数返回false时会插入记录,但是如果出现错误则应该执行遇到如选择失败?返回false将导致create函数相信找不到任何内容并继续创建过程..

我的问题是在这种情况下应该如何反映多个州?这种情况是否有“最佳实践”?

<?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;
   }
}

?>

3 个答案:

答案 0 :(得分: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将终止脚本。

答案 1 :(得分: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;
   }
}

答案 2 :(得分:0)

IMO,你正在错误的地方解决这个问题。如果您需要确保数据库列不能包含重复值,则应create this column with a UNIQUE key constraint

  

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

数据库往返通常是应用程序中的瓶颈,因此这样做的好处是您不需要针对数据库分派两个查询(一个要检查,一个要插入)。只需运行您的查询并查看它是否成功,如果没有,请获取并返回错误或抛出相应的Exceptions