2012-03-26 58 views
2

通過以下代碼,我使用FQL獲取了我在Facebook上管理的所有頁面。我不打印他們。如何避免多次撥打我的數據庫? (MySQL + PHP)

$PageNames = $facebook->api('/fql', array('q' => 
     'SELECT name, page_id FROM page WHERE page_id IN (
       SELECT page_id FROM page_admin WHERE uid=me())')); 

此前,我在我的數據庫中添加了一些頁面的* page_id *。我的目標是顯示尚未添加到我的數據庫的頁面。它工作正常,代碼如下。

foreach($PageNames['data'] as $PageName) { 
    $investigate_id = mysql_query("SELECT page_id FROM pages WHERE page_id='" 
            .$PageName['page_id']."' LIMIT 1 "); 

     if(mysql_num_rows($investigate_id) == 0) { 
     echo $PageName['page_id'].$PageName['name']; 
     } 

    } 

我的問題/問題是,如果不知何故,我可以避開衆多數據庫調用,因爲它使每一頁我聯繫查詢。我怎樣才能做到這一點?

+1

把IDS在一起,並使用WHERE PAGE_ID IN(.....) – 2012-03-26 21:51:40

回答

1

您可以收集你FQL得到結果的ID,然後查詢數據庫的存在於結果從結果中過濾那些在DB行...

$fql = <<<FQL 
SELECT name, page_id FROM page WHERE page_id IN (
    SELECT page_id FROM page_admin WHERE uid = me() 
) 
FQL; 

// Get results from API 
$pages = $facebook->api('/fql', array('q' => $fql)); 

// Collect pages for later usage by ID 
$pagesByIds = array(); 
foreach($pages['data'] as $page){ 
    $pagesByIds[$page['page_id']] = $page; 
} 

// Query DB for all pages that exists in results 
$pagesIds = implode(',', array_keys($pageByIds)); 
$res = mysql_query("SELECT page_id FROM pages WHERE page_id IN ({$pageIds})"); 

while($pageRow = mysql_fetch_assoc($res)){ 
    $pageId = $pageRow['page_id']; 

    // Remove pages that present in API results and DB 
    if (isset($pagesById[$pageId])) unset($pagesById[$pageId]); ; 
} 

// Display details for pages not existing in DB 
foreach ($pagesByIds as $page){ 
    echo "ID: {$page['page_id']}, Name: {$page['name']} \n" 
} 
+0

謝謝你,但它不打印頁面的名稱.. – EnexoOnoma 2012-03-26 23:55:30

+0

@Kaoukkos,如果問題只是它現在裝箱的名字 – 2012-03-27 06:47:49

+0

謝謝你的回覆。我使用你的代碼來構建我的解決方案並進行一些更改。它真的幫助了我。 – EnexoOnoma 2012-03-27 12:06:51

2
<?php 

$IDs = array(); 
foreach($PageNames['data'] as $PageName){ 
    $IDs[] = $PageName['page_id']; 
} 

$investigate_id = mysql_query('SELECT page_id FROM pages WHERE page_id IN (\''.implode('\', \'', $IDs)).' LIMIT 1 '); 
while($assoc = mysql_fetch_assoc($investigate_id)){ 
    // iff 
} 
?> 

使用WHERE山坳IN會讓一個查詢將所有的ID,這樣

WHERE PAGE_ID IN(1,3,45,6,7,6,7,5,2,1,5,76 ),它會在查詢中完成,只需在結果之後進行循環並做任何你想做的事!

+0

有一個錯誤,但我無法弄清楚。它在查詢 – EnexoOnoma 2012-03-26 22:01:51

+0

@David忘記了左括號,IN(\''。implode('\',\'',$ IDs))。'\')LIMIT 1' – flo 2012-03-26 22:07:33