2010-11-25 1 views
1

Мне нужно передать значение объекта php json в javascript. Вот как я это делаю;Что случилось с этим назначением json-объекта с php на javascript?

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

Это функция PHP SearchResults, который возвращает 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); 
     } 

Там нет ошибки в консоли ошибок, но нет никакой ценности получено. Он выводится как array (0) {} для var_dump ($ _ POST); EDIT я добавил тест-уведомление после функции успеха и печатает отказ

Это сценарий

<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> 

это JSON от твиттере

<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

Это требует базовой отладки. Выполняет ли запрос на завиток? Что содержит `$ xml`? – 2010-11-25 11:22:31

+0

@Pekka, да, я добавил небольшой тестовый блок php перед ajax и проверил его, что результаты завивки возвращаются, а также проверены с http://www.jsonlint.com/, которые вернули json. Xml содержит данные твитов, такие как сообщения, идентификатор сообщения, author-> name и т. Д. – XCeptable 2010-11-25 11:36:35

+0

Я бы сохранил результат того, что передается JSON.parse() в var. и отлаживать значение var, используя firebug и jsonlink. так что что-то вроде var testJson = ""; отлаживать; var msg_top = JSON.parse (testJson); – Jags 2010-11-25 11:41:45

ответ

4

Если вы используете json_encode для кодирования данных в виде JSON, выход уже будет допустимым выражением JavaScript. Поэтому вам не нужно вводить его в кавычки.

В самом деле, применяя addslashes на нем получится действительное выражение JavaScript в строку, содержащую это выражение JavaScript:

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

При использовании этих значений в JavaScript, $json будет содержать допустимое выражение объекта в то время как $str будет содержать строковое выражение:

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

Это станет:

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

Так что просто используйте json_encode без применения каких-либо дополнительных кодировок/экранирования. В вашем случае (как searchResults уже возвращает строку JSON):

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

Если функция SearchResults не возвращает JSON, тогда json_encode() будет проще, например

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

Если функция SearchResults уже возвращает правильную JSON, вы просто должны быть в состоянии назначить выход непосредственно, например,

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