18

我有一个简单的 php 文件,可以解码我的 json 字符串,用 ajax 传递,并标记结果,但我不能保留$_POST变量,为什么???

我尝试使用 fireBug 进行检查,我可以看到 POST 请求已正确发送,当调用php脚本时,他向我响应 Noooooooob,似乎设置了任何 POST 变量。

我想要的只是拥有我的数组=)

生成的 JSON 字符串JSON.stringify

[
   {
      "id":21,
      "children":[
         {
            "id":196
         },
         {
            "id":195
         },
         {
            "id":49
         },
         {
            "id":194
         }
      ]
   },
   {
      "id":29,
      "children":[
         {
            "id":184
         },
         {
            "id":152
         }
      ]
   },
   ...
]

JavaScript

$('#save').click(function() {
  var tmp = JSON.stringify($('.dd').nestable('serialize'));
  // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
  $.ajax({
    type: 'POST',
    url: 'save_categories.php',
    dataType: 'json',
    data: {'categories': tmp},
    success: function(msg) {
      alert(msg);
    }
  });
});

save_categories.php

<?php
  if(isset($_POST['categories'])) {
    $json = $_POST['categories'];
    var_dump(json_decode($json, true));
  } else {
    echo "Noooooooob";
  }
?>
4

4 回答 4

24

如果您删除dataType: 'json',您的代码就可以工作,只需对其进行测试。

$('#save').click(function() {
  var tmp = JSON.stringify($('.dd').nestable('serialize'));
  // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
  $.ajax({
    type: 'POST',
    url: 'save_categories.php',
    data: {'categories': tmp},
    success: function(msg) {
      alert(msg);
    }
  });
});
于 2013-11-14T11:50:24.250 回答
4

dataType 是 json,所以 jQuery 发布了这个:

{"categories":"[{\"id\":21,\"children\":[{\"id\":196},{\"id\":195},{\"id\":49},{\"id\":194}]},{\"id\":29,\"children\":[{\"id\":184},{\"id\":152}]},...]"}

这不是标准的 urlencoded,所以 $_POST 是空的。

您可以将数据设置为复杂的结构,jQuery 会正确地对其进行编码:

$('#save').click(function() {
  $.ajax({
    type: 'POST',
    url: 'save_categories.php',
    dataType: 'json',
    data: $('.dd').nestable('serialize'),
    success: function(msg) {
      alert(msg);
    }
  });
});

在 php 中:$categories = json_decode(file_get_contents('php://stdin'));

于 2013-11-14T11:50:15.123 回答
4

这对我有用,你可以试试这个。JavaScript

$('#save').click(function() { $.ajax({ type: 'POST', contentType: 'application/json', url: 'save_categories.php', dataType: 'json', data: JSON.stringify({'categories': $('.dd').nestable('serialize')}), success: function(msg) { alert(msg); } }); });

您需要在 save_categories.php 上编写以下代码 $_POST 预先填充了表单数据。

要获取 JSON 数据(或任何原始输入),请使用 php://input。

$json = json_decode(file_get_contents("php://input"));
$categories = $json->categories;
于 2017-08-08T08:54:50.817 回答
0

试试这个:

$('#save').click(function() {
  var tmp = JSON.stringify($('.dd').nestable('serialize'));
  // tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
  $.ajax({
    type: 'POST',
    url: 'save_categories.php',
    dataType: 'json',
    data: 'categories=' + encodeURIComponent(tmp),
    success: function(msg) {
      alert(msg);
    }
  });
});

我只改变了这一行:

data: 'categories=' + encodeURIComponent(tmp),

因为就是这样,你必须如何在那里写入数据。我测试了它,它的工作...

于 2013-11-14T11:44:10.490 回答