2014-10-01 50 views
-3

我制作了一个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 = '[email protected]'; 

$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; 
?> 
+1

'if(!array_key_exists($ _ POST))':您是否阅读过该函数的文档?你甚至最终如何使用它? – developerwjk 2014-10-01 23:49:47

+0

我读了一些其他问题$ _POST线程在这里说isset不应该用于数组,但单个值。我猜这是错的? – Curtis 2014-10-02 00:13:44

+0

这取决于你在检查什么。看到我的答案。 – developerwjk 2014-10-02 23:29:12

回答

0

您惨重滥用array_key_exists。同时假设你不想发送电子邮件时,形式不贴了,只是检查在顶部和保释出来,如果它没有设置:if (!isset($_POST)) exit;

0

尝试删除这一行:

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

你在这里输出一个Ajax的头文件吗?如果是这样,这听起来像你的问题是在JavaScript中。

而且看在上帝的份上,请不要在后一个全面的检查:

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

你的行动也许应该是这样,如果它不是阿贾克斯:

action="/sendemail.php"

你的代码是相对的,sendemail.php需要和你的html表单在同一个目录中,否则它将无法工作。

1

我读了一些其他的麻烦在这里说$ _POST线程说isset不应该用于数组,但单个值。我猜这是错的?

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

if(!array_key_exists('x', $_POST))将检查密钥x是否存在于数组$ _POST中。这与​​基本相同,只是在密钥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。