【问题标题】:Trying to send an email in PHP only after the submit button is pressed and the form is valid仅在按下提交按钮并且表单有效后才尝试在 PHP 中发送电子邮件
【发布时间】:2015-12-18 05:52:40
【问题描述】:

我是 PHP 新手,目前正在重新使用 HTML。我已经制作了一个表格,并通过 PHP 发送和验证了数据,但我只是在数据经过验证并且正确后才尝试将电子邮件发送给自己。目前,如果页面已加载,我认为它会发送一封电子邮件,并且只要我点击提交而数据不正确,它就会发送。

这里是我验证数据的地方:

<?php
  //Set main variables for the data.
  $fname = $lname = $email = $subject = $website = $likedsite = $findoption = $comments = "";

  //Set the empty error variables.
  $fnameErr = $lnameErr = $emailErr = $subjectErr = $commentsErr = $websiteErr = $findoptionErr = "";

  //Check to see if the form was submitted.
  if ($_SERVER["REQUEST_METHOD"] == "POST")
  {
    //Check the 'First Name' field.
    if (empty($_POST["fname"]))
    {
      $fnameErr = "First Name is Required.";
    } 
    else
    {
      $fname = validate_info($_POST["fname"]);
    }

    //Check the 'Last Name' field.
    if (empty($_POST["lname"]))
    {
      $lnameErr = "Last Name is Required.";
    } 
    else
    {
      $lname = validate_info($_POST["lname"]);
    }

    //Check the 'E-Mail' field.
    if (empty($_POST["email"]))
    {
      $emailErr = "E-Mail is Required.";
    } 
    else
    {
      $email = validate_info($_POST["email"]);
      //Check if valid email.
      if (!filter_var($email, FILTER_VALIDATE_EMAIL))
      {
        $emailErr = "Invalid E-Mail Format.";
      }
    }

    //Check the 'Subject' field.
    if (empty($_POST["subject"]))
    {
      $subjectErr = "Subject is Required.";
    } 
    else
    {
      $subject = validate_info($_POST["subject"]);
    }

    //Check the 'Website' field.
    if (empty($_POST["siteurl"]))
    {
      $website = "";
    } 
    else
    {
      $website = validate_info($_POST["siteurl"]);
      //Check if valid URL.
      if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
      {
        $websiteErr = "Invalid URL.";
      }
    }

    //Check the 'How Did You Find Us' options.
    if (empty($_POST["howfind"]))
    {
      $findoptionErr = "Please Pick One.";
    } 
    else
    {
      $findoption = validate_info($_POST["howfind"]);
    }

    //Check the comment box.
    if (empty($_POST["questioncomments"]))
    {
      $commentsErr = "Questions/Comments are Required.";
    } 
    else
    {
      $comments = validate_info($_POST["questioncomments"]);
    }

    //Pass any un-required data.
    $likedsite = validate_info($_POST["likedsite"]);
  }

  function validate_info($data)
  {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
  }
?>

抱歉有点冗长。

这是我尝试发送电子邮件的地方。我尝试了两种不同的尝试,结果都一样。

    <?php
if (!empty($fnameErr) || !empty($lnameErr) || !empty($subjectErr) || !empty($emailErr) || !empty($commentErr) || !empty($websiteErr) || !empty($findoptionErr))
{
  echo "Sent!!";
}else
{
  echo"Not Sent!!";
}
  //Make the message.
  $message =
  "
  First Name: $fname.\n
  Last Name: $lname.\n
  Website: $website\n
  Did They Like the Site? $likedsite.\n
  How They Found Us. $findoption.\n
  Question/Comments:\n
  $comments.
  ";
  $message = wordwrap($message, 70);
  $headers = "From: $email";

  mail("me@gmail.com", $subject, $message, $headers);
?>

再次对篇幅感到抱歉。提前感谢也很抱歉,如果这是一个双重问题或描述不够,我也是堆栈溢出的新手。

【问题讨论】:

  • 替换||通过 && 所以它会算作 'and' instear of 'or'
  • 我只是试了一下,结果显示“未发送”。当我完整且正确地填写表格且没有错误时,它并没有更改为“已发送”。
  • 我的错,我以为你使用的是输入而不是错误变量啊,尝试替换 ||通过 && 并删除!在 each 前面,所以如果它们都是空的(没有错误)它应该发送。
  • 谢谢。我现在试试。也有点我的错。我完全应该注意到这一点。
  • @TheGamingMann,我用一些代码解决方案发布答案​​。一旦每个验证消息变量都为空,则只有网站发送邮件。

标签: php html forms email


【解决方案1】:

请尝试:

