jQuery $ .get数据不会出现在PHP $ _GET中

时间:2013-01-05 17:19:12

标签: php jquery facebook-javascript-sdk

我使用jQuery $.get将一些数据发送到我的PHP服务器,如下例所示:

使用Javascript:

var usr_data = JSON.stringify(window.fb_user);
var save_data = {
    cmd         : 'new_suggestion',
    suggestion  : $('#suggestion').val(),
    sender      : usr_data
};

$.get('/class/suggestion.php',
save_data,
function( data ) {
    if (data.result){
        alert('Thanks for your suggestion.');
    } else {
        alert('Error');
    }           
});

PHP:

var_dump($_GET);

usr_data变量是一个对象,包含用户使用Facebook帐户登录时获得的Facebook用户数据。

问题在于,有时,根据可用的用户数据,sender变量会消失,如下所示:

array(2) {
  ["cmd"]=>
  string(14) "new_suggestion"
  ["suggestion"]=>
  string(15) "Some suggestion"
}

我无法在此发布真实的发件人数据,因为它是Facebook的用户数据,我无法找到用假数据或我的脸谱数据重现错误的方法。

修改

有人知道为什么sender没有出现在$ _GET数组中吗?

编辑II

我刚发现一个带有伪造数据的网址,可以重现错误。

我创建了一个名为test_get.php的PHP文件,其中只有下面一行。

<?php var_dump($_GET); ?>

并使用以下网址:

http://mysite/test_get.php?cmd=new_suggestion&suggestion=some%20suggestion&sender=%7B%22id%22%3A%221234567890123%22%2C%22name%22%3A%22Foo%20Bar%20Baz%22%2C%22first_name%22%3A%22Foo%22%2C%22middle_name%22%3A%22Bar%22%2C%22last_name%22%3A%22Baz%22%2C%22link%22%3A%22https%3A%2F%2Fwww.facebook.com%2Ffoobarbaztest%22%2C%22username%22%3A%22foobarbaz%22%2C%22birthday%22%3A%2201%2F01%2F1900%22%2C%22hometown%22%3A%7B%22id%22%3A%221234567890%22%2C%22name%22%3A%22Test%20City%22%7D%2C%22inspirational_people%22%3A%5B%7B%22id%22%3A%22111713915507379%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%2C%7B%22id%22%3A%22106184866078691%22%2C%22name%22%3A%22Romário%22%7D%2C%7B%22id%22%3A%22109601749058079%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%5D%2C%22gender%22%3A%22male%22%2C%22religion%22%3A%22Cristão%20-%20Católico%22%2C%22political%22%3A%22Foo%20Party%22%2C%22email%22%3A%22foobarbaz%40foobar.foo%22%2C%22timezone%22%3A-5%2C%22locale%22%3A%22pt_BR%22%2C%22languages%22%3A%5B%7B%22id%22%3A%22108083115891989%22%2C%22name%22%3A%22Português%22%7D%2C%7B%22id%22%3A%22108177092548456%22%2C%22name%22%3A%22Español%22%7D%2C%7B%22id%22%3A%22106059522759137%22%2C%22name%22%3A%22English%22%7D%2C%7B%22id%22%3A%22108224912538348%22%2C%22name%22%3A%22French%22%7D%2C%7B%22id%22%3A%22108106272550772%22%2C%22name%22%3A%22French%22%7D%2C%7B%22id%22%3A%22450169151702580%22%2C%22name%22%3A%22Portuguese%22%7D%5D%2C%22verified%22%3Atrue%2C%22updated_time%22%3A%222011-11-02T18%3A43%3A36%2B0000%22%7D

结果是一样的:

array(2) {
  ["cmd"]=>
  string(14) "new_suggestion"
  ["suggestion"]=>
  string(15) "some suggestion"
}

编辑III

根据评论的建议,网址上有重音字符。我编码了这些字符并再次尝试没有运气。这是正确编码的网址:

http://mysite/test_get.php?cmd=new_suggestion&suggestion=some%20suggestion&sender=%7B%22id%22%3A%221234567890123%22%2C%22name%22%3A%22Foo%20Bar%20Baz%22%2C%22first_name%22%3A%22Foo%22%2C%22middle_name%22%3A%22Bar%22%2C%22last_name%22%3A%22Baz%22%2C%22link%22%3A%22https%3A%2F%2Fwww.facebook.com%2Ffoobarbaztest%22%2C%22username%22%3A%22foobarbaz%22%2C%22birthday%22%3A%2201%2F01%2F1900%22%2C%22hometown%22%3A%7B%22id%22%3A%221234567890%22%2C%22name%22%3A%22Test%20City%22%7D%2C%22inspirational_people%22%3A%5B%7B%22id%22%3A%22111713915507379%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%2C%7B%22id%22%3A%22106184866078691%22%2C%22name%22%3A%22Rom%C3%A1rio%22%7D%2C%7B%22id%22%3A%22109601749058079%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%5D%2C%22gender%22%3A%22male%22%2C%22religion%22%3A%22Crist%C3%A3o%20-%20Cat%C3%B3lico%22%2C%22political%22%3A%22Foo%20Party%22%2C%22email%22%3A%22foobarbaz%40foobar.foo%22%2C%22timezone%22%3A-5%2C%22locale%22%3A%22pt_BR%22%2C%22languages%22%3A%5B%7B%22id%22%3A%22108083115891989%22%2C%22name%22%3A%22Portugu%C3%AAs%22%7D%2C%7B%22id%22%3A%22108177092548456%22%2C%22name%22%3A%22Espa%C3%B1ol%22%7D%2C%7B%22id%22%3A%22106059522759137%22%2C%22name%22%3A%22English%22%7D%2C%7B%22id%22%3A%22108224912538348%22%2C%22name%22%3A%22French%22%7D%2C%7B%22id%22%3A%22108106272550772%22%2C%22name%22%3A%22French%22%7D%2C%7B%22id%22%3A%22450169151702580%22%2C%22name%22%3A%22Portuguese%22%7D%5D%2C%22verified%22%3Atrue%2C%22updated_time%22%3A%222011-11-02T18%3A43%3A36%2B0000%22%7D

