【问题标题】:How to access form data as an array of a JSON object in PHP如何在 PHP 中以 JSON 对象数组的形式访问表单数据
【发布时间】:2019-01-21 16:03:32
【问题描述】:

我有 jQuery Ajax 将表单数据发送到 WordPress 函数。

PHP 函数以字符串形式获取数据,例如“navn=A&navn2=B”,我使用 explode() 函数访问单个表单元素。

我认为有一种更好的方法可以直接访问作为 JSON 对象数组的表单数据。但我想不通。

我该如何解决?

这是我的 HTML/jQuery:

<form id='minForm' method="post" action="">
  <input type="text" name="navn" value="A">
  <input type="text" name="navn2" value="B">
  <button>Send</button>
</form>

<script>
  jQuery(document).ready(function($) {
    var form = $('#minForm');
    $(form).submit(function(event) {
      event.preventDefault();
      var formData = $(form).serialize();
      $.ajax({
        type: "POST",
        url: '/wp-admin/admin-ajax.php',
        data: {
          action     : 'my_ajax_action',
          formData   : formData,
        },
        success:function(data) {
          console.log(data);
        },
      });
    });
  });
</script>

这是我的 PHP:

add_action('wp_ajax_my_ajax_action', 'my_ajax_action_callback');

function my_ajax_action_callback() {
  $form_data = $_POST['formData'];
  $form_data_array = explode('&', $form_data);

  foreach ($form_data_array as $i) {
    echo explode('=', $i)[1] . '<BR>';
  }
  wp_die(); // Required. to end Ajax request.
}

【问题讨论】:

  • parse_str函数
  • 谢谢,不错的功能。不确定我是否应该更喜欢这个解决方案而不是其他答案。 BR

标签: php jquery json ajax wordpress


【解决方案1】:

将表单序列化为数组。然后在 Ajax 请求中传递它。

在客户端:

jQuery(document).ready(function($) {

      var form = $('#minForm');
      $(form).submit(function(event) {
        event.preventDefault();
        var formData = $(form).serializeArray();
        $.ajax({
          type: "POST",
          url: '/wp-admin/admin-ajax.php',
          dataType: 'json',
          data: {
            action     : 'my_ajax_action',
            formData   : formData,
          },
          success:function(data) {
            console.log(data);
          },
        });
      });
    });

在服务器端:

add_action('wp_ajax_my_ajax_action', 'my_ajax_action_callback');

function my_ajax_action_callback() {
  $response = ["success" => true];
  $form_data = json_decode($_POST['formData']);
  error_log(print_r($form_data, 1)); // Log to see the array properties.
  if (empty($form_data) {
      $response["success"]  = false;
  }
  echo json_encode($response);
  //wp_die(); // required. to end AJAX request.
}

注意:$(form).serializeArray() 会将表单作为 objectsarray 提供给您,它可能不是您期望在服务器端提取数据的方式。您可以在发送到服务器之前处理 form 数组,方法是将其转换为简单的 object

var formData = $(form).serializeArray().reduce(function(obj,item){
     obj[item.key] = item.value;
     return obj;
}, {});

【讨论】:

  • 为什么要注释掉 wp_die()?我是对的,这将返回真或假而不是任何数据?它返回假。为什么会这样?
  • @Kresten 我评论了,因为在您的回复中重要的是 json 对象的回声。如果你需要它,你可以使用它。在正常情况下,只要您不在进程中回显其他内容,您就不需要任何骰子来响应客户端
猜你喜欢
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多