2017-06-16 349 views
2

我有一個表單,我試圖驗證電子郵件地址。如果電子郵件地址不正確,我想要輸入「請輸入有效的電子郵件地址」。返回到表單上的「電子郵件」輸入框中。我究竟做錯了什麼?沒有驗證正在發生。我收到我的電子郵件中的表格信息,一旦提交,用戶將被髮送到「謝謝」頁面,但沒有驗證。我可以在「電子郵件」輸入中添加任何內容,表單將提交。使用PHP的電子郵件驗證

<form action="../php/contact.php" method="post"> 
    <p>First Name:</p> 
    <input class="box_style" type="text" name="first_name" required maxlength="20" /> 

    <p>Last Name:</p> 
    <input class="box_style" type="text" name="last_name" required maxlength="25" /> 

    <p>Email:</p> 
    <input class="box_style" type="text" name="email" required maxlength="50" /> 

    <p>Contact Number (optional):</p> 
    <input class="box_style" type="text" name="contact_number" maxlength="12" /> 

    <p>How did you find us?</p> 
    <select class="box_style" name="how" required> 
    <option value="choose">Select...</option> 
    <option value="referal">Referal</option> 
    <option value="website">Website</option> 
    <option value="search">Search Engine</option> 
    <option value="card">Business Card</option> 
</select> 

<p>Enquiries:</p> 
    <textarea class="box_style" name="inquiries" cols="30" rows="10"></textarea> 

    <input class="box_style" type="submit" name="submit" value="Submit"/> 
</form> 

,這是PHP

<?php 

function test_input($data) { 
$data = trim($data); 
$data = stripslashes($data); 
$data = htmlspecialchars($data); 
return $data; 
} 

// define variables and set to empty values 
$fName = $lName = $email = $cNum = $how = $enquiries = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
$fName = test_input($_POST["first_name"]); 
$lName = test_input($_POST["last_name"]); 
$cNum = test_input($_POST["contact_number"]); 
$how = test_input($_POST["how"]); 
$enquiries = test_input($_POST["enquiries"]); 

$email = test_input($_POST["email"]); 
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    print "<p>Please type a valid email address.</p>"; 

header("Location: www.mysite/thankyou.com"); 
}}; 

$email_from = '[email protected]'; 
$email_subject = "New Inquiry"; 
$email_body = "You have received a new message from" ." ". "$fName" ." ". "$lName" ."\n". 
"$inquiries"."\n". 
"Referal Type:" ." ". "$how" ."\n". 
"Contact Number:" ." ". "$cNum" ."\n"; 

$to = "[email protected]"; 
$headers = "From: $email_from \r\n"; 
$headers .= "Reply-To: $email \r\n"; 
mail($to,$email_subject,$email_body,$headers); 


?> 

謝謝

+0

看起來像驗證發生,但你沒有辦法處理它是對還是錯 – Ice76

+1

'print「

請輸入一個有效的電子郵件地址

」; header(「Location:www.mysite/thankyou.com」);'你輸出一個響應,然後立即加載另一個頁面。所以這個反應就失去了。 – Martin

+0

是@Martin是對的。爲簡單表單處理腳本執行此操作的最佳方法是將所有邏輯移動到發佈到自身的一個腳本中。您將邏輯分成幾部分,您可以檢查請求是否位於頂部的帖子,並在其中設置錯誤。然後它轉到一切都好的部分(然後您發送電子郵件)或不是,並且您再次輸出表單,通常填充值和錯誤添加到顯示。 – gview

回答

0

這裏的OP代碼的簡化版本,演示如何通過具有形式的action屬性是顯示錯誤信息與顯示錶單的網址相同。該代碼還體現了一些不錯的功能供用戶選擇:

<?php 

    include("php4myform.php"); 
?> 

<html> 
<head> 
    <title>Email Validate</title> 
</head> 

<body> 
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST"> 
    <label for="email">Email: </label> 
    <input id="email" name="email" required maxlength="50" value="<?php echo $e_mess; ?>"> 
    <input type="submit" name="submit" value="Submit"> 
    <input type="reset" id="clear" value="clear"> 
</form> 

<script src="myJS4forms.js"></script> 
</body> 
</html> 


php4myform.php:

<?php 

$e_mess = ""; 

if (isset($_POST['submit']) && $_POST != null) { 
    $tainted_email = trim($_POST["email"]); 
    $sanitized_email = filter_var($tainted_email, FILTER_SANITIZE_EMAIL); 

    if(!filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) { 
     $e_mess = "Please type a valid email address."; 
    } 
    else 
    { 
     // Data is good to go. 

    } 
} 

myJS4forms.js:

var d = document; 
d.g = d.getElementById; 

var email = d.g("email"); 
var reset = d.g("clear"); 


function selFoc(obj){ 
    obj.focus(); 
    obj.select(); 
} 



window.onload = function() { 
    selFoc(email); 
}; 


reset.addEventListener("click",function(e) { 
     e.preventDefault(); 
     email.value=null; 
     selFoc(email); 
}); 

的幾個注意事項:

使用$ _SERVER [「REQUEST_METHOD」]進行測試的缺點是用戶mi ght提交一個空表格。因此,本示例中的PHP代碼將測試以查看錶單是否已提交以及POST是否包含任何數據。

在filter_var和參數FILTER_EMAIL_SANITIZE中使用htmlspecialchars()是不明智的;請參閱discussionhere。該代碼使用htmlspecialchars()代替$_SERVER['PHP_SELF'] - 基礎:此article

我刪除了stripslashes(),因爲魔術引號已棄用並且從PHP5.4開始;請參閱在線Manual。 (使用addslashes()來轉義數據是不明智的 - 使用mysqli_real_escape_string()更好。)另外,帶有FILTER_SANITIZE_EMAIL的filter_var將刪除所有斜槓(請參閱Manual)。

+1

您可以在驗證之前使用FILTER_SANITIZE_EMAIL來清理您的電子郵件,以改善您的答案:) –

+1

謝謝;我讚賞這個建議。 – slevy1

+0

謝謝大家。我正在處理所有的信息,看看我是否可以把它拼在一起。 – user2058201

-1

如果使用「header()」函數重定向用戶,則需要停止腳本的執行。所以正確的方法是這樣的:

$email = test_input($_POST["email"]); 
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    print "<p>Please type a valid email address.</p>"; 
    header("Location: www.mysite/thankyou.com"); 
    exit(); 
} 

如果您不終止腳本,它將繼續執行文件的其餘部分。其次,如果您向用戶打印某些內容並立即將其重定向到其他地方,他將永遠不會看到該消息。如果您想要重定向並在那裏顯示消息,則需要先將消息存儲在會話變量中,然後將其顯示在「着陸頁」上。