【问题标题】:jquery json function returning nulljquery json函数返回null
【发布时间】:2010-06-14 06:42:28
【问题描述】:

我有一个如下的 jquery 脚本:

$.ajax({
   type: "GET",
   url: "http://www.site.com/v4/ajax/get_song_info.php",
   data: ({id : song_id }),
   dataType: "json",
   success: function(data)
   {
      alert( "Data: " + data );
   }
 });

以及相关的php页面:

<?php

    include_once '../connect.php';

    $song_id = $_GET['id'];

    $query = mysql_query("SELECT * FROM songs WHERE id = '$song_id' LIMIT 1");

    $song = mysql_fetch_row($query);

    $song_info = array( htmlentities($song[3]) , htmlentities($song[4]) );

    header('Content-Type: application/json');
    echo json_encode($song_info); 
?>

当我在浏览器中单独调用 php 时,它会返回如下内容:["Peaches","I Feel Cream (Proxy Remix)"]

但是,当我调用 jQuery 时,我的警报显示 'Data: null'

【问题讨论】:

    标签: php jquery json


    【解决方案1】:

    我注意到您使用的是绝对 URL 而不是相对 URL。如果您的页面也没有从http://www.site.com 提供,那么您将遇到Same Origin Policy。 SOP是浏览器实现的一种安全机制。

    您有几个选项可以解决这个问题。如果您控制服务器并且不需要支持 IE6 或 IE7,则可以实现Cross-Origin Resource Sharing。在大多数现代浏览器中,如果服务器启用了 CORS,您的 ajax 调用将开始工作(浏览器会在后台处理它)。不过,IE6 和 IE7 不支持 CORS,而且 IE8 要求客户端代码做一些特殊的事情。

    另一个选项是JSONP,它利用了这样一个事实:虽然你不能进行跨域 ajax 调用(除非你有 CORS),但页面从远程主机加载脚本是完全可以的.因此,您加载脚本,其中包含数据并回叫您让您知道它在那里。 JSONP 的优势在于它现在适用于所有主流浏览器。并且 jQuery 在其ajax 调用中内置了 JSONP 支持。

    【讨论】:

    • 该 JSON 数据有效:“JSON 文本是一个序列化的对象或数组。” (见tools.ietf.org/rfcmarkup/4627#section-2
    • @Gumbo:谢谢。我对json.org 的阅读最初表明顶层 always 必须是一个对象,而不是一个数组。我刚回去,还不清楚(在 json.org)。但是您对IETF 文档的看法是对的,这非常清楚。感谢您的更正和链接!
    • 那么 json_encode 怎么没有返回有效的 json ......我将代码更改为:echo '{ "song_info":'。 json_encode($song_info).'}';现在得到回应。数据:[object Object] 我猜这很好吗?这些页面在同一个网站上,所以这不是问题,但很高兴知道。如果我现在正确返回了数据 [object Object] ?如何访问每个部分?
    • @ian: json_encode 可能乐于编码部分而不是整体。但是 Gumbo 指出了一份 IETF 文件,该文件表明从顶级数组开始 有效的。不过,如果改变它有效,那就太好了。您以data.song_info 的身份访问您的阵列。
    • 我将 URL 更改为相对 URL ajax/get_song_info.php 并留下了 json_encode();一样,现在它似乎工作了。我收到以下回复:数据:Johnny Cash,God's Gonna Cut You Down (Mondkopf Plus de Sommeil Remix) 或其他任何...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2016-04-09
    • 2017-02-27
    • 2017-07-20
    • 2010-12-04
    相关资源
    最近更新 更多