Как работать с большим внутренним идентификатором Facebook, возвращенным FQL? - PullRequest
1 голос
/ 29 декабря 2011

У меня проблема с обработкой больших идентификаторов пользователей Facebook и их правильным хранением в моей базе данных.

Поскольку API-интерфейс REST fql.query устарел, я использую API GRAPH для получения результатов FQL.

Я хочу получить список моих друзей с сексом, relations_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 Explorer, и результат примерно такой,

  {
  "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"
    }
  ]  
}

Обратите внимание, что идентификатор возвращается как строка ..

Всякий раз, когда я использую вызов API графа для запроса FQL, он возвращает все данные в виде ' Array ', поэтому длинные большие пользовательские идентификаторы Facebook преобразуются в тип float (1.34234422 + E03) ,

Как я могу преобразовать их в надлежащие uid и сохранить / обработать их обратно.

Я думаю, что о несогласованности вызовов API FQL и GRAPH следует также позаботиться о Facebook ... Но я не мог дождаться этого !!

Есть идеи по этому поводу?

Ответы [ 3 ]

6 голосов
/ 01 марта 2012

Я попробовал большинство методов, и после того, как 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 для всех вызовов API FB, когда это необходимо.

Пожалуйста, найдите полный код, который я использовал для получения правильных результатов,

$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 голос
/ 29 декабря 2011

Есть две вещи, которые очень последовательны в Facebook. Они: 1) меняют свои API по своей прихоти без какого-либо хедзопа. 2) Несоответствие между графом и объектами fql.

Как вы указали, возвращаемые из Facebook значения без кавычек всегда являются long (aka big int, aka Int64). И указанные в кавычках значения являются строковыми представлениями длинного значения.

Что мне кажется, так это то, что вызов $ facebook-> api превращает длинные в поплавки. Я бы посоветовал зарегистрировать его как ошибку в команде $ facebook-> api.

Тем временем, пока они исправляют эту ошибку, вы можете написать собственный код для отправки HTTP-сообщения на график и анализа возвращаемых результатов. Я не сталкиваюсь с этой проблемой ни в C # API, ни в Javascript API.

0 голосов
/ 29 декабря 2011

Если вы используете php (http://php.net/manual/en/function.sprintf.php):

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

выходы:

100000145202000

Javascript:

parseFloat('1.00000145202E+14')
...