Что не так с этим назначением объекта json из php в javascript? - PullRequest
1 голос
/ 25 ноября 2010

Мне нужно передать значение объекта php json в 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);
      } 

В консоли ошибок нет ошибок, но не получено значение. Это выводит как массив (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\"}}]};

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Если вы используете 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 голос
/ 25 ноября 2010

Если функция 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>
...