HTML表单传递空的$_POST数据


HTML form passing empty $_POST data

我为电子邮件制作了一个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;
?>

我在这里读到了其他一些解决$_POST线程问题的文章,其中说isset不应该用于数组,而应该用于单个值。我想这是错的?

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

if(!array_key_exists('x', $_POST))将检查关键字x是否存在于数组$_POST中。这基本上与if(!isset($_POST['x']))相同,除了密钥x确实存在但被明确赋予null值的情况。来自文档中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);
?>

通常,当检查post参数时,您的兴趣不仅在于密钥的存在,还在于它不是null。所以isset更有意义,即使在寻找特定的密钥时也是如此。但是,在检查$_POST对象时,当然应该使用isset。

您严重滥用array_key_exists。此外,假设您不想在表单未发布时发送电子邮件,只需检查顶部,如果未设置则退出:if (!isset($_POST)) exit;

尝试删除此行:

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

您在这里输出Ajax的头吗?如果是这样的话,听起来你的问题就在JavaScript中。

看在上帝的份上,请在帖子上做一次理智的检查:

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

如果不是ajax,您的操作可能应该是这样的:

action="/sendemail.php"

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