HTML表单传递空的$ _POST数据

时间:2014-10-01 23:43:45

标签: php html forms post

我已经制作了一个用于发送电子邮件的HTML表单。我用过

 if(!array_key_exists($_POST)) {
    $data = file_get_contents('php://input');
 }

确定$ _POST数组为空,并且没有使用下面的代码将值传递给php输入。这是怎么回事?

这是我的代码:

HTML:

<form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" role="form">
                        <div class="row">
                            <div class="col-sm-6">
                                <div class="form-group">
                                    <input type="text" class="form-control" required="required" placeholder="Name" id="name" name="name">
                                </div>
                            </div>
                            <div class="col-sm-6">
                                <div class="form-group">
                                    <input type="text" class="form-control" required="required" placeholder="Email address" id="email" name="email">
                                </div>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-sm-12">
                                <div class="form-group">
                                    <textarea name="message" id="message" required="required" class="form-control" rows="8" placeholder="Message"></textarea>
                                </div>
                                <div class="form-group">
                                    <input type="submit" class="btn btn-danger btn-lg" value="Send Message">
                                </div>
                            </div>
                        </div>
                    </form>

PHP:

<?php
header('Content-type: application/json');
$status = array(
    'type'=>'success',
    'message'=>'Email sent!'
);

$subject = "Contact from Website";

$name =  $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
if(!array_key_exists($_POST)) {
    $name= "empty";
    $email = "empty";
    $message = "empty";
    $data = file_get_contents('php://input');
}
$email_to = 'myemail@domain.com';

$body = "A message has been submitted from your website: \n" .  "Name: ". $name . "\nEmail: " . $email . "\nMessage: " . $message . "\nData: " . $data;

mail($email_to, $subject, $body, 'From: ' . $email . '\n\r'); 

echo json_encode($status);
die;
?>

3 个答案:

答案 0 :(得分:1)

  

我在这里读了一些其他麻烦的问题,就是说isset不应该用于数组而是用于单个值。我猜那是错的?

if(!isset($_POST))将检查变量$ _POST是否已设置为任何内容。

if(!array_key_exists('x', $_POST))将检查数组$ _POST中是否存在密钥x。这与if(!isset($_POST['x']))基本相同,除了密钥x确实存在但已明确赋值为null的情况。来自docs for array_key_exists

中的示例
<?php
$search_array = array('first' => null, 'second' => 4);

// returns false
isset($search_array['first']);

// returns true
array_key_exists('first', $search_array);
?>

通常在检查帖子参数时,您的兴趣不仅在于密钥的存在,而且还在于它不是空的。因此,即使在寻找特定密钥时,isset也更有意义。但当然只需检查$ _POST对象就应该使用isset。

答案 1 :(得分:0)

你严重误导了array_key_exists。另外假设您不希望在未发布表单时发送电子邮件,只需检查顶部并挽回未设置:if (!isset($_POST)) exit;

答案 2 :(得分:0)

尝试删除此行:

header('Content-type: application/json');

您是否在此输出Ajax标头?如果是这样,那么您的问题就在JavaScript中。

为了天国的缘故,请对帖子进行健全检查:

if (!empty($_POST)) { // insert process code here }

如果它不是ajax,你的行动应该是这个:

action="/sendemail.php"

您拥有的代码是相对的,sendemail.php需要与您的html表单位于同一目录中,否则它将无效。