2010-11-25 44 views
1

Je dois passer la valeur d'un objet php json à javascript. C'est ainsi que je le fais;Quel est le problème avec cette attribution d'objet json de php en javascript?

<script type="text/javascript"> var msg_top = <?php echo searchResults('windows');?>; 
    </script> 

Cette fonction est php SearchResults qui retourne JSON:

function searchResults($q) { 

     $host = "http://search.twitter.com/search.atom?q=" . urlencode($q) . "&rpp=100"; 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $host); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

    //Raw xml 
     $result = curl_exec($ch); 
     curl_close($ch); 
     $xml = simplexml_load_string($result); 
     return json_encode($xml); 
     } 

Il n'y a pas d'erreur dans la console d'erreur, mais il n'y a pas de valeur reçue. Il sort comme array (0) {} pour var_dump ($ _ POST); EDIT J'ai ajouté une alerte de test après la fonction de succès et il imprime l'échec

Ceci est le script

<head> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"> 
    </script> 
    </head> 
    <body> 
    <script type="text/javascript"> var msg_top = <?php echo searchResults('windows');?>; 
    </script> 
    <script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $.ajax({ 
     url: "script.php", 
     type: "POST", 
     dataType: "json", 
     data: "msg_top", 
     success: function(msg){ 
     alert("success"); 
    } 
    }); 
    alert("failure"); 
    }); 
    </script> 
    </body> 
    </html> 

c'est JSON twitter

