Подтвердить что ты не робот

Проводка JSON с jquery ajax для PHP

У меня есть простой php файл, который декодирует мою строку json, передается с ajax и штамп результата, но я не могу сохранить переменную $_POST, почему???

Я пытаюсь проверить с помощью FireBug, и я вижу, что запрос POST отправляется правильно, когда вызывается php script, он отвечает 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";
  }
?>
4b9b3361

Ответ 1

Ваш код работает, если вы удалите 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);
    }
  });
});

Ответ 2

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'));

Ответ 3

Попробуйте следующее:

$('#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),

потому что так, как вы должны писать данные там. Я протестировал его, его работа...

Ответ 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://.

$json = json_decode(file_get_contents("php://input"));
$categories = $json->categories;