我发现很多线程概述了与此类似的问题,但代码总是看起来有点不同,每个解决方案都有很大不同,所以对于那些对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
我真的难以接受这一点,而且几个小时的研究并没有让我到任何地方。如果有人能提供帮助,我真的很感激!谢谢!
编辑 - 很多人提到了不匹配的变量 - 我的错误,我复制了我保存的正在进行的文件,而不是当前活动的文件。现在修复了。遗憾!
答案 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,该变量未被设置,但在构建电子邮件正文时正在使用它。