json_encode和jQuery .ajax()打得不好** output_buffering **

时间:2014-04-03 11:41:59

标签: php jquery ajax json output-buffering

我有一个表单设置,它将从用户那里获得一些输入,并通过jQuery的.ajax()函数将其发布到URL。 URL位于一个单独的子域中,但我已经设置了CORS,并且一切正常。

服务器端验证表单会发生什么情况,如果检测到错误(表单中的错误填写不正确),我会传回以下JSON:

{"success": "false", "error": "Whatever the error is"}

这对我有用,所以我知道一般设置是正确的。

当表单有效时,我执行数据库查询以检索一堆文件的详细信息,将其作为数组接收,并将所有这些作为JSON和成功消息传回。此方案的JSON遵循:

{"success": "true", "files": [{"id":"4","file_name":"data_zones_scotland_2001.csv","nice_name":"Data Zone - Scotland","description":"","type":"1","coverage":"Scotland","distribution":"public","pack_type":"LSOAs, MSOAs, Data Zones, Intermediate Zones","link":"https:\/\/s3-eu-west-1.amazonaws.com\/data_zones_scotland_2001.csv?Expires=1396528176&Signature=V8ojfXhoH5eggIjwix265KGbr0M%3D"},{"id":"8","file_name":"intermediate_zones_scotland_2001.csv","nice_name":"Intermediate Zone - Scotland","description":"","type":"1","coverage":"Scotland","distribution":"public","pack_type":"LSOAs, MSOAs, Data Zones, Intermediate Zones","link":"https:\/\/s3-eu-west-1.amazonaws.com\/intermediate_zones_scotland_2001.csv?Expires=1396528176&Signature=ieaZYnZCz%2BpnJmWLeq5ygpJ9zNM%3D"}]}

长串的道歉,但我想在那里得到它,以防我错过了什么。

我遇到的问题是,当我将其传回时,我收到No 'Access-Control-Allow-Origin' header is present on the requested resource错误。我知道情况并非如此,我已经测试了使用curl -i http://url...设置的标头。取出文件数组并返回{"success": "true"}工作正常,这表明文件数组中的JSON格式错误,但是通过JSONLint传递该字符串告诉我JSON是有效的。

由于我所做的一切似乎都是正确的,我对于下一步转向下一步的想法已经不多了。处理POST的jQuery代码如下:

$.ajax({
    url: "http://domain.com/api/download-request",
    type: "POST",
    data: postData,
    dataType: 'json'
})
.done( function(data){
    console.log(data);
}); 

我很欣赏任何有关下一步转向的线索。

*更新* 为了解决这个问题,我开始过滤从数据库收到的数据,认为字符串中有一些东西打破了输出。我得到了一个点,我似乎已经通过限制返回的记录数量将其缩小到特定记录,直到它破裂。检索只是此记录后,它再次有效。我坚持了下来,然后注意到当JSON字符串达到一定长度(大约600个字符)时会产生错误。

我已经进入php.ini尝试在那里找到一个限制,一旦我将output_buffering的大小从4096增加到8192(加倍),整个事情开始起作用。我应该提一下,DB的输出没有URL,大大缩短了字符串的长度,所以一旦我在应用程序中添加这些后再次破坏,直到我将缓冲区增加到16384(再次加倍)。

现在应用程序正常运行,但这显然不是最好的做事方式。有没有一种方法可以动态设置output_buffering或改变echo的工作方式,以便PHP不会用完缓冲区?

2 个答案:

答案 0 :(得分:0)

使用JsonP代替json。

$.ajax({
 url:"testserver.php",
 dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
 success:function(json){
     // do stuff with json (in this case an array)
     alert("Success");
 },
 error:function(){
     alert("Error");
 }      
});

同时,您可能需要使用回调函数包装数据,只是为了表示jsonp数据。 请查看此链接以获取有关如何执行此操作的详细信息:allow cross domain ajax requests

REF:

快乐编码:)

答案 1 :(得分:0)

问题是输出缓冲区变满了。增加缓冲区的大小或关闭缓冲区可以解决这个问题。