2011-11-21 22 views
15

Xin chào, tôi đang sử dụng Facebook PHP SDK (v.3.1.1)facebook php, làm thế nào để bạn sử dụng phân trang kết quả?

Tôi không hiểu cách sử dụng url phân trang kết quả.

Tôi muốn có được một danh sách của tất cả các bạn bè của tôi, đây là mã của tôi

$friends = $fb->api('/me/friends'); 
/* 
$friend == Array 
(
    [data] => Array 
    (
     ... 
    ), 
    [paging] => Array 
    (
     [next] => https://graph.facebook.com/me/friends?method=GET&access_token=SOMETHING&limit=5000&offset=5000 
    ) 
*/ 
if (!empty($friends['paging']['next'])) 
{ 
    $friends2 = $fb->api($friends['paging']['next']); 
    //doesn't work 
} 

Trả lời

8

Các giá trị trong các kết quả phân trang mà bạn nhận được là các URL của thực tế mà bạn cần phải yêu cầu để có được tiếp theo nhóm kết quả. Ví dụ:

... 
{ 
     "name": "Adobe Flash", 
     "category": "Software", 
     "id": "14043570633", 
     "created_time": "2008-06-05T17:12:36+0000" 
    } 
    ], 
    "paging": { 
     "next" :https://graph.facebook.com/{USER_ID}/likes?format=json&limit=5000&offset=5000 
} 

Đây là kết quả phân trang "tiếp theo" tôi nhận được khi tôi truy vấn người dùng của mình cho các trang tôi thích. Nếu tôi yêu cầu URL này, nó sẽ cho tôi tổng cộng 5000 lượt thích với số tiền chênh lệch là 5000 (vì tôi đã có sen 5000 đầu tiên trong yêu cầu ban đầu). Hy vọng điều này sẽ làm rõ mọi thứ! chúc may mắn!

+2

và làm thế nào để bạn truy vấn nó? $ facebook-> api ??? – max4ever

+1

