2009-09-04 8 views
7

J'ai un tableau multi-dimensionnel que je veux envoyer à un script PHP avec un Javascript qui analyse les données JSON et les tracer sur Google Maps. Je suis en train de simuler l'utilisation de formulaires:Passer une variable codée JSON de PHP vers Javascript via POST

<?php 
$jsontest = array(
    0 => array(
     'plate_no' => 'abc111', 
     'longlat' => array(121.003895,14.631563), 
     'info' => 'first item' 
     ), 
    1 => array(
     'plate_no' => 'abc222', 
     'longlat' => array(121.103895,14.731563), 
     'info' => 'second item' 
     ) 
    ); 
$jsonarray = json_encode($jsontest); 
?> 
<form action="json-target.php" method="post" accept-charset="utf-8"> 
     <input type="hidden" name="jsonarray" value="<?php echo $jsonarray; ?>" id="jsonarray"> 
    <p><input type="submit" value="Continue &rarr;"></p> 
</form> 

JSON-target.php ressemble à ceci:

<?php 
    print "The value of \$_POST is "; 
    print_r($_POST); 
?> 

Et la sortie de $_POST est Array ([jsonarray] => [{). Je voulais passer le contenu de la variable $jsonarray à une fonction Javascript (voir la mise à jour ci-dessous).

MISE À JOUR: J'ai aussi simple Javascript qui est censé analyser la valeur reçue de $_POST et afficher la valeur par alert():

<script src="/js/json2.js" type="text/javascript" charset="utf-8"></script> 
<script type="text/javascript" charset="utf-8"> 
    var json = JSON.parse(<?php echo $_POST['jsonarray'] ?>); 
    for (var i = 0; i < json.length; i++) { 
     alert(json[i]); 
    } 
</script> 

Mais la sortie est mutilée avec des barres obliques inverses.

var json = JSON.parse([{\"plate_no\":\"abc111\",\"longlat\":[121.003895,14.631563],\"info\":\"first item\"},{\"plate_no\":\"abc222\",\"longlat\":[121.103895,14.731563],\"info\":\"second item\"}]); 

Quelle est la meilleure façon de procéder?

+0

Quelle est exactement la question? – rojoca

Répondre

12

Le codage JSON utilise largement les guillemets. En générant simplement une chaîne codée JSON dans votre attribut HTML value, les guillemets interféreront avec le balisage. Ils doivent être échappés pour être mis dans le HTML. Essayez ceci:

<input type="hidden" name="jsonarray" value="<?php echo htmlspecialchars($jsonarray,ENT_QUOTES); ?>" id="jsonarray"> 

Edit: En réponse à votre mise à jour, je ne sais pas ce que votre JSON.parse est censé faire. Tout ce qui est codé avec json_encode() en PHP est techniquement un objet Javascript valide, et n'a pas besoin d'être analysé davantage. Si j'avais un objet nommé $obj avec une propriété de nom de « bonjour », je pouvais le faire:

<script type="text/javascript"> 
var o = <?php echo json_encode($obj); ?>; 
alert(o.name); 
</script> 

et obtenir une alerte en disant « bonjour ». La sortie de json_encode est un objet javascript parfaitement adapté.

Le fait que la sortie de votre tableau $_POST a été échappée avec des barres obliques amène à penser que votre directive magic_quotes_gpc est peut-être activée. Si c'est le cas, vous devrez désappliquer vos variables $ _POST avec stripslashes().

+0

Merci! J'ai été capable d'obtenir la sortie dans json-target.php mais maintenant l'objet JSON est altéré. Est-ce que je fais la bonne approche? – Francis

3

Ça m'a pris un moment pour trouver la réponse. Essayez:

var json = JSON.parse(<?php echo stripslashes($_POST['jsonarray']) ?>); 
0

var json = JSON.parse ($ ('# jsonarray') .val()); alerte (json.plate_no [0]);

+0

Bienvenue dans StackOverflow! S'il vous plaît envisager d'ajouter quelques explications à votre réponse. Je vous remercie! – Aurasphere