web-dev-qa-db-fra.com

Publication de JSON avec jquery ajax dans PHP

J'ai un simple fichier php qui décode ma chaîne json, passée avec ajax, et marque le résultat, mais je ne peux pas conserver la variable $_POST, pourquoi ???

J'essaie d'inspecter avec fireBug et je constate que la demande POST est envoyée correctement. Lorsque le script php est appelé, il me répond Noooooooob, il semble que tout POST variable est définie.

Tout ce que je veux, c'est avoir mon tableau =)

Chaîne JSON générée par 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";
  }
?>
15
The_Guy

Votre code fonctionne si vous supprimez dataType: 'json', venez de le tester.

$('#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);
    }
  });
});
17
melc

dataType est json, donc jQuery poste ceci:

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

Ce n'est pas un code url standard, donc $ _POST est vide.

Vous pouvez définir les données de votre structure complexe et jQuery les encodera correctement:

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

Et en php: $categories = json_decode(file_get_contents('php://stdin'));

4
Marek

Essaye ça:

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

J'ai juste changé cette ligne:

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

car c’est comme ça que vous devez écrire des données. Je l'ai testé, ça marche ...

0
Legionar

c'est un travail pour moi, tu peux essayer ça. 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); } }); });

vous devez écrire le code ci-dessous sur save_categories.php $ _POST est pré-rempli avec les données du formulaire.

Pour obtenir des données JSON (ou toute entrée brute), utilisez php: // input.

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