PHP 表单验证

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

清理和验证表单数据

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

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

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

  • 它会要求用户输入他对该网站的评论。
  • 相同的脚本显示联系表单并处理提交的表单数据。
  • 该脚本清理并验证用户输入。如果 * 缺少任何必填字段(标记为)或由于输入错误而导致验证失败,则脚本将重新显示表单,并显示相应表单字段的错误消息。
  • 该脚本会记住用户已填写的字段,并在表单由于验证错误而重新显示时预填充这些字段。
  • 如果用户提交的数据是可接受的并且一切顺利,它将向网站管理员发送电子邮件并向用户显示成功消息。

contact.php 文件中键入以下代码并保存在项目根目录中:

<?php
// Functions to filter user inputs
function filterName($field){
    // Sanitize user name
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    
    // Validate user name
    if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
        return $field;
    } else{
        return FALSE;
    }
}    
function filterEmail($field){
    // Sanitize e-mail address
    $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
    
    // Validate e-mail address
    if(filter_var($field, FILTER_VALIDATE_EMAIL)){
        return $field;
    } else{
        return FALSE;
    }
}
function filterString($field){
    // Sanitize string
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    if(!empty($field)){
        return $field;
    } else{
        return FALSE;
    }
}
 
// Define variables and initialize with empty values
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Validate user name
    if(empty($_POST["name"])){
        $nameErr = "Please enter your name.";
    } else{
        $name = filterName($_POST["name"]);
        if($name == FALSE){
            $nameErr = "Please enter a valid name.";
        }
    }
    
    // Validate email address
    if(empty($_POST["email"])){
        $emailErr = "Please enter your email address.";     
    } 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"]);
    }
    
    // Validate user comment
    if(empty($_POST["message"])){
        $messageErr = "Please enter your comment.";     
    } else{
        $message = filterString($_POST["message"]);
        if($message == FALSE){
            $messageErr = "Please enter a valid comment.";
        }
    }
    
    // Check input errors before sending email
    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">Your message has been sent successfully!</p>';
        } else{
            echo '<p class="error">Unable to send email. Please try again!</p>';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Contact Form</title>
    <style type="text/css">
        .error{ color: red; }
        .success{ color: green; }
    </style>
</head>
<body>
    <h2>Contact Us</h2>
    <p>Please fill in this form and send us.</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; ?>">
            <?php echo $nameErr; ?>
        </p>
        <p>
            <label for="inputEmail">Email:<sup>*</sup></label>
            <input type="text" name="email" id="inputEmail" value="<?php echo $email; ?>">
            <?php echo $emailErr; ?>
        </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>
            <?php echo $messageErr; ?>
        </p>
        <input type="submit" value="Send">
        <input type="reset" value="Reset">
    </form>
</body>
</html>

代码说明

你可能会想到该代码的全部内容。好的,让我们直接进入它。

  • filterName() 函数,验证输入的值是否为人名。有效名称只能包含字母字符(az,AZ)。
  • filterEmail() 函数验证输入值作为电子邮件地址。
  • filterString() 函数只清除 HTML 标记和特殊字符的输入值。它不会针对任何内容验证输入值。
  • 标记 <form>内的属性 action="contact.php" 指定同一 contact.php 文件显示表单以及处理表单数据。
  • 在值属性 <input><textarea> 之间的 PHP 代码,例如 <?php echo $name; ?>,在验证错误时重新显示表单时显示预填充值。
  • .error 类中的 PHP 代码,例如 <?php echo $nameErr; ?> 显示相应字段的错误。

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

注意: 你需要在计算机上设置邮件服务器才能使 PHP mail() 功能正常工作。如果你只是想实现表单验证,你可以替换邮件部分成自己的自定义代码(第 8194 行)。