无法使用PHP $ _POST []变量检索jQuery序列化表单数据

时间:2017-03-06 10:46:39

标签: php jquery ajax forms

使用Ajax jQuery函数$.post(),我将jQuery serialized()表单数据发送到PHP函数,该函数在$_POST[]成功接收它,但个别$_POST['form_field']变量是空。

在我的PHP函数中,print_r($_POST)成功显示了表单数据:

Array ( [action] => send_message [data] => modal_name=olivier&modal_email=olivier%40hotmail.com&modal_message=Hello+world )

然而$_POST['modal_name']$_POST['modal_email']$_POST['modal_message'] 是空的。为什么呢?

HTML:

<form id='contact'>
  <input type='text' name='modal_name' id='modal_name' />
  <input type='email' name='modal_email' id='modal_email' />
  <textarea name='modal_message' id='modal_message'></textarea>
</form>

JS:

$('#contact').on('submit', function(e) {
  e.preventDefault();
  if (modal_name && modal_email && modal_message) {
    var data = {
      action: 'send_message',
      data: $(this).serialize()
    };
    $.post(WPaAjax.ajaxurl, data, function(response) {
      $('.modal').append(response);
    });
  }
});

2 个答案:

答案 0 :(得分:2)

使用$(this).serializeArray()代替$(this).serialize()

参考: - https://api.jquery.com/serializeArray/

两者之间的区别: - https://stackoverflow.com/a/10430571/4248328

您需要执行以下操作: -

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form id='contact'>
  <input type='text' name='modal_name' id='modal_name' />
  <input type='email' name='modal_email' id='modal_email' />
  <textarea name='modal_message' id='modal_message'></textarea>
  <input type="submit" value = "submit">
</form>

<script type="text/javascript">
$('#contact').on('submit', function(e) {
  e.preventDefault();
  if (modal_name && modal_email && modal_message) {
     var data = $(this).serializeArray();
     data.push({name: 'action', value: 'send_message'});
     $.post('query.php', data, function(response) {
      $('.modal').append(response);
    });
  }
});
</script>

在php中: -

<?php

if(!empty($_POST)){
    echo "<pre/>";print_r($_POST);
}
?>

输出如下: -

<pre/>Array
(
    [modal_name] => sdsadsa
    [modal_email] => a@gmail.com
    [modal_message] => sadada
    [action] => send_message
)

注意: - 如果您只想使用serialize(),请执行以下操作: -

<script type="text/javascript">
$('#contact').on('submit', function(e) {
  e.preventDefault();
  if (modal_name && modal_email && modal_message) {
     var data = $(this).serialize()+ '&action=send_message';
     $.post('query.php', data, function(response) {
      $('.modal').append(response);
    });
  }
});
</script>

答案 1 :(得分:0)

您应该使用$_POST['data']['modal_name']$_POST['data']['modal_email']$_POST['data']['modal_message']代替。也可以使用jQuery中的$.serializeArray()

原因是您将表单数据作为名为data的参数发送。