2010-03-03 5 views
3

Je suis en train de passer un objet JavaScript à un script PHP par jquery.ajax(), essentiellement:Pour JSON et json_decode en PHP et JavaScript

var bigArray = new Object(); 
//Dode 
//Start loop 
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i}; 

Il est à peu près un tableau de ces objets.

var anotherTest = $.toJSON(bigArray); 
    var ajxFile = "routineajax.php"; 
    $.ajax({ 
     type: 'POST', 
     processData: false, 
     url: ajxFile, 
     data: anotherTest, 
     success: function(data) { 
      $('#result').html(data); 
      alert('Load was performed.'); 
     } 
    }); 
}); 

Le script PHP côté

print_r($_POST); 
$params = json_decode($_POST); 
print_r($params) 

L'appel Ajax traverse, et je peux voir dans Firebug, mais print_r($_POST) retourne un tableau vide. Alors que si je le change à $_GET à la fois la fonction $.ajax et le script PHP cela fonctionne. Mon problème principal est que je reçois ce message d'erreur:

Attention: json_decode() attend le paramètre 1 à être une chaîne, un tableau donné dans

Comment puis-je résoudre ce problème?


Après avoir ajouté cet extrait dans le fichier PHP

$data = file_get_contents('php://input'); 
    var_dump($data); 
    var_dump(json_decode($data)); 

Je reçois cette sortie

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)` 
    object(stdClass)[2] 
     public '0' => 
     object(stdClass)[4] 
      public 'name' => string 'Decline Abs' (length=11) 
      public 'id' => string '54' (length=2) 
      public 'order' => int 0 
      public 'set' => string '' (length=0) 
      public 'inc' => string '' (length=0) 
      public 'example' => string '' (length=0) 
      public 'day' => int 1 

donc au moins ça va à travers, je ne sais pas comment accéder cependant, un pas dans la bonne direction!

+0

Pouvez-vous éditer votre question avec les résultats de print_r ($ _ GET). Je vois que vous l'avez ci-dessous, mais ce n'est pas clair pour moi. – notJim

Répondre

3

Je pense que le problème est que normalement les données POST sont envoyées codées sous la forme key=value&key2=value2 et que vous l'envoyez en tant que JSON. Essayez d'accéder aux données de base brut comme suit:

$data = file_get_contents('php://input'); 
var_dump($data); 
var_dump(json_decode($data)); 

et voir si cela fonctionne. Si ce n'est pas le cas, s'il vous plaît postez dans votre question ce qu'il retourne, si quelque chose.


Basé sur le commentaire ci-dessous et ajouts à l'OP.

Le var_dump de $data a-t-il correctement copié-collé?La raison pour laquelle je demande est la suivante: string'{"0"{"name" ne me semble pas juste. Ce n'est pas JSON valide ou une chaîne POST correctement codée. Il se peut que certains des caractères aient été codés lorsque vous avez copié et collé.

De toute façon, vous obtenez maintenant le résultat dont vous avez besoin. Le stdClass est juste un conteneur vide dans lequel il place les données, auquel vous pouvez accéder en utilisant la syntaxe d'objet normale. Dans ce cas, vous devriez faire $data->{0}->name je pense, à cause de cela 0. Si vous faites $data = json_decode($data, true) ce sera un tableau associatif, et vous pouvez accéder aux données POST'ED comme $data[0]['name']. Si vous voulez continuer à explorer cela, il peut être utile de montrer les résultats de faire window.console.dir(data) avant de faire la requête ajax, et assurez-vous que lorsque vous var_dump(data), vous voyez la source de la page à copier et coller. window.console.dir(data) affichera les propriétés data dans la fenêtre Firebug (vous utilisez Firebug, non?). Il fonctionne également dans le débogueur de Chrome, et peut-être d'autres aussi. Comme je l'ai dit, il semblerait que vous obteniez probablement déjà ce dont vous avez besoin. Il n'est donc pas nécessaire d'enquêter.

+0

j'ai ajouté la sortie dans l'OP. il semble se déplacer dans la bonne direction maintenant.Pouvez-vous expliquer ce que s passe cependant? – mike

+0

Voir mes ajouts ci-dessus. – notJim

+0

SO question sur stdclass, au cas où vous n'êtes pas familier avec elle: http://stackoverflow.com/questions/931407 – notJim

0

N'est-ce pas assez clair? json_decode() s'attend à ce que le paramètre un soit une chaîne, pas un tableau. Mais $_POST et $_GET sont toujours des tableaux. Vous pouvez passer un membre de ce tableau à json_decode().

Pour voir le contenu d'un tableau, utilisez cet extrait:

echo "<pre>"; 
print_r($_GET); 
echo "</pre>"; 
+0

Je pense que le problème est avec toJSON puisqu'il s'agit de la sortie $ _GET que j'obtiens: Array ([{"0": {"name": "Bent_Over_Rows", "id": "27", "order": 0, "set": "", "inc": "", "exemple": "", "jour": 1}}] =>) Au lieu de 0 => éléments. Mais au moins l'erreur de tableau a disparu ... – mike

+0

Une idée de pourquoi $ _POST n'apparaît pas dans print_r? – mike

0

Turn processData true. Je ne crois pas que votre JSON soit transmis correctement. Notez également qu'il ne sera pas considéré comme un json, mais plutôt les paires de valeurs clés de votre JSON seront le contenu de $_POST lorsque vous y arriverez.

De plus, les valeurs de votre bigArray sont-elles facilement convertibles en chaîne? Si vous passez des éléments DOM ou quelque chose, vous allez avoir des problèmes.

+0

Activé processData, et toujours le PHP ne prend pas le $ _POST. Je sais que ça va à travers parce que je le vois dans Firebug ici: Parametersapplication/x-www-form-urlencoded { "0": { "name": "Refuser Abs ... \t seulement $ _GET a traversé .. – mike

+0

Essayez de ne pas convertir du tout bigArray en JSON jQuery.ajax() attend toujours un objet pour le paramètre data: http://api.jquery.com/jQuery.ajax/ – UltimateBrent

+0

L'envoi de bigArray via POST me donne ce tableau ( [0] => [object Object] [1] => [object Object] ) semble donc comme il na pas passer l'objet à travers. – mike