2014-10-01 2 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

+0

Я прочитал некоторые другие проблемы, связанные с потоками $ _POST здесь, которые говорят, что isset не должен использоваться для массивов, но для одиночных значений. Наверное, это неправильно? – Curtis

+0

Это зависит от того, что вы проверяете. См. Мой ответ. – developerwjk

ответ

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, которые не должны использоваться для массивов, но для одиночных значений. Наверное, это неправильно?

if(!isset($_POST)) будет проверять, была ли вообще установлена ​​переменная $ _POST вообще.

if(!array_key_exists('x', $_POST)) проверяет, существует ли ключ x в массиве $ _POST. Это в основном то же самое, что и 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.

Смежные вопросы