更好的做法是使用程序方式抛出自定义PHP错误

时间:2013-01-05 16:38:50

标签: php error-handling

我知道之前可能会问这个问题,但我想展示我的代码,我想知道是做一个简单的事情还是使代码复杂化?此外答案说使用trycatch,但我采用程序方法,所以我想知道我是否正确?

我做了什么,例如联系表格

<?php
if(isset($_POST['contact'])) {
    $throw_error = array();

    //First Block Is Validation
    if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
        $throw_error['field_blank'] = 'Fields Cannot Be Blank';
    } elseif(strlen($_POST['first_name']) < 3) {
         $throw_error['char_len'] = 'First Name Cannot Be Less Than 3 Characters';
    }

    //Second Block Is Process If No Errors Are Found
    if(empty($throw_error)) {
        $first_name = $_POST['first_name']; 
       //Don't worry about the sanitizing part, am doing it
       //Process the form ahead and then redirect using header()
       }
    } elseif(!empty($throw_error)) { //Third Block To Throw Error If Any Errors Found
        if(isset($throw_error['field_blank'])) {
            echo  $throw_error['field_blank'];
        } elseif(isset($throw_error['char_len'])) {
            echo  $throw_error['char_len'];
        }
    }
?>

<form>
   <input type="text" name="first_name" />
   <input type="text" name="last_name" />
   <input type="submit" value="Submit" name="contact" />
</form>

2 个答案:

答案 0 :(得分:1)

尝试/抓住你在这里很棒。它消除了throw_error数组所需的全部内容,并大大减少了代码。

try{
    $first_name = '';
    if(isset($_POST['contact'])) {
        if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
            throw new Exception('Fields Cannot Be Blank');
        } elseif(strlen($_POST['first_name']) < 3) {
             throw new Exception('First Name Cannot Be Less Than 3 Characters');
        }
        $first_name = $_POST['first_name'];
    }
}catch(Exception $e){
    echo $e->getMessage();
}

如果您希望将数组传递给此catch语句,我找到的最简单方法是serialize数组,然后unserialize完成。这将允许您一次打印所有错误:

try{
    $first_name = '';
    if(isset($_POST['contact'])) {
        if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
            $throw_error[] = 'Fields Cannot Be Blank';
        }
        if(strlen($_POST['first_name']) < 3) {
             $throw_error[] = 'First Name Cannot Be Less Than 3 Characters';
        }
        if(isset($throw_error)){
            throw new Exception(serialize($throw_error));
        }
        $first_name = $_POST['first_name'];
    }
}catch(Exception $e){
    $errors = unserialize($e->getMessage());
    foreach($errors as $error){
        echo $error.'<br>';
    }
}

答案 1 :(得分:1)

我还建议使用Try / Catch。您仍然可以在程序块中使用它。

如果你已经死定了它,这段代码看起来会像你想要它做的那样,但它过度设计了。由于用户可能有 field_blank char_len 错误,因此您只需要一个字符串错误变量。

$error = NULL;
if($_POST['first_name'] == '' || $_POST['last_name'] == '') {
    $error = 'Fields Cannot Be Blank';
} elseif(strlen($_POST['first_name']) < 3) {
     $error = 'First Name Cannot Be Less Than 3 Characters';
}

...

if(!empty($error)) {
   echo $error;
}

如果您需要捕获并显示多个非排他性错误,您可以使用示例代码中引用的数组,只是迭代值而不是创建一个巨大的if / elseif块。

} elseif(!empty($throw_error)) { //Third Block To Throw Error If Any Errors Found
    foreach($throw_error as $key => $message) {
        echo $message.'<br>';
    }
}