【问题标题】:PHP Form sends Email even if Email and Name are invalid即使电子邮件和名称无效,PHP 表单也会发送电子邮件
【发布时间】:2018-05-18 11:06:47
【问题描述】:

大家好,感谢您的宝贵时间!

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

【问题讨论】:

  • 代码太多。您需要自己更好地解决此问题。我们不是调试器。您需要隔离问题并从那里进行调试。如果您遇到问题,请通过Minimal, Complete, and Verifiable example 提供关于什么不工作的明确解释。我建议阅读 How to Ask 一个好问题和 the perfect question。另外,请务必使用 tour 并阅读 this
  • 当您发送邮件时,除了空白表单值外,您不会检查任何内容。这就是允许其他无效数据通过的原因。
  • 我已经将代码压缩到了我认为问题所在的地步......但是我不知道我必须在发送代码中的确切位置和位置......
  • 也许您应该在发送电子邮件之前检查错误变量而不是 POST 属性。
  • 可怜的老 Baba O'Riley,联系不上。

标签: php forms validation email post


【解决方案1】:

它不起作用,因为您从不检查是否发生错误,您只是在发送邮件之前检查字段是否不为空。

最简单的修复方法是替换

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它。

虽然恕我直言,最好的表单解决方案是在 JavaScript 中清理,通过 AJAX 提交(使用 angular、react、jQuery 等),在 PHP 中处理它(并再次清理数据),发送 4xx HTTP 标头发生错误并将错误消息作为 JSON 对象返回,然后在 JavaScript 中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2011-10-07
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多