使用PHP验证电子邮件

时间:2017-06-16 22:09:45

标签: php forms validation email

我有一个表单,我正在尝试验证电子邮件地址。如果电子邮件地址不正确,我想要值为#34;请输入有效的电子邮件地址。"返回"电子邮件"表格上的输入框。我究竟做错了什么?没有进行验证。我在电子邮件中收到表单信息,一旦提交,用户就会被发送到"谢谢你"页面,但没有验证。我可以把任何东西放在"电子邮件"输入和表格将提交。

<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 = 'my@email.com';
$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 = "my@email.com";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $email \r\n";
mail($to,$email_subject,$email_body,$headers);


?>

谢谢

2 个答案:

答案 0 :(得分:0)

这是OP代码的简化版本,演示了如何通过使表单的action属性与显示表单的url相同来显示错误消息。该代码还为用户提供了一些不错的功能:

<?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”]进行测试的缺点是用户可能会提交一个空表单。因此,此示例中的PHP代码测试以查看表单是否已提交以及POST是否包含任何数据。

使用带有filter_var的htmlspecialchars()和参数FILTER_EMAIL_SANITIZE是不明智的。也请看这个discussionhere。该代码使用htmlspecialchars()来保护$_SERVER['PHP_SELF'] - 基础:此article

我删除了stripslashes(),因为魔术引号已弃用,自PHP5.4起已经过去了;见在线Manual。 (使用addslashes()来转义数据是不可取的 - 最好使用mysqli_real_escape_string()。)另外,使用FILTER_SANITIZE_EMAIL的filter_var将删除任何斜杠(参见Manual)。

答案 1 :(得分:-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();
}

如果您没有终止脚本,它将继续执行文件的其余部分。

其次,如果您向用户打印某些内容并立即将其重定向到其他位置,他将永远不会看到该消息。如果要进行重定向并在那里显示消息,则需要先将消息存储在会话变量中,然后将其显示在“登录页面”上。