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
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? –
Json_decode sur Vista avec PHP 5.2.5 (cli) sans Suhosin donne le résultat correct. – Gordon
'$ 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. –