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 行)。