向 mySQL 提交重复主菜的表单和两封具有 php 函数 mail() 的电子邮件

Form submitting duplicate entree's to mySQL and two emails with php function mail()

我有一个包含表单的简单 php 页面。提交后,它应该发送 2 封电子邮件(一封给我,一封给我的老板),并将其数据插入我的数据库。相反,它发送了 4 封电子邮件(两封给我,两封给我的老板),并插入了两行相同的数据而不是一行。知道为什么会这样吗?

编辑:我发现问题仅在您刷新页面时出现,并且每次刷新页面时它都会发送一份新的 email/data。

这是我的 PHP(如果您看到已删除,出于安全原因,我删除了引号中的内容)

if (isset($_POST['submitted'])){
    define('DB_NAME', 'removed');
    define('DB_USER', 'removed');
    define('DB_PW', 'removed');
    define('DB_HOST', 'removed');

    $link = mysqli_connect(DB_HOST, DB_USER, DB_PW, DB_NAME);

    if(!$link){
        die('Test Connection Failed 1: ' . mysqli_error());
    }

    //Name
    $FName = $_POST['FName'];
    $FName = mysqli_real_escape_string($link, $FName);
    $LName = $_POST['LName'];
    $LName = mysqli_real_escape_string($link, $LName);
    $Company = $_POST['Company'];
    $Company = mysqli_real_escape_string($link, $Company);

    //Phone
    $Phone1 = $_POST['Phone1'];
    $Fax = $_POST['Fax'];

    //Address
    $Street = $_POST['Street'];
    $Street = mysqli_real_escape_string($link, $Street);
    $City = $_POST['City'];
    $City = mysqli_real_escape_string($link, $City);
    $State = $_POST['State'];
    $State = mysqli_real_escape_string($link, $State);
    $Zip = $_POST['Zip'];
    $Zip = mysqli_real_escape_string($link, $Zip);
    $Country = $_POST['Country'];
    $Country = mysqli_real_escape_string($link, $Country);

    //Message
    $Message = $_POST['Message'];
    $Message = mysqli_real_escape_string($link, $Message);

    //Email
    $Email = $_POST['Email'];
    $Email = mysqli_real_escape_string($link, $Email);

        //Email
    $Email2 = $_POST['Email2'];
    $Email2 = mysqli_real_escape_string($link, $Email);


    $sqlInsert = "INSERT INTO `removed`.`removed`(`ID`, `FName`, `LName`, `Company`, `Phone`, `Fax`, `Street`, `City`, `State`, `Country`, `Zipcode`, `Email`, `Message`) VALUES (NULL, '".$FName."', '".$LName."', '".$Company."', '".$Phone1."', '".$Fax."', '".$Street."', '".$City."', '".$State."', '".$Country."', '".$Zipcode."', '".$Email."', '".$Message."')";

    if(!mysqli_real_query($link, $sqlInsert)){
        echo "Failed To Post To Database";
    } else {
        mysqli_close($link);    
    }

    //Validate first
    if(empty($LName)||empty($Email)) 
    {
        echo "Name and email are mandatory!";
        exit;
    }

    $email_from = $Email;
    $email_subject = "Bel Air Contact Form";
    $email_body = '<html><body>';
    $email_body .= '<table border="1" cellpadding="15">';
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>Name:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $FName . " " . $LName . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>Company:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $Company . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>Email Address:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $Email . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>Secondary Email Address:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $Email2 . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>Street:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $Street . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>City:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $City . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>State:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $State . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>Country:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $Country . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>Zipcode:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $Zipcode . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>Phone:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $Phone1 . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66CCFF' width='150px'><strong>Fax:</strong> </td><td bgcolor='#66CCFF' width='400px'>" . $Fax . "</td></tr>";
    $email_body .= "<tr><td bgcolor='#66FFFF' width='150px'><strong>Message:</strong> </td><td bgcolor='#66FFFF' width='400px'>" . $Message . "</td></tr>";
    $email_body .= "</table>";
    $email_body .= "</body></html>";

    $rbailey = "removed";
    $info = "removed";
    $headers = "From: $email_from \r\n";
    $headers .= "Reply-To: $Email \r\n";
    $headers .= 'X-Mailer: PHP/' . phpversion();
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

    mail($rbailey,$email_subject,$email_body,$headers);
    mail($info,$email_subject,$email_body,$headers);

} //End of ISSET if statement

?>

如果需要,我可以包含该表单,但它是一个非常基本的表单,包含大量字段,所以我将其省略,这样我的 post 就不会太长。

郑重声明,您的 header 中缺少一个圆点:

$headers  = 'MIME-Version: 1.0' . "\r\n";
         ^

仅此一项就会打破你的 headers。

问题似乎是由于页面刷新造成的。

要解决此问题,请在最后一个 mail() 调用后添加一个 header,并确保在 header.

之前不输出

即:

mail($info,$email_subject,$email_body,$headers);
header("Location: http://www.example.com");
exit;

在您的表单中,添加 autocomplete="off" 您的表单,and/or 您的输入字段。

<form action="your_page.php" method="post" autocomplete="off">

这在 HTML5 中很有用,可以清除以前在表单中输入的任何内容。

  • 您还可以使用会话和令牌。

这里有一个link可以参考:

旁注:

只是为了让您少敲几下键盘;你可以这样做:

$FName = mysqli_real_escape_string($link, $_POST['FName']);

等而不是定义两次。