Có nhiều cách .. bạn có thể làm 'file_get_contents ($ paging_url)' hoặc sử dụng cURL ... theo ý kiến ​​của tôi [file_get_contents()] (http://php.net/manual/en/function.file-get- contents.php) là cách dễ nhất ... – Lix

+1

bạn cũng có thể sử dụng chức năng facebook-> api và chỉ thêm các giới hạn, tham số bù đắp vào cuộc gọi - ví dụ: '$ fb-> api ("/me/likes /? giới hạn = 5000 & offset = 5000 "); ' – Lix

13

Tất cả các câu trả lời trước đó đều hợp lệ.

Dưới đây là cách tôi làm, để có được tất cả các "bên cạnh" Kết quả với các API Graph:

Lưu ý rằng tôi không nhận được kết quả "trước".

function FB_GetUserTaggedPhotos($user_id, $fields="source,id") { 
    $photos_data = array(); 
    $offset = 0; 
    $limit = 500; 

    $data = $GLOBALS["facebook"]->api("/$user_id/photos?limit=$limit&offset=$offset&fields=$fields",'GET'); 
    $photos_data = array_merge($photos_data, $data["data"]); 

    while(in_array("paging", $data) && array_key_exists("next", $data["paging"])) { 
     $offset += $limit; 
     $data = $GLOBALS["facebook"]->api("/$user_id/photos?limit=$limit&offset=$offset&fields=$fields",'GET'); 
     $photos_data = array_merge($photos_data, $data["data"]); 
    } 

    return $photos_data; 
} 

Bạn có thể thay đổi giá trị giới hạn $ theo ý muốn để nhận ít/nhiều dữ liệu hơn cho mỗi cuộc gọi.

+1

đây là một đoạn mã tốt, vẫn vui lòng lưu ý rằng '' 'Phân trang dựa trên bù đắp không được hỗ trợ cho tất cả các cuộc gọi API. Để có được kết quả nhất quán, chúng tôi khuyên bạn nên phân trang bằng cách sử dụng các liên kết trước/tiếp theo mà chúng tôi trả về trong phản hồi. '' 'Nguồn: https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2 – augusto

+0

tham khảo này cũng http://stackoverflow.com/questions/9576211/facebook-graph -api-loop-through-paging –

+0

Trong thử nghiệm của tôi về 'in_array ('paging', $ data)' không trả về true, nhưng 'array_key_exists ('paging', $ data)' đã làm. –

5

tôi thích nghi cách đối phó với phân trang F2000 's và có mã sau đây:

// Initialize the Facebook PHP SDK object: 
$config = array(
    'appId'  => '123456789', 
    'secret'  => 'be8024db1579deadbeefbcbe587c0bd8', 
    'fileUpload' => false); 
$fbApi = new Facebook($config); 

// Retrieve list of user's friends: 
$offset = 0;  // Initial offset 
$limit = 10;  // Maximum number of records per chunk 
$friends = array(); // Result array for friend records accumulation 

$chunk = $fbApi->api(
    "/me/friends", 'GET', 
    array(
     'fields' => 'id,name,gender', 
     'offset' => $offset, 
     'limit' => $limit)); 

while ($chunk['data']) 
{ 
    $friends = array_merge($friends, $chunk['data']); 
    $offset += $limit; 

    $chunk = $fbApi->api(
     "/me/friends", 'GET', 
     array(
      'fields' => 'id,name,gender', 
      'offset' => $offset, 
      'limit' => $limit)); 
} 

// The $friends array contains all user's friend records at this point. 

Mã này dường như làm việc. Tùy chọn, để có độ tin cậy tốt hơn, nó có thể cố gắng xử lý các vấn đề kết nối tạm thời nhưng tôi bỏ qua điều này cho mã rõ ràng.

Tôi đang sử dụng Facebook PHP SDK 3.1.1

+1

Tôi biết đây là hai tuổi, nhưng tôi chỉ muốn thêm: Nếu bạn sử dụng vòng lặp do while thay vì một vòng lặp while và đặt '$ friends = ...' và '$ offset + = ...' dòng sau cuộc gọi api của bạn, bạn có thể cắt cuộc gọi api đầu tiên đó. – musicnothing

2

Các URL pagination trở về từ Facebook không tương thích với PHP SDK riêng của mình.

Bạn có thể trích xuất thông tin cần thiết bởi API từ URL phân trang và chuyển nó đến API SDK.

Sử dụng hàm PHP parse_url hoặc một số thao tác chuỗi để trích xuất thông tin đó.

Mẫu mã để lấy một phần của danh sách bạn bè của tôi (sử dụng parse_url):

$ret = $facebook->api('/me/friends?limit=25'); 
var_dump($ret); 
$next = parse_url($ret['paging']['next']); 
$ret = $facebook->api($next['path'] . '?' . $next['query']); 
var_dump($ret); 
0

Facebook truy vấn với giới hạn và pagination bù đắp không hoạt động tốt không trả lại tất cả các kết quả, vì vậy tôi đã đệ quy bằng cách sử dụng các trường pagination ['next'] được cung cấp bởi API.

Chức năng:

function chunk_results($arr,$query) 
{ 
    global $facebook; 
    $chunk = $facebook->api($query); 
    if($chunk['data']==null) 
    { 
     return $arr; 
    } 
    else 
    { 
     foreach($chunk['data'] as $dato) 
      $arr['data'][] = $dato; 

     return chunk_results($arr,substr($chunk['paging']['next'],26)); 

    } 
} 

Và bạn có thể khởi tạo nó với một mảng trống rỗng và truy vấn mà bạn muốn nhận được, như trong ví dụ sau:

chunk_results(array(),"/457568434275922/posts?fields=message") 

Hy vọng nó sẽ giúp!

PD: đối tượng Facebook của tôi được gọi là $ facebook

1

Bạn có thể không thực sự sử dụng url tiếp theo trực tiếp, Facebook php sdk không hỗ trợ nó, nhưng bạn có thể sử dụng chức năng tiêu chuẩn php để trích xuất dữ liệu bạn cần. Tôi sử dụng nó cho facebook api tìm kiếm, này là ví dụ

$result = $fb->api('/search', 'GET', $paramsArray); $url = parse_url($result['paging']['next']); parse_str($url['query'], $nextParams); $nextResult = $fb->api('/search', 'GET', $nextParams);

Các vấn đề liên quan