PHP电子邮件发送问题与验证字段

时间:2013-11-02 09:23:44

标签: php

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

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

<?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;
}
?>

HTML部分

<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">

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

问候。

2 个答案:

答案 0 :(得分:2)

您的验证是正确的,我认为它符合您的要求,但是:如果验证失败,则不会阻止mail()函数运行。

你可以这样做:

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

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

这样,如果输入有效,则会调用mail函数。

干杯。

答案 1 :(得分:0)

您检查参数是否有错误并设置了一些错误消息,但无论如何您的代码都会调用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)。攻击者可能会注入任意变量,因此可以绕过您的检查。