更专业的错误处理

时间:2010-09-28 19:25:42

标签: php email error-handling

我有一个联系表单,我通过使用“if”语句逐个检查每个字段来处理错误。我发现这很难,我似乎无法找到更好/更有效的方式让他们工作。如果一个(或更多)是真的,我还想要一个标题“错误”。但我不能让他们使用单独的“if”语句。

这是我的代码:

$name = $_POST['name']; //get data from the form
$email = $_POST['email'];//get data from the form
$message = $_POST['message'];//get data from the form
if($name == ""){
echo"<p class='error'>Please enter a name.</p>";
}
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email)){
echo "<p class='error'>Your email address is not valid.</p>"; 
}
if($message == ""){
echo"<p class='error'>Please enter a message.</p>";
}
else{
echo"all ok, send email code...";   
}

编辑:这些错误用于表单的验证。

5 个答案:

答案 0 :(得分:4)

  

但我不能让他们使用单独的“if”语句。

只是将错误存储在变量中

$error = array();

if($name == ""){
  $error[] = "Please enter a name.";
}
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email)){
  $error[] = "Your email address is not valid."; 
}
if($message == ""){
 $error[] = "Please enter a message.";
}

if (!$error) {
  // do not echo anything here
  // but send an email
  // and use header("Location:") to redirect a user to thanks page
} else {
  echo "Error";
  foreach ($error as $line) {
    echo "<p class='error'>$line</p>";
  }
}

答案 1 :(得分:1)

答案 2 :(得分:1)

最专业的方法是让每个字段成为具有验证方法的对象。 然后你可以调用每个字段对象并让他们自己验证。

如果您想继续前进(可能会有些过分),您可以将对象放在列表中。 这些对象中的每一个都是使用验证方法的接口的子代。因此,对于列表中的每个对象,您都可以调用验证方法。

答案 3 :(得分:1)

嗯,您无法一起检查所有字段,因为不同的规则可能适用于每个字段。所以你做的很好,除了你犯了一个错误:else部分应该只在没有错误发生时被回应,但在你的情况下,else只适用于 last if。因此,即使名称和电子邮件的验证失败,只要消息没有,最终的操作就完成了。

一旦发现错误,您就可以轻松添加一些包含true的$has_error变量。或者您可以使用包含所有错误消息的数组,如下所示:

$errors = array();
if ( empty( $name ) )
    $errors[] = 'Please enter a name.';
if ( !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email ) )
    $errors[] ='Your email address is not valid.';
if ( empty( $message ) )
    $errors[] = 'Please enter a message.';

// individual checks done
if ( sizeof( $errors ) > 0 )
{
    echo '<p class="error"><strong>Errors found:</strong><br />';
    echo implode( '<br />', $errors );
    echo '</p>';
}
else
{
    echo 'No error, everything is fine.';
}

答案 4 :(得分:1)

首先,不要将ereg*()函数用于正则表达式匹配,这些函数已弃用且速度很慢。请改用preg_*()函数。

另请查看PHP's filter extension

它提供了检查和验证各种数据的功能,您可以直接使用这些数据或将其合并到您自己的验证器功能中。

编辑:检查电子邮件地址的示例(另请参阅examples on php.net):

if ( !filter_var($email, FILTER_VALIDATE_EMAIL) ) {
    echo 'Invalid e-mail "'.$email.'"';

说到以面向对象的方式进行验证,您可以使用具有基本验证功能的通用验证器类(您还可以将filter函数集成到一致的API中)。

此外,如果您的数据在逻辑上属于一起,以便您可以将它们分组到对象中并对其进行管理,请在这些对象的类中实现validate()方法,以便使用{{1}检查对象的属性函数和/或验证器类。

filter

然后,您可以将所有表单输入加载到对象中,如下所示:

class Message {
    private $name;
    private $email;
    private $text;
    ...

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getEMail() {
        return $this->email;
    }

    public function setEMail($email) {
        $this->email = $email;
    }

    ...

    public function validate() {
        $errors = array();

        $nameLength = strlen($this->name);
        if ( ($nameLength === 0) or ($nameLength > self::NAME_MAX_LENGTH) )
            $errors['name'] = 'Name must be between 1 and '.self::NAME_MAX_LENGTH.' characters.';

        if ( !Validator::isEMail($this->email) )
            $errors['email'] = 'Invalid e-mail "'.$this->email.'"';

        // Other checks
        ...

        // Return TRUE if successful, otherwise array of errors
        return ( count($errors) === 0 ? true : $errors );
    }

}