具有已验证字段的 PHP 电子邮件发送问题


PHP email sending issue with validated fields

>我遇到了一个问题,我已经成功验证了表单中的输入和必填字段。但是,如果用户提交表单,无论字段是否为空;它显示带有字段的错误消息,但也发送空电子邮件。

我相信只需要做一个简单的调整。但我迷路了。请查看我拥有的以下代码:

<?php
$nameErr = $snameErr = $emailErr = $ownerNameErr = $ownerNatErr = $genderErr = $websiteErr = "";
$name = $sname = $regAddress = $email = $gender = $comment = $ownerName = $ownerNat = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
   if (empty($_POST["name"]))
     {$nameErr = "Name is required";}
   else
     {
     $name = test_input($_POST["name"]);
     // check if name only contains letters and whitespace
     if (!preg_match("/^[a-zA-Z ]*$/",$name))
       {
       $nameErr = "Only letters and white space allowed"; 
       }
     }
if (empty($_POST["sname"]))
     {$snameErr = "Company Second Name is required";}
   else
     {
     $sname = test_input($_POST["sname"]);
     // check if name only contains letters and whitespace
     if (!preg_match("/^[a-zA-Z ]*$/",$sname))
       {
       $snameErr = "Only letters and white space allowed"; 
       }
     }
          extract($_POST);
     $to="example@example.com";
    $subject="Subject";
$body="<table width='100%' cellspacing='10' cellpadding='0'>
    <tr>
            <td style='color:blue;font-weight:bold;margin-left:500px;font-size:20px;' colspan='3'>My Form</td>
    </tr>
  <tr>
    <td>Name</td>
    <td>:</td>
    <td>$name</td>
  </tr>
<tr>
    <td>Second Choice</td>
    <td>:</td>
    <td>$sname</td>
  </tr>
</table>";
$headers  = 'MIME-Version: 1.0' . "'r'n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "'r'n";
$headers .= 'From: MySite '."'r'n";
/*$headers .= 'Reply-To:'."$textfield5"."'r'n";*/

if(mail($to,$subject,$body,$headers))
{

       $msg = "Thank you for contacting us. We will get back to you soon.";
    /*$msg= "Successfully Sent";*/
}
else
{
    $msg= "msg not sent";
}
}
function test_input($data)
{
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     return $data;
}
?>

网页部件

<span class="error">* <?php echo $ownerNatErr;?></span>
   <br><br>
   E-mail: <input type="text" name="email" value="<?php echo $email;?>">
   <span class="error">* <?php echo $emailErr;?></span>
   input type="submit" name="submit" value="Submit Information">

任何帮助/建议都非常感谢。

问候。

您的验证是正确的,我认为它可以满足您的需求,但是:如果验证失败,您不会阻止mail()函数运行。

你可以这样做:

if ($valid) {
    if (mail(...) {
        ...
    } else {
        ...
    }
 }

默认情况下,此$valid变量 sou 应设置为 true,在设置错误消息的 if 语句中,应将变量设置为 false

这样,当输入仅有效时,将调用邮件函数。

干杯。

检查参数是否存在错误并设置一些错误消息,但即使发现错误,代码调用也会mail

您可能需要添加一些条件:

if($snameErr === '' && $nameErr === '' ...) {
  // call mail here, check whether it was successful and
  // tell the user about it
} else {
  // show error message or something else
}

顺便说一句,我想你的代码很脆弱,因为你使用了extract($_POST).攻击者可能会注入任意变量,因此可以绕过您的检查。