2009-09-04 8 views
7

Mam wielowymiarową tablicę, którą chcę wysłać do skryptu PHP z Javascriptem, który analizuje dane JSON i narysuje je w Google Maps. Próbuję symulować go przy użyciu formy:Przekazywanie zmiennej kodowanej JSON z PHP do Javascript za pośrednictwem 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 wygląda następująco:

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

a wyjście $_POST jest Array ([jsonarray] => [{). Chciałem przekazać zawartość zmiennej $jsonarray do funkcji JavaScript (patrz aktualizacja poniżej).

UPDATE: Mam też prosty Javascript, który powinien analizować wartość otrzymaną od $_POST i dodawać wartość poprzez 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> 

ale wyjście jest zniekształcone ze znakami backslash.

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\"}]); 

Co to jest lepszy sposób na zrobienie tego?

+0

Czym dokładnie jest pytanie? – rojoca

Odpowiedz

12

Kodowanie JSON szeroko wykorzystuje cytaty. Po prostu wyprowadzenie łańcucha zakodowanego w JSON do atrybutu HTML value, cytaty będą kolidować ze znacznikiem. Aby przejść do kodu HTML, muszą zostać zmienione. Spróbuj tego:

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

Edycja: W odpowiedzi na aktualizację, nie jestem pewien, co powinien zrobić twój JSON.parse. Wszystko, co jest zakodowane za pomocą json_encode() w PHP, jest technicznie poprawnym obiektem JavaScript i nie trzeba go dalej analizować. Gdybym miał przedmiot o nazwie $obj z właściwości name „cześć”, mogę to zrobić:

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

i otrzymywać alert mówiąc „cześć”. Wyjście json_encode jest doskonale odpowiednim obiektem javascript.

Fakt, że dane wyjściowe macierzy $_POST zostały usunięte za pomocą ukośników, prowadzi do wniosku, że być może Twoja dyrektywa magic_quotes_gpc jest włączona. Jeśli tak jest, będziesz musiał odblokować zmienne $ _POST za pomocą stripslashes().

+0

Dzięki! Byłem w stanie uzyskać dane wyjściowe w json-target.php, ale teraz obiekt JSON jest zmanipulowany. Czy robię właściwe podejście? – Francis

3

Zajęło mi trochę czasu, aby znaleźć odpowiedź. Wypróbuj:

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

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

+0

Witamy w StackOverflow! Proszę rozważyć dodanie wyjaśnienia do swojej odpowiedzi. Dziękuję Ci! – Aurasphere

Powiązane problemy