在本教程中,您將學(xué)習(xí)如何使用PHP過濾器清理和驗(yàn)證表單數(shù)據(jù)。
如您在上一教程中所見,捕獲和顯示提交的表單數(shù)據(jù)的過程非常簡單。在本教程中,您將學(xué)習(xí)如何在您的網(wǎng)站上實(shí)現(xiàn)一個(gè)簡單的聯(lián)系表單,該表單允許用戶通過電子郵件發(fā)送評論和反饋。我們將使用相同的PHP mail()函數(shù)來發(fā)送電子郵件。
我們還將實(shí)現(xiàn)一些基本的安全功能,例如清理和驗(yàn)證用戶輸入的內(nèi)容,以使用戶不能插入危害網(wǎng)站安全或可能破壞應(yīng)用程序的潛在有害數(shù)據(jù)。
以下是我們的多合一PHP腳本,它執(zhí)行以下操作:
它將要求用戶輸入他對該網(wǎng)站的評論。
相同的腳本顯示聯(lián)系人表單并處理提交的表單數(shù)據(jù)。
該腳本清理并驗(yàn)證用戶輸入。 如果缺少任何必填字段(標(biāo)有*),或者由于輸入不正確而導(dǎo)致驗(yàn)證失敗,腳本將重新顯示表單,并為相應(yīng)的表單域顯示一條錯誤消息。
該腳本會記住用戶已經(jīng)填寫的字段,并在由于驗(yàn)證錯誤而重新顯示表單時(shí)預(yù)填充這些字段。
如果用戶提交的數(shù)據(jù)可以接受并且一切順利,它將向網(wǎng)站管理員發(fā)送電子郵件,并向用戶顯示成功消息。
在“ contact.php”文件中鍵入以下代碼,并將其保存在項(xiàng)目的根目錄中:
<?php //過濾用戶輸入的函數(shù) function filterName($field){ //清理用戶名 $field = filter_var(trim($field), FILTER_SANITIZE_STRING); //驗(yàn)證用戶名 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); // 驗(yàn)證電子郵件地址 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; } } //定義變量并使用空值進(jìn)行初始化 $nameErr = $emailErr = $messageErr = ""; $name = $email = $subject = $message = ""; //提交表單時(shí)處理表單數(shù)據(jù) if($_SERVER["REQUEST_METHOD"] == "POST"){ // 驗(yàn)證用戶名 if(empty($_POST["name"])){ $nameErr = "Please enter your name."; } else{ $name = filterName($_POST["name"]); if($name == FALSE){ $nameErr = "請輸入有效的名字。"; } } // 驗(yàn)證電子郵件地址 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"]); } // 驗(yàn)證用戶評論 if(empty($_POST["message"])){ $messageErr = "Please enter your comment."; } else{ $message = filterString($_POST["message"]); if($message == FALSE){ $messageErr = "請輸入有效的評論。"; } } //發(fā)送電子郵件前檢查輸入錯誤 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">您的留言已成功發(fā)送!</p>'; } else{ echo '<p class="error">無法發(fā)送電子郵件。 請?jiān)僭囈淮?</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>聯(lián)系我們</h2> <p>請?zhí)詈眠@張表格并寄給我們</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="發(fā)送"> <input type="reset" value="重置"> </form> </html>
您可能會想到該代碼的全部含義。好吧,讓我們直接進(jìn)入。
filterName()函數(shù)驗(yàn)證輸入值是否為人名。 有效名稱只能包含字母字符(a-z、A-Z)。
filterEmail()函數(shù)將輸入值驗(yàn)證為電子郵件地址。
filterString()函數(shù)僅通過清理HTML標(biāo)記和特殊字符來清理輸入值。 它不會對任何輸入值進(jìn)行驗(yàn)證。
標(biāo)記內(nèi)<form>的屬性action="contact.php"指定同一contact.php文件顯示表單并處理表單數(shù)據(jù)。
<input>和<textarea>的值屬性內(nèi)的PHP代碼,例如<?php echo $name; ?>當(dāng)形式時(shí)驗(yàn)證錯誤重新顯示顯示預(yù)先填充值。
.error類內(nèi)的PHP代碼,例如<span class="error"><?php echo $nameErr; ?></span>顯示相應(yīng)字段的錯誤。
要了解有關(guān)清理和驗(yàn)證過濾器的更多信息,請查閱PHP過濾器參考。
注意:您需要在計(jì)算機(jī)上設(shè)置郵件服務(wù)器,PHP mail()函數(shù)才能正常工作。如果您只想執(zhí)行表單驗(yàn)證,則可以用自己的自定義代碼替換郵件部分。