我已经制作了一个用于发送电子邮件的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;
?>
答案 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表单位于同一目录中,否则它将无效。