<script type="text/javascript"> var test_json = {\"id\":\"tag:search.twitter.com,2005:search\\/#DIYSe_F\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/search.twitter.com\\/search?q=%23DIYSe_F\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"application\\/atom+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/search.atom?q=%23DIYSe_F&rpp=100\",\"rel\":\"self\"}},{\"@attributes\":{\"type\":\"application\\/opensearchdescription+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/opensearch.xml\",\"rel\":\"search\"}},{\"@attributes\":{\"type\":\"application\\/atom+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/search.atom?q=%23DIYSe_F&rpp=100&since_id=7750301532557312\",\"rel\":\"refresh\"}}],\"title\":\"#DIYSe_F - Twitter Search\",\"updated\":\"2010-11-24T22:20:44Z\",\"entry\":[{\"id\":\"tag:search.twitter.com,2005:7559269595488256\",\"published\":\"2010-11-24T22:20:44Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/_smir\\/statuses\\/7559269595488256\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/s.twimg.com\\/a\\/1289849896\\/images\\/default_profile_5_normal.png\",\"rel\": 
    \":\"image\"}}],\"title\":\"#DIYse_F HIE_STRUCT: HIERARCHICAL STRUCTURE: hierarchical structure to display \\nmessages of Functions and Qualities types\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> HIE_STRUCT: HIERARCHICAL STRUCTURE: hierarchical structure to display \\nmessages of Functions and Qualities types\",\"updated\":\"2010-11-24T22:20:44Z\",\"author\":{\"name\":\"_smir (Smeer)\",\"uri\":\"http:\\/\\/twitter.com\\/_smir\"}},{\"id\":\"tag:search.twitter.com,2005:7552659368189952\",\"published\":\"2010-11-24T21:54:28Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/_smir\\/statuses\\/7552659368189952\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/s.twimg.com\\/a\\/1289849896\\/images\\/default_profile_5_normal.png\",\"rel\":\"image\"}}],\"title\":\"#DIYse_F SEND_MSG: users can send messages of four types i.e. \\n\\nFunction,Quality,Solution, and delivery\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra 
\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> SEND_MSG: users can send messages of four types i.e. \\n\\nFunction,Quality,Solution, and delivery\",\"updated\":\"2010-11-24T21:54:28Z\",\"author\":{\"name\":\"_smir (Smeer)\",\"uri\":\"http:\\/\\/twitter.com\\/_smir\"}},{\"id\":\"tag:search.twitter.com,2005:7548895705956352\",\"published\":\"2010-11-24T21:39:31Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/Babar_Shahzad\\/statuses\\/7548895705956352\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/a1.twimg.com\\/profile_images\\/1090185625\\/29465_391454998679_533808679_3864564_6071800_n_normal.jpg\",\"rel\":\"image\"}}],\"title\":\"#DIYse_F READ_MSG: Users can read messages of all four types in \\n\\ndifferent windows\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> READ_MSG: Users can read messages of all four types in \\n\\ndifferent windows\",\"updated\":\"2010-11-24T21:39:31Z\",\"author\":{\"name\":\"Babar_Shahzad (Babar Shahzad Ch)\",\"uri\":\"http:\\/\\/twitter.com\\/Babar_Shahzad\"}}]}; 
+0

Cela nécessite un débogage de base. La requête curl fonctionne-t-elle? Que contient '$ xml'? –

+0

@Pekka, oui, j'ai ajouté un petit bloc de test de php avant ajax et vérifié que les résultats de retour curl et également vérifié à partir de http://www.jsonlint.com/ que renvoyé json est valide. Le xml contient des tweets de données comme des messages, un identifiant de message, un nom d'auteur-> etc. – XCeptable

+0

Je voudrais enregistrer le résultat de ce qui est passé à JSON.parse() dans un var. et déboguez la valeur de cette var en utilisant firebug et jsonlink. donc quelque chose comme var testJson = ""; déboguer; var msg_top = JSON.parse (testJson); – Jags

Répondre

4

Si vous utilisez json_encode pour coder les données en tant que JSON, la sortie sera déjà une expression JavaScript valide. Vous n'avez donc pas besoin de le mettre entre guillemets.

En fait, l'application addslashes sur elle transformera l'expression JavaScript valide dans une chaîne contenant cette expression JavaScript:

$json = json_encode(array('foo'=>'bar')); 
var_export($json); // '{"foo":"bar"}' 
$string = addslashes($json); 
var_export($str); // '{\\"foo\\":\\"bar\\"}' 

Lorsque vous utilisez ces valeurs en JavaScript, $json contiendra une expression d'objet valide alors que $str contiendra une expression de chaîne:

var json = <?php echo $json; ?>, 
    str = "<?php echo $str; ?>"; 

Cela deviendra:

var json = {"foo":"bar"}, 
    str = "{\"foo\":\"bar\"}"; 

Il suffit donc d'utiliser json_encode sans appliquer d'encodage/échappement supplémentaire. Dans votre cas (puisque searchResults renvoie déjà une chaîne JSON):

var test_json = <?php echo searchResults('windows'); ?>; 
+0

@XCeptable: s'il vous plaît vérifier encore une fois, vous ne pouvez pas passer un objet simplexml PHP en javascript sans le transformer en format javascript en premier (JSON dans ce cas) – ajreal

+0

@ajreal: 'json_encode' tournerait cet objec t dans une chaîne (méthode toString) en premier. Mais je ne suis pas sûr de ce que cette sortie ressemble. – Gumbo

+0

@ajreal, la fonction php le renvoie comme json comme return json_encode ($ xml); – XCeptable

1

Si la fonction searchResults ne retourne pas déjà JSON, alors json_encode() serait plus facile, par exemple

<script type="text/javascript"> 
    var msg_top = <?php echo json_encode(searchResults('windows'));?>; 
</script> 

Si la fonction searchResults retourne déjà JSON approprié, vous devez simplement être en mesure d'affecter directement la sortie, par exemple

<script type="text/javascript"> 
    var msg_top = <?php echo searchResults('windows');?>; 
</script> 
+0

Voir la deuxième partie de ma réponse. Si vous avez vraiment json déjà, alors vous ne devriez pas avoir besoin de faire beaucoup pour entrer là-dedans.Peut-être pourriez-vous poster un exemple de ce que searchResults() renvoie? –

+0

En fait, cela n'aide pas, car il ne nous montre toujours pas ce que searchResults() produit. Vous devez marcher avant de courir; tester des choses en javascript est une perte de temps si nous ne savons même pas ce que les choses qui passent de PHP à JS est. Montrez-nous la sortie de searchResults(). –

+0

Comment voulez-vous voir la sortie? J'en ai deux sorties en utilisant un loop.i.e. Comme "foreach ($ xml-> entrée as $ status) { $ status-> author-> nom. ''. $ Status-> content; } $ status-> author-> nom donne un nom comme 'El Yobo '$ status-> contenu des résultats texte d'un tweet – XCeptable