与file_get_contents()一起使用SQL时间歇性HTTP 400(错误请求)

时间:2012-05-03 16:57:22

标签: escaping facebook-php-sdk facebook-fql file-get-contents ampersand

我的网页使用PHP执行FQL请求,获取登录用户的朋友数,这是代码:

$graph = 'https://graph.facebook.com/fql?q=';
$graph .= 'SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29';
$graph .= '&access_token=' . $access_token;
$result = file_get_contents($graph);

大约80%的时间都可以正常工作,但有时我会得到400 Bad Request。我注意到这似乎是由于将'q'与'access_token'分开的&符号被转义而引起的;即我得到这个(不起作用):

https://graph.facebook.com/fql?q=SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29&access_token=AAAF8VR3YZCpQBAGiX16jvZAwaEciTwZB1QZAaUjcjy82Ce7Ov7nPqNxjsKM1SAZASGVcZCJ80R9KJZBJYrjKmsDVK6YNrPGA7plPVuwCFZCaOwZDZD

而不是这个(工作 - 相同的请求,但'& amp;'已被'&'替换):

https://graph.facebook.com/fql?q=SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29&access_token=AAAF8VR3YZCpQBAGiX16jvZAwaEciTwZB1QZAaUjcjy82Ce7Ov7nPqNxjsKM1SAZASGVcZCJ80R9KJZBJYrjKmsDVK6YNrPGA7plPVuwCFZCaOwZDZD

我尝试相应地调整我的代码,以便PHP显式地告诉字符串替换转义的&符号,但无济于事:

$graph = 'https://graph.facebook.com/fql?q=';
$graph .= 'SELECT+friend_count+FROM+user+WHERE+uid%3Dme%28%29';
$graph .= '&access_token=' . $access_token;
$result = file_get_contents($graph);
$graphNoEscape = str_replace('&', '&', $graph);
$result = file_get_contents($graphNoEscape);

有人知道问题的解决方案吗?令人讨厌的是,这段代码有时会起作用,但并非总是如此!

1 个答案:

答案 0 :(得分:2)

对于任何发现此问题但遇到同样问题的人来说,这就是我解决问题的方法:

首先,我告诉服务器在public_html / www文件夹中使用一个php.ini,PHP版本为5.3。

然后我按如下方式编辑了我的代码:

$graph = 'https://graph.facebook.com/fql?q='; 
$graph .= urlencode('SELECT friend_count FROM user WHERE uid = me()');
$graph .= '&access_token='.$access_token; 
$graphNoEscape = str_replace('&', '&', $graph); 
$file_contents = file_get_contents($graphNoEscape); 
$fql_result = json_decode($file_contents); 
$friend_count = mysql_real_escape_string($fql_result->data[0]->friend_count);

不可否认,我可能已经使用str_replace()完成了它,但它可以正常工作:)

希望这可以帮助某人。