如何处理FQL返回的大int facebook uid?

时间:2011-12-29 11:43:01

标签: facebook facebook-graph-api facebook-fql

我在处理facebook的大用户标识并将其正确存储到我的数据库中时遇到了问题。

由于fql.query REST api将被弃用,我正在使用GRAPH API来获取FQL的结果。

我希望得到性朋友的名单,relationship_status。

我执行的查询是

$allFriends = $facebook->api("/fql
    ?q=SELECT+uid,+name,+sex,+relationship_status+FROM+user+where+uid+in+
    (SELECT+uid2+FROM+friend+WHERE+uid1+=$fbuid)"
);

我在Graph API资源管理器中尝试了上述内容,结果是这样的,

  {
  "data": [
     {
      "uid": 100003082853071, 
      "name": "Sam jones", 
      "sex": "male", 
      "relationship_status": null
     }  
   ]
  }

请注意,uid以 int 的形式返回,因此每当我打印数组时,它的值都为(1.34234422 + E03)。所以即使是那个数组的json_encode也无济于事。

但是当我直接调用GRAPH API时会像'graph.facebook.com/1585213/friends'那样将数据返回为

{
  "data": [
    {
      "name": "Vijay Kannan", 
      "id": "102937142343"
    }
  ]  
}

请注意,ID以字符串 ..

的形式返回

每当我使用图形API调用进行FQL查询时,它会将整个数据作为“数组”返回,因此长大的facebook uid会转换为浮点数(1.34234422 + E03 )。

我如何将它们转换为适当的uid并存储/处理它们。

我认为FQL和GRAPH API调用的不一致也应该由Facebook来处理。但我不能等待!!

有关于此的任何想法吗?

3 个答案:

答案 0 :(得分:6)

我尝试了大多数方法,并且在Google之后会有更多论坛和Facebook代码列表,如果发现以下内容对我来说就像是一个魅力。

在我从FQL查询中获得结果后,我使用了以下代码行,

$friends = json_decode(preg_replace('/"uid":(\d+)/', '"uid":"$1"', $result),true); 
// consider $result as the result rendered by the FQL query.

当我使用file_get_contents进行FB调用时,您可能已经看到了错误代码的错误,因此最好的方法是在必要时使用CURL进行所有FB API调用。

请找到我用来获得正确结果的完整代码,

$access_token = $facebook->getAccessToken();
$request_url ="https://graph.facebook.com/fql
               ?q=SELECT+uid,+name,+sex+FROM+user+where+uid+in+
               (SELECT+uid2+FROM+friend+WHERE+uid1+=$fbuid)".
               "&access_token=".$access_token;

$opts = array(
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 60,
            CURLOPT_USERAGENT      => 'facebook-php-3.1',
            CURLOPT_CAINFO         => /lib/fb_ca_chain_bundle.crt',
           //replace the above path with proper path of the crt file 
           //in order to avoid the exceptions rendered by FB 
           //when we try to use CURL without proper certification file.
    );

$opts[CURLOPT_URL] = $request_url;

if (isset($opts[CURLOPT_HTTPHEADER])) {
        $existing_headers = $opts[CURLOPT_HTTPHEADER];
        $existing_headers[] = 'Expect:';
        $opts[CURLOPT_HTTPHEADER] = $existing_headers;
} else {
        $opts[CURLOPT_HTTPHEADER] = array('Expect:');
}

$ch = curl_init();
curl_setopt_array($ch, $opts);
$result = curl_exec($ch);

if ($result === false) {
      $e = new FacebookApiException(array(
        'error_code' => curl_errno($ch),
        'error' => array(
        'message' => curl_error($ch),
        'type' => 'CurlException',
        ),
      ));
      curl_close($ch);
      throw $e;
}

curl_close($ch);
$friends = json_decode(preg_replace('/"uid":(\d+)/','"uid":"$1"',$result));

我只想发布这些答案,以便在Facebook解决这种不一致之前帮助其他人。

答案 1 :(得分:1)

Facebook有两个非常一致的事情。它们是:1)随心所欲地改变他们的API而没有任何抬头。 2)图和fql对象之间的不一致。

正如您所指出的,从Facebook返回的未加引号的值总是很长(也就是大的int,又名Int64)。引用的值是长值的字符串表示。

在我看来,$ facebook-> api调用正在将多头变成浮点数。我建议将它记录为$ facebook-> api团队的错误。

在他们修复该错误的过渡期间,您可以编写自己的代码来对图表执行HTTP发布并解析返回的结果。我没有遇到过C#API的问题,也没有使用Javascript API。

答案 2 :(得分:0)

如果您使用的是php(http://php.net/manual/en/function.sprintf.php):

printf("%14.0f", 1.00000145202E+14);

输出:

100000145202000

使用Javascript:

parseFloat('1.00000145202E+14')