有了这个评论,我注意到jQuery(或我的浏览器)不编码由JSON.stringify(window.fb_user);

返回的重音字符编码

编辑IV

以下网址有效,但如果我添加电子邮件的最后部分&#34; @ foobar.foo&#34;它失败。也试过没有电子邮件,但有其他数据,但它也失败了。

cmd=new_suggestion&suggestion=some%20suggestion&sender=%7B%22id%22%3A%221234567890123%22%2C%22name%22%3A%22Foo%20Bar%20Baz%22%2C%22first_name%22%3A%22Foo%22%2C%22middle_name%22%3A%22Bar%22%2C%22last_name%22%3A%22Baz%22%2C%22link%22%3A%22https%3A%2F%2Fwww.facebook.com%2Ffoobarbaztest%22%2C%22username%22%3A%22foobarbaz%22%2C%22birthday%22%3A%2201%2F01%2F1900%22%2C%22hometown%22%3A%7B%22id%22%3A%221234567890%22%2C%22name%22%3A%22Test%20City%22%7D%2C%22inspirational_people%22%3A%5B%7B%22id%22%3A%22111713915507379%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%2C%7B%22id%22%3A%22106184866078691%22%2C%22name%22%3A%22Romário%22%7D%2C%7B%22id%22%3A%22109601749058079%22%2C%22name%22%3A%22Pope%20Benedict%20XVI%22%7D%5D%2C%22gender%22%3A%22male%22%2C%22religion%22%3A%22Cristão%20-%20Católico%22%2C%22political%22%3A%22Foo%20Party%22%2C%22email%22%3A%22foobarbaz

array(3) {
  ["cmd"]=>
  string(14) "new_suggestion"
  ["suggestion"]=>
  string(15) "some suggestion"
  ["sender"]=>
  string(509) "{"id":"1234567890123","name":"Foo Bar Baz","first_name":"Foo","middle_name":"Bar","last_name":"Baz","link":"https://www.facebook.com/foobarbaztest","username":"foobarbaz","birthday":"01/01/1900","hometown":{"id":"1234567890","name":"Test City"},"inspirational_people":[{"id":"111713915507379","name":"Pope Benedict XVI"},{"id":"106184866078691","name":"Romário"},{"id":"109601749058079","name":"Pope Benedict XVI"}],"gender":"male","religion":"Cristão - Católico","political":"Foo Party","email":"foobarbaz"
}

1 个答案:

答案 0 :(得分:2)

我在我的服务器上测试了你的网址并且运行正常:

array
  'cmd' => string 'new_suggestion' (length=14)
  'suggestion' => string 'some suggestion' (length=15)
  'sender' => string '{"id":"1234567890123","name":"Foo Bar Baz","first_name":"Foo","middle_name":"Bar","last_name":"Baz","link":"https://www.facebook.com/foobarbaztest","username":"foobarbaz","birthday":"01/01/1900","hometown":{"id":"1234567890","name":"Test City"},"inspirational_people":[{"id":"111713915507379","name":"Pope Benedict XVI"},{"id":"106184866078691","name":"Romário"},{"id":"109601749058079","name":"Pope Benedict XVI"}],"gender":"male","religion":"Cristão - Católico","political":"Foo Party","email":"foobarbaz@fo'... (length=882)

您的服务器是否配置为支持utf-8?做一个phpinfo(),看看你得到了什么。我得到以下内容:

HTTP_ACCEPT_CHARSET     ISO-8859-1,utf-8;q=0.7,*;q=0.3

我注意到这个网址包含一些奇怪的字符,(Romario,Christaeo等),也许这是一个没有utf-8的问题?

如果您需要更改http_accept_charset,这可能有所帮助:http://rackerhacker.com/2007/11/15/change-the-default-apache-character-set/

===编辑===

事实证明,服务器为$ _GET命中了512字节的限制。现在这从Web服务器到Web服务器各不相同,这就是我们在服务器上试用它时工作正常的原因。

没有升级服务器,唯一的方法是使用jquery .post()而不是.get()