Как сделать fql.multiquery с помощью Facebook PHP SDK 3.0 - PullRequest
1 голос
/ 19 октября 2011

Я в процессе миграции с 2.x PHP SDK на 3.x.Все вызовы нескольких запросов прерваны, и я не смог понять, как их решить.

Вход в Facebook с использованием oauth javascript работает и позволяет получить доступ к данным для текущего пользователя на стороне сервера.Я предполагаю, что это подтверждает, что мой токен доступа является законным.

Я пробовал следующие варианты кода и каждый раз получаю ошибки:

Старый путь:

        $id = $fb->getUser(); // RETURNS A VALID USER ID
        $fql = '{ "friends" : "SELECT uid FROM user WHERE has_added_app=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 = '.$id.')", "profiles" : "SELECT uid, name, pic_square FROM user WHERE uid IN (SELECT uid FROM #friends)"}';

        $response = $fb->api( array('method' => 'fql.multiquery','queries' => $fql));

Выдает ошибку: PHP Фатальная ошибка: Uncaught Исключение: 102: Требуется пользовательский сеанс \ n брошенный

Предполагаемый новый способ сделать это:

        $id = $fb->getUser(); // RETURNS A VALID USER ID
        $fql = '{ "friends" : "SELECT uid FROM user WHERE has_added_app=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 = '.$id.')", "profiles" : "SELECT uid, name, pic_square FROM user WHERE uid IN (SELECT uid FROM #friends)"}';

        $response = $fb->api( array('method' => 'fql.query','query' => $fql));

Дает ошибку: PHP Фатальная ошибка: Uncaught Исключение: 601: Ошибка парсера: неожиданно '{' в позиции0

Приветствуется любая помощь в понимании того, как выполнять многозапросы с использованием нового PHP SDK.

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Для конкретного запроса используйте конечную точку API Graph new fql и только в one запросе:

<code>$user = $facebook->getUser();
if ($user) {
  try {
    $fql = urlencode("SELECT uid, name, pic_square FROM user WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = $user)");
    $response = $facebook->api("/fql?q={$fql}");
  } catch (FacebookApiException $e) {
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'
';$ user = null;}}

Также используйте is_app_user вместо устаревшего has_added_app one!

1 голос
/ 04 июля 2013

Просто передайте запросы как ассоциативный массив:

  $common_fields_fql = 'SELECT uid, email, contact_email, first_name, last_name, birthday_date, pic_square, sex, hometown_location, current_location, is_app_user FROM user WHERE uid ';
  $fql = array(
    'friends' => 'SELECT uid2 FROM friend WHERE uid1 = me()',
    'friends_details' => $common_fields_fql . 'IN (SELECT uid2 FROM #friends)',
    'me' => $common_fields_fql . '= me()',
    'family' => 'SELECT uid, birthday, name, relationship FROM family WHERE profile_id = me()',
  );
  $details = $facebook->api(array(
    'method'   => 'fql.multiquery',
    'queries'  => $fql,
  ));
...