PHP 基础教程
PHP 高级教程
PHP & MySQL DATABASE
PHP 示例
PHP 参考手册

PHP 表单验证

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

清理和验证表单数据

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

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

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

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

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

示例

Download
<?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 = "Please enter a valid name.";
        }
    }
    
    // 验证电子邮件地址
    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.";
        }
    }
    
    // 验证消息主题
    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 = "Please enter a valid comment.";
        }
    }
    
    // 发送电子邮件前检查输入错误
    if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
        // Recipient email address
        $to = 'webmaster@example.com';
        
        // 创建电子邮件标头
        $headers = 'From: '. $email . "\r\n" .
        'Reply-To: '. $email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
        
        // 发送电子邮件
        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; ?>">
            <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="Send">
        <input type="reset" value="Reset">
    </form>
</body>
</html>

代码说明

您可能会认为该代码是关于什么的。 好的,让我们直接进入它。

  • filterName() 函数 (line no-03) 将输入值验证为人名。 有效名称只能包含字母字符(a-z、A-Z)。
  • filterEmail() 函数(line no-14)将输入值验证为电子邮件地址。
  • filterString() 函数(line no-25)仅通过去除 HTML 标记和特殊字符来清理输入值。 它不会验证输入值 反对 任何东西。
  • <form> 标记内的属性 action="contact.php"line no-111)指定同一个 contact.php 文件显示表单以及处理表单数据。
  • <input><textarea> 的 value 属性内的 PHP 代码,例如 <?php echo $name; ?> 在验证错误时重新显示表单时显示预填充值。
  • .error 类中的 PHP 代码,例如 <span class="error"><?php echo $nameErr; ?></span> 对应字段的显示错误。

休息一下我们在前几章中已经介绍过的内容。 要了解有关清理和验证过滤器的更多信息,请查看 PHP 过滤器 参考。

注意:您需要在您的机器上设置一个邮件服务器,PHP mail() 功能才能工作。 如果您只想实现表单验证,您可以将邮件部分(行号 8194)替换为您自己的自定义代码。

Advertisements