Php 为什么我的$.getJSON响应数据为空?

Php 为什么我的$.getJSON响应数据为空?,php,jquery,ajax,Php,Jquery,Ajax,我有一个非常简单的设置,我似乎无法工作。我有一个简单的PHP页面,它刚刚启动一个会话,应该以JSON格式输出状态和会话id。但是,当ajax调用返回时,数据总是空的。我使用的是Firebug,我可以看到ajax函数调用我的回调函数 以下是服务器上的PHP页面: <?php try { if(!session_start()) { throw new Exception("unable to start session");

我有一个非常简单的设置,我似乎无法工作。我有一个简单的PHP页面,它刚刚启动一个会话,应该以JSON格式输出状态和会话id。但是,当ajax调用返回时,数据总是空的。我使用的是Firebug,我可以看到ajax函数调用我的回调函数

以下是服务器上的PHP页面:

<?php
    try
    {
        if(!session_start()) {
            throw new Exception("unable to start session");
        }

        echo json_encode(array(
                "status" => "success",
                "session_id" => session_id()
            ));
    }
    catch(Exception $e)
    {
        echo json_encode(array(
            "status" => "fail",
            "error" => $e->getMessage()
        ));
    }
?>
响应标题:

HTTP/1.1 200 OK
Date: Mon, 01 Feb 2010 16:50:11 GMT
Server: Apache/2.2.14 (Win32) PHP/5.2.12
X-Powered-By: PHP/5.2.12
Set-Cookie: PHPSESSID=i033rd4618o18h3p5kenspcc35; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 101
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

因此,您可以看到正在设置PHP会话ID,但响应选项卡为空

冒着被鞭打的风险,您的文档标题中似乎没有包含jQuery.js:

<script type="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

我从您的示例中复制了HTML和Javascript,仅将init.php的调用更改为简单的“init.php”(完全假设相同的服务器和目录),示例运行得非常好。发布的代码本身没有什么问题,这意味着您需要再次检查Firebug net选项卡,以查看发出了什么请求以及响应是什么。还可以将输入类型从“隐藏”更改为“文本”,直到您确定一切正常为止。如果使用“查看源代码”查找结果值,则不会看到它,因为加载页面时该值不存在。如果您安装了Firefox,您可以“查看生成的源代码”,这将在您的隐藏变量中显示AJAX结果。

我想我已经找到了问题所在(请跳到粗体文本以获取简短答案)

我在我的机器上尝试了这个例子,在我的桌面上创建了一个.html文件,并将PHP代码片段上传到局域网上的dev服务器上。这让我得到了与您完全相同的结果,Firefox(v3.5.7)也是如此

我不是一个PHP爱好者(更多的是Python/Django),但我知道一些基本的PHP,我觉得你的代码很好。我通过大量搜索PHP/JSON/Ajax示例证实了这一点。我尝试了advice论坛中给出的每个选项,包括PHP中的各种缓存头选项和不同的JQuery方法,包括更改一些缓存选项,还尝试了各种不同的选项。没有区别

我完全简化了PHP,只返回一个单一的JSON数组,没有任何其他条件或控制结构——没有乐趣

最终我绝望了,在IE 8中尝试了相同的文件。成功了!在Safari中试过了-成功了

然后我变得多疑,认为Firefox中可能存在一些棘手的会话问题或其他一些奇怪的问题,所以我彻底清除了Firefox历史记录并重新启动了浏览器。没有区别

这至少给了我一个不同的角度,我可以用谷歌搜索,看看其他人是否也有同样的问题。确实是这样

事实证明,如果您在本地计算机上运行包含Ajax的HTML文件,即带有“file://”前缀,Firefox出于某种原因将无法正确调用Ajax。我将该文件复制到我的开发服务器上,与PHP文件位于同一位置(但仍然使用完整地址作为Ajax URL)果然奏效了

我不完全理解Firefox对真正的本地文件和Ajax的不同之处,但它在外部变得越来越清晰,我现在无法调查。我确实查看了有关安全性的设置,但没有任何明显的东西跳出来。我很想知道这与您的开发环境是如何设置的。如果有机会,我会进一步调查,并更新此答案


如果“about:config”中有可能包含答案的选项或其他选项,我不会感到惊讶。

我猜您遇到了跨域问题。Firebug是否显示任何错误?Firebug没有显示任何错误,并且发出请求的服务器和系统位于同一个域上。您是否可以看到服务器在Firebug中发回的响应?您是否检查了Firebug网络面板以查看是否发出了请求?如果是这样,您可以检查响应。您还可以在jQuery端的AJAX调用中添加一个error:method定义来检查失败模式。@Tony Miller,请求成功,因为调用了success方法。然而,在我的示例中,“json”是空的。我得到的唯一错误是“json为null”,因为在条件中调用了json.status。我在Firebug中启用了Net选项卡。我看到了请求,但响应是空的。但是,如果我在firebug打开的情况下浏览init.php,就会得到响应。
HTTP/1.1 200 OK
Date: Mon, 01 Feb 2010 16:50:11 GMT
Server: Apache/2.2.14 (Win32) PHP/5.2.12
X-Powered-By: PHP/5.2.12
Set-Cookie: PHPSESSID=i033rd4618o18h3p5kenspcc35; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 101
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
<script type="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
header('Content-type: application/json');