2010-08-26 178 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

相關問題