web-dev-qa-db-fra.com

Lire un tableau associatif depuis json dans $ _POST

J'utilise jQuery pour poster un objet json dans mon application php. 

jQuery.post("save.php",JSON.stringify(dataToSend), function(data){ alert(data); });

La chaîne json tirée de firebug ressemble à ceci

{ "data" : [ { "contents" : "This is some content",
        "selector" : "DIV.subhead"
      },
      { "contents" : "some other content",
        "selector" : "LI:nth-child(1) A"
      }
    ],
  "page" : "about_us.php"
}

En php j'essaye de transformer ceci en tableau associatif.

Mon code php jusqu'à présent est

<?php
$value = json_decode(stripcslashes($_POST));
echo $value['page'];
?>

La réponse à l'appel ajax devrait être "about_us.php" mais elle revient vide.

18
Daniel

Vous pouvez éviter d'utiliser JSON.stringify et json_decode:

jQuery.post("save.php", dataToSend, function(data){ alert(data); });

Et:

<?php
echo $_POST['page'];
?>

Mettre à jour:

... mais si vous voulez vraiment les utiliser, alors:

jQuery.post("save.php",  {json: JSON.stringify(dataToSend)}, function(data){ alert(data); });

Et:

<?php
$value = json_decode($_POST['json']);
echo $value->page;
?>
16

$_POST ne sera pas renseigné si le corps de la demande n'est pas sous la forme standard codée par url.

Lisez plutôt le flux php://input en lecture seule comme ceci pour obtenir le corps de la demande brute:

$value = json_decode(file_get_contents('php://input'));
86
Evert

Passez le second argument comme vrai si vous voulez le tableau associatif, sinon il retournera en permanence objet.

$value = json_decode(stripslashes($_POST),true);
3
Shakti Singh

Essayer:

echo $value->page;

depuis json_decode, le comportement par défaut consiste à renvoyer un objet de type stdClass.

Sinon, définissez le deuxième argument $assoc facultatif sur true:

$value = json_decode(stripslashes($_POST), true);
echo $value['page'];
1
karim79

Il semble que jQuery pourrait coder un objet javascript sous forme codée par url puis être rempli dans $ _POST. Au moins d'après leurs exemples . J'essaierais de passer votre objet dans post() sans le préciser.

1
Paul DelRe

Si vous souhaitez utiliser les données json comme un tableau associatif, vous pouvez essayer comme suit: 

<?php 

$json = 'json_data'; // json data

$obj = jsondecode($json, true); // decode json as associative array 

// now you can use different values as 
echo $obj['json_string']; // will print page value as 'about_us.php' 


for example: 

$json = { "data" : [ { "contents" : "This is some content",
    "selector" : "DIV.subhead"
   },
   { "contents" : "some other content",
    "selector" : "LI:nth-child(1) A"
   }
  ],
"page" : "about_us.php"
}

$obj = json_decode($json, true); 

/* now to print contents from data */

echo $obj['data']['contents']; 
 // thats all 
?>
0
Mukesh