我为电子邮件制作了一个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表单位于同一目录中,否则它将无法工作。