Как избежать многочисленных обращений к моей БД? (MySQL + PHP) - PullRequest
2 голосов
/ 27 марта 2012

С помощью следующего кода я получаю все страницы, которые я администрирую на Facebook, используя FQL.Я их не печатаю.

$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'];
      }

  }

Моя проблема / вопрос заключается в том, могу ли я как-то избежать многочисленных вызовов БД, потому что это делает запрос для каждой страницы, которую я администрирую.Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 27 марта 2012
<?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 col IN сделает один запрос для всех идентификаторов, поэтому

WHERE page_id IN (1,3,45,6,7,6,7,5,2,1,5,76), и он будет делать это в запросе, просто сделайте цикл после результатов и сделайте все, что угодно хочешь!

1 голос
/ 27 марта 2012

Вы можете собирать идентификаторы из результатов, полученных с помощью FQL, а затем запрашивать в БД строки, которые существуют в результатах, чтобы отфильтровать те, которые присутствуют в БД, из результатов ...

$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"
}
...