我正在使用以下网址进行FQL调用,然后进行卷曲调用。
$ url ='https://api.facebook.com/method/fql.query?access_token='.$access_token.'&query='.rawurlencode($query).'&format=JSON' ;
然后我通过json_decode调用传递返回的数据
我有这个问题:
SELECT name,page_id,page_url FROM page WHERE page_id IN(SELECT page_id FROM page_admin WHERE uid = $ uid)
返回指定UID为管理员的名称和页面列表。
在某些PHP安装上(我无法缩小范围),page_id从长整数转换为科学记数法 - 因此174311849258492将返回1.7431184925849E 14当然会破坏事物。
由于我无法在我的服务器上重现这一点,因此我不确定转换发生的位置。四处寻找我发现了这样做的建议:
json_decode(preg_replace('/:(\ d +,)/',':“$ {1}”,',$ response));
会解决它
但为什么有些json_decodes没有明显的理由投入科学记数法呢?
答案 0 :(得分:7)
如果您使用自己的卷曲调用,那么您只需将& format = JSON-STRINGS附加到url的末尾即可将所有项目作为字符串返回。
答案 1 :(得分:3)
Danny指出它的32/64位问题。 FB假设一切都是64位并传回一个整数来代替这个值。
所以你需要做的是获取整数并在将它们从JSON数组中拉出之前将它们转换为字符串。页面ID和组ID作为整数传递(Facebook用户ID作为字符串传递)
执行此操作的代码是:
$response = curl_exec($ch);
$err_no=curl_errno($ch);
curl_close($ch);
$response=preg_replace('/"gid":(\d+)/', '"gid":"$1"', $response );
$response=json_decode( preg_replace('/"page_id":(\d+)/', '"page_id":"$1"', $response ) );
if (isset($response->message)) {
throw new Exception ($response->message);
}
return( $response);