即使电子邮件和名称无效,PHP表单也会发送电子邮件

时间:2017-12-04 21:52:41

标签: php forms validation email post

大家好,感谢您的时间!

虽然这是我第一次尝试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";
   }  
   
?>

1 个答案:

答案 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中使用。