Facebook ID целых чисел возвращаются странным образом - PullRequest
3 голосов
/ 08 октября 2011

Я делаю FQL-вызовы, используя следующий URL, а затем делаю вызов curl.

$ url = 'https://api.facebook.com/method/fql.query?access_token='.$access_token.'&query='.rawurlencode($query).'&format=JSON';

и затем я передаю возвращенные данные через вызов json_decode

У меня есть этот запрос:

ВЫБРАТЬ имя, page_id, page_url ОТ страницы, ГДЕ page_id IN (ВЫБРАТЬ page_id ОТ page_admin, ГДЕ uid = $ uid)

, который возвращает список имен и страниц, для которых указанный UID является администратором.

В некоторых установках PHP (и я не смог сузить его), page_id превращается из длинного целого в научную нотацию - так что 174311849258492 возвращается как 1.7431184925849E 14, что, конечно, ломает вещи.

Поскольку я не могу воспроизвести это на своем сервере, я не уверен, где происходит преобразование. Покопавшись, я нашел предложение, которое делает это:

json_decode (preg_replace ('/: (\ d +,) /', ': "$ {1}",', $ response));

это исправит

Но почему некоторые json_decodes переводятся в научную нотацию без видимой причины?

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

Если вы используете свои собственные вызовы curl, вы можете просто добавить & format = JSON-STRINGS в конец URL-адреса, который возвращает все элементы в виде строк.

3 голосов
/ 05 ноября 2011

Как отметил Дэнни, это проблема 32/64 бит.FB предполагает, что все является 64-разрядным, и возвращает целое число для этого значения, а не строку.

Итак, вам нужно взять целые числа и преобразовать их в строки ПЕРЕД извлечением их из массива JSON.Идентификаторы страниц и групповые идентификаторы передаются как целые числа (идентификаторы пользователей Facebook передаются в виде строк)

Код для этого:

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