我有一个表单,我正在尝试验证电子邮件地址。如果电子邮件地址不正确,我想要值为#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);
?>
谢谢
答案 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是不明智的。也请看这个discussion和here。该代码使用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();
}
如果您没有终止脚本,它将继续执行文件的其余部分。
其次,如果您向用户打印某些内容并立即将其重定向到其他位置,他将永远不会看到该消息。如果要进行重定向并在那里显示消息,则需要先将消息存储在会话变量中,然后将其显示在“登录页面”上。