PHP 表单验证

在本教程中,您将学习如何使用PHP过滤器清理和验证表单数据。

清理和验证表单数据

如您在上一教程中所见,捕获和显示提交的表单数据的过程非常简单。在本教程中,您将学习如何在您的网站上实现一个简单的联系表单,该表单允许用户通过电子邮件发送评论和反馈。我们将使用相同的PHP mail()函数来发送电子邮件。

我们还将实现一些基本的安全功能,例如清理和验证用户输入的内容,以使用户不能插入危害网站安全或可能破坏应用程序的潜在有害数据。

以下是我们的多合一PHP脚本,它执行以下操作:

  • 它将要求用户输入他对该网站的评论。

  • 相同的脚本显示联系人表单并处理提交的表单数据。

  • 该脚本清理并验证用户输入。 如果缺少任何必填字段(标有*),或者由于输入不正确而导致验证失败,脚本将重新显示表单,并为相应的表单域显示一条错误消息。

  • 该脚本会记住用户已经填写的字段,并在由于验证错误而重新显示表单时预填充这些字段。

  • 如果用户提交的数据可以接受并且一切顺利,它将向网站管理员发送电子邮件,并向用户显示成功消息。

在“ contact.php”文件中键入以下代码,并将其保存在项目的根目录中:

<?php
//过滤用户输入的函数
function filterName($field){
    //清理用户名
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    
    //验证用户名
    if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
        return $field;
    } else{
        return FALSE;
    }
}    
function filterEmail($field){
    //清理电子邮件地址
    $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
    
    // 验证电子邮件地址
    if(filter_var($field, FILTER_VALIDATE_EMAIL)){
        return $field;
    } else{
        return FALSE;
    }
}
function filterString($field){
    // 清理字符串
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    if(!empty($field)){
        return $field;
    } else{
        return FALSE;
    }
}
 
//定义变量并使用空值进行初始化
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
 
//提交表单时处理表单数据
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // 验证用户名
    if(empty($_POST["name"])){
        $nameErr = "Please enter your name.";
    } else{
        $name = filterName($_POST["name"]);
        if($name == FALSE){
            $nameErr = "请输入有效的名字。";
        }
    }
    
    // 验证电子邮件地址
    if(empty($_POST["email"])){
        $emailErr = "请输入您的电子邮件地址。";     
    } else{
        $email = filterEmail($_POST["email"]);
        if($email == FALSE){
            $emailErr = "Please enter a valid email address.";
        }
    }
    
    // Validate message subject
    if(empty($_POST["subject"])){
        $subject = "";
    } else{
        $subject = filterString($_POST["subject"]);
    }
    
    // 验证用户评论
    if(empty($_POST["message"])){
        $messageErr = "Please enter your comment.";     
    } else{
        $message = filterString($_POST["message"]);
        if($message == FALSE){
            $messageErr = "请输入有效的评论。";
        }
    }
    
    //发送电子邮件前检查输入错误
    if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
        // Recipient email address
        $to = 'webmaster@example.com';
        
        // Create email headers
        $headers = 'From: '. $email . "\r\n" .
        'Reply-To: '. $email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
        
        // Sending email
        if(mail($to, $subject, $message, $headers)){
            echo '<p class="success">您的留言已成功发送!</p>';
        } else{
            echo '<p class="error">无法发送电子邮件。 请再试一次!</p>';
        }
    }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Contact Form</title>
    <style type="text/css">
        .error{ color: red; }
        .success{ color: green; }
    </style>
</head>

    <h2>联系我们</h2>
    <p>请填好这张表格并寄给我们</p>
    <form action="contact.php" method="post">
        <p>
            <label for="inputName">Name:<sup>*</sup></label>
            <input type="text" name="name" id="inputName" value="<?php echo $name; ?>">
            <span class="error"><?php echo $nameErr; ?></span>
        </p>
        <p>
            <label for="inputEmail">Email:<sup>*</sup></label>
            <input type="text" name="email" id="inputEmail" value="<?php echo $email; ?>">
            <span class="error"><?php echo $emailErr; ?></span>
        </p>
        <p>
            <label for="inputSubject">Subject:</label>
            <input type="text" name="subject" id="inputSubject" value="<?php echo $subject; ?>">
        </p>
        <p>
            <label for="inputComment">Message:<sup>*</sup></label>
            <textarea name="message" id="inputComment" rows="5" cols="30"><?php echo $message; ?></textarea>
            <span class="error"><?php echo $messageErr; ?></span>
        </p>
        <input type="submit" value="发送">
        <input type="reset" value="重置">
    </form>

</html>

代码的用法

您可能会想到该代码的全部含义。好吧,让我们直接进入。

  • filterName()函数验证输入值是否为人名。 有效名称只能包含字母字符(a-z、A-Z)。

  • filterEmail()函数将输入值验证为电子邮件地址。

  • filterString()函数仅通过清理HTML标记和特殊字符来清理输入值。 它不会对任何输入值进行验证。

  • 标记内<form>的属性action="contact.php"指定同一contact.php文件显示表单并处理表单数据。

  • <input><textarea>的值属性内的PHP代码,例如<?php echo $name; ?>当形式时验证错误重新显示显示预先填充值。

  • .error类内的PHP代码,例如<span class="error"><?php echo $nameErr; ?></span>显示相应字段的错误。

 要了解有关清理和验证过滤器的更多信息,请查阅PHP过滤器参考。

注意:您需要在计算机上设置邮件服务器,PHP mail()函数才能正常工作。如果您只想执行表单验证,则可以用自己的自定义代码替换邮件部分。