<?php
  //Set main variables for the data.
  $fname = $lname = $email = $subject = $website = $likedsite = $findoption = $comments = "";

  //Set the empty error variables.
  $fnameErr = $lnameErr = $emailErr = $subjectErr = $commentsErr = $websiteErr = $findoptionErr = "";

  //Initialize variable used to identify form is valid OR not. 
  $formValid = true;

  //Check to see if the form was submitted.
  if ($_SERVER["REQUEST_METHOD"] == "POST")
  {
    //Check the 'First Name' field.
    if (empty($_POST["fname"]))
    {
      $formValid = false;//Form not validate
      $fnameErr = "First Name is Required.";
    } 
    else
    {
      $fname = validate_info($_POST["fname"]);
    }

    //Check the 'Last Name' field.
    if (empty($_POST["lname"]))
    {
      $formValid = false;//Form not validate
      $lnameErr = "Last Name is Required.";
    } 
    else
    {
      $lname = validate_info($_POST["lname"]);
    }

    //Check the 'E-Mail' field.
    if (empty($_POST["email"]))
    {
      $formValid = false;//Form not validate
      $emailErr = "E-Mail is Required.";
    } 
    else
    {
      $email = validate_info($_POST["email"]);
      //Check if valid email.
      if (!filter_var($email, FILTER_VALIDATE_EMAIL))
      {
        $formValid = false;//Form not validate
        $emailErr = "Invalid E-Mail Format.";
      }
    }

    //Check the 'Subject' field.
    if (empty($_POST["subject"]))
    {
      $formValid = false;//Form not validate
      $subjectErr = "Subject is Required.";
    } 
    else
    {
      $subject = validate_info($_POST["subject"]);
    }

    //Check the 'Website' field.
    if (empty($_POST["siteurl"]))
    {
      $website = "";
    } 
    else
    {
      $website = validate_info($_POST["siteurl"]);
      //Check if valid URL.
      if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
      {
        $formValid = false;//Form not validate
        $websiteErr = "Invalid URL.";
      }
    }

    //Check the 'How Did You Find Us' options.
    if (empty($_POST["howfind"]))
    {
      $formValid = false;//Form not validate
      $findoptionErr = "Please Pick One.";
    } 
    else
    {
      $findoption = validate_info($_POST["howfind"]);
    }

    //Check the comment box.
    if (empty($_POST["questioncomments"]))
    {
      $formValid = false;//Form not validate
      $commentsErr = "Questions/Comments are Required.";
    } 
    else
    {
      $comments = validate_info($_POST["questioncomments"]);
    }

    //Pass any un-required data.
    $likedsite = validate_info($_POST["likedsite"]);
  }


  //If every variable value set, send mail OR display error...
  if (!$formValid){
     echo"Form not validate...";

  } 
  else {
      //Make the message.
      $message =
      "
      First Name: $fname.\n
      Last Name: $lname.\n
      Website: $website\n
      Did They Like the Site? $likedsite.\n
      How They Found Us. $findoption.\n
      Question/Comments:\n
      $comments.
      ";
      $message = wordwrap($message, 70);
      $headers = "From: $email";

      mail("me@gmail.com", $subject, $message, $headers);


      if($sendMail){
        echo "Mail Sent!!";
      }
      else {
        echo "Mail Not Sent!!";
      }
  }

  function validate_info($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
  }
?>

我根据一些更改编辑我的答案。现在,此代码仅在表单必填字段不为空且所有字段值根据您的验证有效时才允许发送邮件。

如果有任何问题,请告诉我!

【讨论】:

  • 厌倦了,它一直在发送空白电子邮件。它确实工作过一次,但不会发送完整的表单,而不是在我点击提交时发送。
  • 根据您的问题,您用空白初始化了每个错误消息变量。您还可以使用IF 语句应用条件检查。所以我的代码没有问题。让我知道你的validate_info() 在这里做什么?
  • 我用完整的代码编辑我的答案。如果不完美,请检查并告诉我。
  • 确实有效。我现在唯一的问题是由于某种原因,当它说已发送时,它不会向我发送包含数据的电子邮件。此外,当页面打开时,它仍然会发送一个空白表单。我想我可以通过使其成为简单的重定向来解决页面打开问题。非常感谢您到目前为止的帮助。
  • 所以我只是做了一些更多的测试,并且正在传递变量,因为它们可以正确回显。 mail() 函数中一定有错误。我会继续寻找并随时通知您。再次感谢。
【解决方案2】:

根据我的设想,你是

  1. 尝试在 if 条件中应用 'OR' - 应更改为 AND,即更改 || &&

  2. 您正在检查非空错误变量...应更改以验证它们是否全部为空。

if (empty($fnameErr) && empty($lnameErr) && empty($subjectErr) && empty($emailErr) && empty($commentErr) && empty($websiteErr) && empty($findoptionErr)) { echo "sent"; }

【讨论】:

    【解决方案3】:

    而不是写冗长的条件。

    1. 将所有错误消息分配给单个变量并将错误附加到它 ($errorMsg)。这样做可以避免冗长的 if else 阶梯。
    2. empty($_POST["email"]) 更改为 !isset($_POST["email"]) - 在所有语句中。

    然后将条件更新为以下,

    <?php
    if($errorMsg == ''){
      //Make the message.
      $message ="
      First Name: ".$fname.".\n
      Last Name: ".$lname."\n
      Website: ".$website."\n
      Did They Like the Site? ".$likedsite."\n
      How They Found Us. ".$findoption."\n
      Question/Comments:\n
      ".$comments." ";
      $message = wordwrap($message, 70);
      $headers = "From: $email";
      mail("me@gmail.com", $subject, $message, $headers);
    }else{
      // Show $errorMsg
    }
    ?>
    

    简单点,希望对你有帮助。

    【讨论】:

    • 我会这样做,但我仍然可以在导致错误的输入字段旁边回显错误吗?目前我将错误回显到 html 表单。名字:* 跨度>
    • 当前问题是,您正在发送外部条件的邮件。将其包裹在条件内。
    • 那么我应该为它创建一个变量还是将其粘贴在 if 语句中?
    • 从 if 语句中发送邮件。我更喜欢变量方法(因为它是标准方法)。尝试减少代码中的行数。这只是一个最佳实践。
    • 我尝试做的是 AddWeb Solution Pvt Ltd 发布的内容。我对其进行了一些更改,当我打开页面时收到一封空白电子邮件,然后我去提交已完成的表单并回显已发送。我还没有收到包含完整表格的电子邮件。我喜欢 if($sendMail) {echo "Sent";}else{echo "Not Sent";}
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多