2011-02-28 37 views
1

我正在尋找什麼是處理函數錯誤的最佳方法。 「DIE」方法是否合適?PHP和函數錯誤

即。例如:php函數調用另一個,例如:

function login(){ 
    $result = verifyDetails("bob", "password123"); 
    if($result == "accepted"){ 
      echo "Welcome bob"; 
    }else{ 
      echo "Error!! \n"; 
      echo $result; 
    } 
} 

function verifyDetails($user, $pass){ 
    if(empty($user) || empty($pass)){ 
      die("cannot be empty"); 
    } 

    if($user == "bob" && $pass == "password"){ 
      return "accepted"; 
    }else{ 
      die("username or password incorrect"); 
    } 
} 

「DIE」方法返回消息還是一切都停止了?提前


UPDATE

感謝

如果輸出不知道什麼?例如

。在上面的例子中,我把「接受」作爲唯一正確的答案。

如果返回是姓名或身份證號碼,那麼該怎麼辦?那麼你真的不能真正區分錯誤和正確的回報。

再次感謝。


UPDATE /可能的解決方案

function login(){ 
    $result = verifyDetails("bob", "password123"); 
    if($result[0] == "SUCCESS"){ 
      echo "Welcome bob"; 
    }else if($result[0] == "ERROR"){ 
      echo "Error!! \n"; 
      echo $result; 
    }else{ 
      echo "Unknown Error!!"; 
    } 

} 

function verifyDetails($user, $pass){ 
    $msg = array(); 

    if(empty($user) || empty($pass)){ 
      $msg[0] = "ERROR"; 
      $msg[1] = "cannot be empty" 
      return $msg; 
    } 

    if($user == "bob" && $pass == "password"){ 
      //say $customerID is extracted from a db 
      $msg[0] = "SUCCESS"; 
      $msg[1] = $customerID 
      return $msg; 
    }else{ 
      $msg[0] = "ERROR"; 
      $msg[1] = "username or password incorrect" 
      return $msg; 
    } 
} 

思路上面的 「可能」 的解決方案&建議,歡迎


UPDATE

檢查Shikiryu更新下使用陣列

+0

您可能想了解有關例外情況。當您必須終止腳本執行時,使用die()是一個相對較好的解決方案。 – mailo 2011-02-28 13:42:37

+0

不應使用@mailo異常來處理應用程序邏輯。 – 2011-02-28 13:45:20

回答

1

die()只是echo您的消息並停止腳本,因爲die()exit()的別名。

在您的情況下,由於密碼不是password而是password123,腳本將停止顯示「用戶名或密碼不正確」。

但正如我所看到的,你想有一個return "cannot be empty";,這樣它會顯示:

錯誤! 用戶名或密碼不正確

(和任選的HTML的其餘部分,其die()不會)


更新2(醜陋的方式):

function login(){ 
    $result = verifyDetails("bob", "password123"); 
    if(isset($result['success']){ // verifyDetails return true? 
      echo $result['success']; 
    }else{ 
      echo "Error!! \n"; 
      echo $result['error']; // Display the error verifyDetails throws 
      // You may want to check if $result['error'] exists. 
    } 
} 

function verifyDetails($user, $pass){ 
    if(empty($user) || empty($pass)){ 
      return array('error'=>"cannot be empty"); 
    } 

    if($user == "bob" && $pass == "password"){ 
      return array('success'=>"Welcome bob"); 
    }else{ 
      return array('error'=>"username or password incorrect"); 
    } 
} 
+0

已更新問題 – Stevanicus 2011-02-28 14:10:36

+0

@Stevanicus:已更新答案 – Shikiryu 2011-02-28 14:33:32

+0

謝謝......如果「返回true」是任何未知值,那麼我遇到的唯一問題就像客戶ID或名字「很難挑選什麼是錯誤消息,什麼不是 – Stevanicus 2011-02-28 14:38:46

1

清潔版本2回答好你的情況下,唯一可以接受的方式是return FALSE

如果這些功能真的是一些類,用類變量的方法來存儲實際的錯誤。 如果這些功能不屬於任何階級,我不會用他們所有,但它在明​​碼

if($user == "bob" && $pass = "password"){ 
     echo "Welcome bob"; 
}else{ 
     echo "incorrect username or password"); 
} 

更新的答案寫

那麼有沒有什麼發明。只要按照這樣PHP雲:
讓你的函數返回任一值或FALSE

然而,對於驗證目的,你必須做出這樣說:

function validSomething($val){ 
    return (bool)rand(0,1); 
} 
$err = array(); 
if (!validSomething($var)) { 
    $err[] = "Whatever error"; 
} 

即函數只返回布爾值和實際錯誤消息被應用程序邏輯添加。

但是,在您的示例中,用戶定義的函數完全被濫用。

+0

更新的問題 – Stevanicus 2011-02-28 14:09:45

+0

只是返回false的問題是,你不會知道錯誤的位置 – Stevanicus 2011-02-28 14:17:02

+0

@Stevanicus看到更新的答案。使您的驗證功能一次檢查一個參數 - 所以,您將永遠知道。但是,談到這樣的想象中的例子是一種痛苦。我更願意討論真實案例。 – 2011-02-28 14:21:06

1

die則終止執行PHP腳本在它被調用的行上。因此,您的郵件將不會被退回。

您可能只需使用return而不是die;

+0

已更新的問題 – Stevanicus 2011-02-28 14:11:00

1

是的,您可以使用die()進行調試。

does the "DIE" method return the message or does everything come to a standstill?

是的,它返回的錯誤信息是的,該腳本將停止繼續。