大家好,感谢您的时间!
虽然这是我第一次尝试PHP,但我一直在制作一个PHP表单,到目前为止我已经能够验证字段,并且如果字段是空。 现在......字段“名称”和“电子邮件”都有验证过滤器... “名称”不允许超过“字母和空格”,“电子邮件”不允许“无效的电子邮件格式”。
实施例: 姓名:Rob3rt ......它有一个号码 电子邮件:任何内容......不是电子邮件地址 主题和消息没有验证过滤器......
问题是,如果我填写所有字段,表单就会发送电子邮件,即使“姓名”和“电子邮件”上写的信息与他们的验证过滤器不一致...
问:如何通过发送电子邮件来保存表单,直到所有字段都包含正确的信息?
以下是代码:
// This is the validation code //
<?php
// define variables and set to empty values
$nameErr = $emailErr = $commentErr = $subjectErr = "";
$name = $email = $comment = $subject = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "<h5>Name is required</h5>";
} else {
$name = test_input($_POST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "<h5>Only letters and white space allowed</h5>";
}
}
if (empty($_POST["email"])) {
$emailErr = "<h5>Email is required</h5>";
} else {
$email = test_input($_POST["email"]);
// check if e-mail address is well-formed
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "<h5>Invalid email format</h5>";
}
}
if (empty($_POST["comment"])) {
$commentErr = "<h5>Message is required</h5>";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["subject"])) {
$subjectErr = "<h5>Subject is required</h5>";
} else {
$subject = test_input($_POST["subject"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<form>
Form comes here
</form>
// This is the sending code... I think the problem is here... //
<?php
if($_POST['name']!="" && $_POST['email']!="" && $_POST['comment']!="" && $_POST['subject']!="") {
$to = "myemail@whatever.com";
$email = "From: " . $email . "\r\n";
$subject = "" . $subject . "\r\n";
$comment = "" . $comment . "\r\n";
mail($to,$subject,$comment,$email);
echo "good";
}
else {
"bad";
}
?>
答案 0 :(得分:0)
它不起作用,因为您从不检查是否发生了错误,您只是在发送邮件之前检查字段是否为空。
解决问题的最简单方法是替换
if($_POST['name']!="" && $_POST['email']!="" && $_POST['comment']!="" && $_POST['subject']!="") {
与
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $nameErr === '' && $emailErr === '' && $commentErr === '' && $subjectErr === '') {
没有必要再次检查空字段,您之前已经完成了,所以您只需要检查是否正在发布表单以及所有错误是否为空。
关于如何一般改进代码的一些建议:
1)不要在两个位置处理HTTP POST(一次在表单上方,一次在下面)。在一个PHP代码块中将它合并在一起。
2)至少确保用户无法通过重新加载网站重新提交成功的表单。成功提交后,重定向页面。像这样:
mail($to,$subject,$comment,$email);
header('Location:' . $_SERVER['REQUEST_URI'] . '?status=ok');
exit();
3)将您的HTML与PHP分开,否则最终会得到一个难以维护的巨大文件。将您的HTML表单放在一个单独的文件中include
。
虽然imho对表单最好的解决方案是在JavaScript中清理,通过AJAX(带有angular,react,jQuery等)提交它,在PHP中处理它(并再次清理数据),发送一个4xx HTTP头出现错误并将错误消息作为JSON对象返回,然后在JavaScript中使用。