PHP表单生成空白电子邮件

时间:2014-04-04 17:13:46

标签: php forms

我发现很多线程概述了与此类似的问题,但代码总是看起来有点不同,每个解决方案都有很大不同,所以对于那些对PHP世界非常环保的人来说,我真的很感激一些额外的帮助!

我们的目标网页上有潜在客户表单。大部分时间他们都在工作,并且有一个系统来保持空白提交或提交缺少必填字段。但是,我们已经从这些表单中获得了一系列完全空白的电子邮件 - 通常在两个完全相同的时间连续发送,但并非总是如此。我不认为有人在没有填写字段的情况下按下提交按钮,因为我已经多次测试了这一点并且没有任何事情发生过。我知道足够的PHP能够普遍认识到我所看到的东西,但是我从零开始写东西的经验很少,而且这些形式是由在我之前担任我职务的人制作的,所以他们可能会这样做。 #39;以某种基本的方式搞砸了,我只是因为我有限的PHP经验而无法识别它。

这是我们页面的表单部分的html:

<form method="post" name="form-name" id="form-name" action="process.php">
    <input type="hidden" id="PIN" name="PIN"/>


        <input type="text" name="firstname" class="lettersonly" id="firstname"  placeholder="First Name" value="" required />
        <input type="text" name="lastname" class="lettersonly" id="lastname" placeholder="Last Name" value="" required />


        <input type="email" name="email" class="email" id="email" placeholder="Email" value="" required />

        <input type="tel" name="phone" class="digits" id="phone" placeholder="Phone" value="" required />

        <input type="text" name="zipcode" class="digits" id="zipcode" placeholder="Zip Code" value="" required />

    <?php echo $errorString; ?>

    <div id="submit_buttons">
        <input type="submit" class="submit-form" />
    </div>
    </form>

这里是我们的整个process.php文件:

<?php
session_start();

$allowedFields = array(
    'firstname',
    'lastname',
    'email',
    'phone',
    'zipcode',
);

$requiredFields = array(
    'firstname',
    'lastname',
    'email',
    'phone',
    'zipcode',
);

$requiredEmail = array(
    'email',
);

$errors = array();
foreach($_POST AS $key => $value)
{
    // first need to make sure this is an allowed field
    if(in_array($key, $allowedFields))
    {
        $$key = $value;

        // is this a required field?
        if(in_array($key, $requiredFields) && $value == '') 
        {
            $errors[] = "The field $key is required.";
        }

        // is this a required field?
        if(in_array($key, $requiredEmail) && !filter_var($value, FILTER_VALIDATE_EMAIL))    
        {
            $errors[] = "A valid email is required.";
        }
    }   
}

// were there any errors?
if(count($errors) > 0)
{
    $errorString = '<div class="error2"><h1>There was an error with the form.</h1><br />';
    $errorString .= '<ul>';
    foreach($errors as $error)
    {
        $errorString .= "<li>$error</li>";
    }
    $errorString .= '</ul></div>';

    // display the previous form
    include 'index.php';
}
else
{

if(isset($_POST['firstname'])){ $firstname = $_POST['firstname']; } 
if(isset($_POST['lastname'])){ $lastname = $_POST['lastname']; } 
if(isset($_POST['email'])){ $email = $_POST['email']; } 
if(isset($_POST['phone'])){ $phone = $_POST['phone']; } 
if(isset($_POST['zipcode'])){ $zipcode = $_POST['zipcode']; } 

$formcontent = "$firstname $lastname \r\n$email \r\n$phone \r\n$zipcode \r\n";;

    // toggle this line on or off for testing with '//'  
//$recipient = "<ben@plumdm.com>";

    // change emails
$recipient = "Web Dev <developer@site.com>";

    // change subject line number
$subject = "getmyreport.org/001 - Landing Page Lead";

$mailheader = "Landing Page <landings@plumdm.com>";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");

    // change url number
header("Location: http://www.getmyreport.org/thanks.html");
}

我确实根据我在其他类似主题中所阅读的内容进行了更改,但它似乎没有起作用。我改变了原始代码:

$_POST['firstname'])){ $name = $_POST['firstname'];

,这是在上面的当前代码中:

if(isset($_POST['firstname'])){ $name = $_POST['firstname']; } 

它适用于其他类似帖子的海报,但我仍然收到空白的电子邮件。

我还注意到在error_log文件中,有一些条目对应于空白电子邮件的到达,如下所示:

[04-Apr-2014 10:49:22 America/Denver] PHP Notice:  Undefined variable: firstname in /home3/plumdmco/public_html/getmyreport/001/process.php on line 69
[04-Apr-2014 10:49:22 America/Denver] PHP Notice:  Undefined variable: lastname in /home3/plumdmco/public_html/getmyreport/001/process.php on line 69
[04-Apr-2014 10:49:22 America/Denver] PHP Notice:  Undefined variable: email in /home3/plumdmco/public_html/getmyreport/001/process.php on line 69
[04-Apr-2014 10:49:22 America/Denver] PHP Notice:  Undefined variable: phone in /home3/plumdmco/public_html/getmyreport/001/process.php on line 69
[04-Apr-2014 10:49:22 America/Denver] PHP Notice:  Undefined variable: zipcode in /home3/plumdmco/public_html/getmyreport/001/process.php on line 69

我真的难以接受这一点,而且几个小时的研究并没有让我到任何地方。如果有人能提供帮助,我真的很感激!谢谢!

编辑 - 很多人提到了不匹配的变量 - 我的错误,我复制了我保存的正在进行的文件,而不是当前活动的文件。现在修复了。遗憾!

2 个答案:

答案 0 :(得分:2)

我相信发生的事情是用户会以某种方式直接进入process.php。即使POST阵列为空,这也会触发电子邮件,从而产生空电子邮件。由于POST数组为空,因此您将获得那些未定义的变量通知。为避免这种情况,您可以将process.php中的所有代码包装在if块中。

如果有人直接访问该页面,则SERVER请求方法将为GET。这将把用户重定向到表单页面,而不是发送电子邮件。

if ($_SERVER["REQUEST_METHOD"] == "POST"){

    $allowedFields = array(
        'firstname',
        'lastname',
        'email',
        'phone',
        'zipcode',
    );

    //same, same, same, all the way down to

    // change url number
    header("Location: http://www.getmyreport.org/thanks.html");
    }

} else {

    header("Location: index.php");

}

此外,此行有两个分号:

$formcontent = "$firstname $lastname \r\n$email \r\n$phone \r\n$zipcode \r\n";;  //;;

答案 1 :(得分:0)

如何处理表单字段的验证存在问题。如果有人编写了一个发布到此页面的脚本并且他们没有传递任何$_POST值,那么您实际上将循环遍历一个空的$_POST数组,这意味着您将循环零次。没有任何内容可以验证,因为所有验证都在该循环内完成,count($errors)将为零。

您还需要在$requiredFields数组上循环,并确保$_POST中存在每个字段。

这也可以解释您所看到的错误。这些变量在$ _POST中不存在,因此isset($_POST['...'])返回false,该变量未被设置,但在构建电子邮件正文时正在使用它。