2010-04-09 4 views
3

Prenez la chaîne JSON suivante (générée par un code ExtJS - mais qui est hors de propos):comportement étrange de json_decode()

[{"action":"Setting","method":"toggle","data":["welcome-home"],"type":"rpc","tid":2},{"action":"ContentExtFeFillout","method":"todo","data":[true,0,8,false],"type":"rpc","tid":3}] 

envoyé à un serveur comme une demande POST et récupérées via $GLOBALS['HTTP_RAW_POST_DATA'].

Courir

json_decode($GLOBALS['HTTP_RAW_POST_DATA']); 

sur notre machine de développement (5.2.10-2ubuntu6.4 avec Suhosin Patch 0.9.7) donne une sortie print_r() correcte de:

Array 
(
    [0] => stdClass Object 
     (
      [action] => Setting 
      [method] => toggle 
      [data] => Array 
       (
        [0] => welcome-home 
       ) 

      [type] => rpc 
      [tid] => 2 
     ) 

    [1] => stdClass Object 
     (
      [action] => ContentExtFeFillout 
      [method] => todo 
      [data] => Array 
       (
        [0] => 1 
        [1] => 0 
        [2] => 8 
        [3] => 
       ) 

      [type] => rpc 
      [tid] => 3 
     ) 
) 

Exécution du même code sur la machine de production d'un client (5.2.5 avec Suhosin Patch 0.9.6.2 et Zend Optimizer, SUSE Linux par ailleurs) donne la sortie print_r() suivante:

Array 
(
    [0] => stdClass Object 
     (
      [action] => Setting 
      [method] => toggle 
      [data] => Array 
       (
        [0] => welcome-home 
       ) 

      [type] => rpc 
     ) 

    [1] => 2 
    [2] => stdClass Object 
     (
      [action] => ContentExtFeFillout 
      [method] => todo 
      [data] => Array 
       (
        [0] => 1 
        [1] => 0 
        [2] => 8 
        [3] => 
       ) 

      [type] => rpc 
     ) 

    [3] => 3 
) 

Notez le manque tid propriété qui a évidemment été déplacé dans le tableau principal en tant que valeur propre - ce casse naturellement tout le code ci-dessous.

Nous avons également téléchargé une version de Windows PHP 5.2.5 pour vérifier s'il y a un bug dans json_decode() mais nous obtenons la bonne sortie ici.

Y at-il des problèmes connus avec json_decode() à tout ce qui pourrait causer ce comportement étrange?

Nous sommes actuellement totalement désemparés ...

Merci à vous tous!

Meilleures salutations

Stefan

+0

Est-ce qu'il ya une différence dans var_dump() 'ING $ GLOBALS [' HTTP_RAW_POST_DATA '] sur les différentes machines? Ou vous avez seulement la différence après json_decode() 'ING? –

+0

Json_decode sur Vista avec PHP 5.2.5 (cli) sans Suhosin donne le résultat correct. – Gordon

+0

'$ GLOBALS ['HTTP_RAW_POST_DATA']' est exactement le même sur les deux machines. Nous avons enregistré le 'HTTP_RAW_POST_DATA' et utilisé exactement la même chaîne sur nos machines à' json_decode() 'et il a retourné le bon résultat. Malheureusement, nous n'avons pas d'accès direct à la machine du client, nous devons donc nous connecter uniquement. –

Répondre

1

OK les gars - problème résolu. N'ayant plus d'options, nous avons persuadé le client de mettre à jour la version PHP installée et devinez quoi: ça marche.

Il semble y avoir eu un bug subtil dans leur installation de PHP (PHP, Zend Optimizer et/ou Suhosin) qui a été corrigé avec la mise à jour. Toujours, une chose assez étrange.

Merci à vous tous!

Meilleures salutations

Stefan

0

Avez-vous essayé échanger les clés de tid et le type? Et comment utiliser une variable codée en dur pour vérifier si le problème pourrait être avec $ GLOBALS ['HTTP_RAW_POST_DATA']?

les opérations suivantes:

$t1='[{"action":"Setting","method":"toggle","data":["welcome-home"],"type":"rpc","tid":2},{"action":"ContentExtFeFillout","method":"todo","data":[true,0,8,false],"tid":2,"type":"rpc"}]'; 
print_r(json_decode($t1)); 
+0

C'est assez difficile car nous n'avons pas d'accès direct à la machine (c'est une machine interne à l'entreprise) - donc nous ne pouvons utiliser que la journalisation et ils vont envoyer nous les fichiers journaux par courrier. Je pourrais être tenté d'exclure un problème avec '$ GLOBALS ['HTTP_RAW_POST_DATA']' parce que ce que nous faisons actuellement est: 'log ($ GLOBALS ['HTTP_RAW_POST_DATA'])', '$ data = json_decode ($ GLOBALS ['HTTP_RAW_POST_DATA ']) 'et' log (print_r ($ data, true)) '. La chaîne JSON ci-dessus est la chaîne exacte qui a été enregistrée - ainsi que la sortie de 'print_r ($ data, true)'. –