2011-12-29 3 views
1

facebookの大きなユーザーIDを処理し、データベースに正しく保存するのに問題がありました。FQLから返されたbig int facebook uidの処理方法は?

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)" 
); 

で、UIDがint型として返されます。注

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

、私はグラフAPIエクスプローラで上記を試してみましたが、結果はこのようなものですだから私は配列自体を印刷するたびに(1.34234422 + E03)のような値を持っています。その配列のjson_encodeでさえ助けになりません。

しかし、私は私が使用しているときは常にidが文字列として返され

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

注意としてデータを返す「graph.facebook.com/1585213/friends」のような直接的なもの..

GRAPHのAPIを呼び出すときFQLクエリのグラフAPIコールでは、データ全体を 'Array'として返すので、長い長いfacebookのuidは(1.34234422 + E03)のような浮動小数点数に変換されます。

どのように私はそれらを適切なuidのものに変換し、それらをストア/処理することができます。

私はFQLとGRAPH APIコールの不一致もFacebookによって気にするべきだと思っています。しかし、私はそれを待つことができませんでした!

これに関するご意見はありますか?

答えて

7

私はほとんどの方法を試して、Googleの後にいくつかのフォーラムやFacebookのコードリストが見つかった場合は、私の魅力のように働いた。

私は次のコード行を使用FQLクエリから結果を取得した後、

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

私はFBのためのfile_get_contentsを使用しますが、エラーコードとエラーを見ている可能性が呼び出すので、最高その方法は、必要に応じてすべてのFB API呼び出しにCURLを使用しています。 Facebookはこの矛盾を解決するまで、それは他の人を助けるかもしれないので、私はこの答えを投稿する

$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)); 

私は適切な結果を得るために使用されてきた完全なコードを見つけてください。

0

youreのPHP(http://php.net/manual/en/function.sprintf.php)使用している場合:

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

出力:

100000145202000 

のJavascript:

parseFloat('1.00000145202E+14') 
+0

私は一度に多くの友人を得ています(通常100、さらには5000かもしれません)..返されたすべてのuidに対して、私は指数をチェックしてから仕事をしたり変換したりすることはできません。 – Vijay

+0

なぜあなたはできませんチェック?解析する必要があるかどうかを知る必要があります。 – Johan

+0

次に、指数部を見つけて各要素にsprinfを適用するコードを書く必要があります。このラウンドよりも簡単な解決策がいくつかあるはずです... – Vijay

1

Facebookには非常に一貫したものが2つあります。彼らは次のとおりです:1)彼らの気まずいところで彼らのAPIを変更する必要はありません。 2)グラフとfqlオブジェクトの不一致。

あなたが指定したとおり、Facebookから返された引用符で囲まれていない値は、常にlong(別名big int、別名Int64)です。そして、引用された値はlong値の文字列表現です。

$ facebook-> api呼び出しがロングを浮動小数点に変換しているようです。私は$ facebook-> apiチームのバグとしてログインすることをお勧めします。

途中で、バグを修正している間に、独自のコードをコーディングして、グラフへのHTTP投稿を行い、返された結果を解析することができます。私はC#APIやJavascript APIでこの問題に遭遇することはありません。

関連する問題