【问题标题】:empty $_POST in PHP mail()PHP mail() 中的空 $_POST
【发布时间】:2013-11-08 20:13:53
【问题描述】:

我们将不胜感激以下方面的帮助!我已经在网上和 stackoverflow 上搜索了几个小时。我的php邮件功能有这个问题。

我的网站上有一个表单(该网站使用 wordpress),其中包含两个文本字段,姓名和电话号码。表单中还有一个隐藏字段显示当前的 url,所以我们可以看到表单是在哪个页面填写的。这些信息也存储在 php session 中。

<?php session_start();
$_SESSION['url'] = $_SERVER['REQUEST_URI']; 
?> 

<form name="callback" action="callme.php" method="post" onsubmit="return(validate());">
<label>Name:</label><input type="text" name="name" size=15 />
<label>Tel:</label><input class="sky" type="text" name="tel" size=15 />
<div id="afterfive"><p>Call after five<input type="checkbox" name="afterfive" value="Call back after five"></p></div>
<input type="hidden" name="url" value="<?php echo $_SESSION['url']; ?>">
<input type="submit" class="classname" value="Call me back!" title="Call me back!" />
</form>

<script>
function validate()
{
if( document.callme.name.value == "" )
{
 alert( "Please fill in your name" );
 document.callme.name.focus() ;
 return false;
 }
if( document.callme.tel.value == "" )
{
alert( "Please fill in your phone number" );
document.callme.tel.focus() ;
return false;
}
}
</script>

以下php代码为callme.php:

<?php session_start();

$name = $_POST['name'];
$tel = $_POST['tel'];
$afterfive = $_POST['afterfive']; 
$url = $_POST['url'];

$to = "me@myemail.com";
$subject = "Please call back $name";
$message .= "Hi, the following person would like to be called back: \n";
$message .= "Name: $name \n";
$message .= "Phonenumber: $tel \n";
$message .= "$afterfive \n";
$message .= "This message was send from this page: $url \n";
$headers = "From: meagain@myemail.com" . "\r\n";
$headers .= "BCC: meagain@myemail.com" . "\r\n";

if(mail($to, $subject, $message, $headers)){
$_SESSION['name'] = $_POST['name'];
$_SESSION['tel'] = $_POST['tel'];
header("Location: http://www.mywebsite.thankyou");
}

?>

提交表单后,访问者将被重定向到我们的感谢页面,并有机会使用第二个表单填写其他信息。之前存储在 php 会话中的信息(表单字段名称、电话和 url)被添加到隐藏的表单字段中。

这在大多数情况下都可以正常工作,但有时我们会收到全部或部分字段为空的电子邮件。当然,这可能是禁用 javascript 的用户或提交空白表单的谷歌机器人,但奇怪的是,有时甚至 url 字段都是空的(表单在我们的主页上不可见)。 $_SERVER['REQUEST_URI'] 不应该一直有效吗?

我正在考虑添加 php 表单验证,但我不确定这是否能解决问题。这可能与 wordpress 的超缓存插件有关吗?或者它可能与php会话有关?

【问题讨论】:

  • 如果有人直接在浏览器中加载callme.php会发生什么?它将运行代码,并且 $_POST 和 $_SESSION 都不会包含任何内容。
  • “但有时我们会收到所有或部分字段为空的电子邮件” - 您应该使用服务器端方法,例如 if(empty($_POST['name'])){ die("You need to enter your name."); 等,这将确保您希望不为空的字段被填写。结合Andrewsi 提到的内容,在处理程序顶部使用if(isset($_POST['submit'])){,并将提交按钮命名为name="submit",这样callme.php 如果直接访问,将不会在没有提交按钮的情况下处理信息点击。
  • 谢谢!我没有想到。但是直接加载它确实会返回一封空电子邮件。这可能是谷歌机器人加载页面还是与超缓存插件有关?我觉得奇怪的是,我们有时会在一小时内收到多达 4 封空电子邮件...
  • @user2932451 在$name = $_POST['name']; 之上使用if(isset($_POST['submit'])){ 并在最后用大括号将其关闭,这将确保不会发生这种情况,正如我在评论中提到的那样。不客气。
  • @user2932451 以我在下面发布的内容为例。

标签: php forms session


【解决方案1】:

“但有时我们会收到所有或部分字段为空的电子邮件”

您应该使用服务器端方法而不是 JS,例如

if(empty($_POST['name'])){ die("You need to enter your name."); 

JS 总是可以被用户禁用,这是导致空电子邮件/字段的一个可能原因)

这将确保您希望不为空的字段被填写。结合Andrewsi 提到的内容,在处理程序顶部使用if(isset($_POST['submit'])){,并将提交按钮命名为name="submit",这样callme.php 如果直接访问,将不会在没有提交按钮的情况下处理信息点击。

例如:

注意:还有很多其他方法可以实现这一点,但这是一种基本但有效的方法。

为您的提交按钮命名,例如:

<input type="submit" name="submit" value="Submit">

在你的情况下,它会是:

<input type="submit" name="submit" class="classname" value="Call me back!" title="Call me back!" />

PHP 处理程序

<?php 

session_start();

if(isset($_POST['submit'])){

    if(empty($_POST['name'])){ die("You need to enter your name."); }
    if(empty($_POST['tel'])){ die("You need to enter your telephone number."); }
    if(empty($_POST['afterfive'])){ die("You need to fill this field."); }
    if(empty($_POST['url'])){ die("You need to fill this field."); }

    $name = $_POST['name'];
    $tel = $_POST['tel'];
    $afterfive = $_POST['afterfive']; 
    $url = $_POST['url'];

    $to = "me@myemail.com";
    $subject = "Please call back $name";
    $message .= "Hi, the following person would like to be called back: \n";
    $message .= "Name: $name \n";
    $message .= "Phonenumber: $tel \n";
    $message .= "$afterfive \n";
    $message .= "This message was send from this page: $url \n";
    $headers = "From: meagain@myemail.com" . "\r\n";
    $headers .= "BCC: meagain@myemail.com" . "\r\n";

    if(mail($to, $subject, $message, $headers)){
        $_SESSION['name'] = $_POST['name'];
        $_SESSION['tel'] = $_POST['tel'];
        header("Location: http://www.mywebsite.thankyou");
    }

}

// You could use this at end also to show a message
// if callme.php is accessed directly.
// else {echo "You cannot do that from here.";exit;}

?>

【讨论】:

  • 它似乎有效。执行上述代码后没有收到任何空邮件。再次感谢!
  • @user2932451 很高兴听到这个消息,非常欢迎您。很乐意提供帮助,干杯。
【解决方案2】:

您的 javascript 引用了 document.callme,但您的代码中没有任何具有该名称的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多