Курилка.co.ua
Orphus RSS kurilka.co.ua

Category

Archives

Как разбить данные на страницы

Author wmas wmas | Category Category MySQL, PHP

Работая с рядом выводимых записей, не важно из какого источника (в нашем случае это вообще MySQL), часто приходится разбивать их на страницы. При этом, встает задача создать некий «пейдж скролинг», а если по простому — феньку с циферками этих самых страниц. Так как их, т.е. страниц, может быть много, то лучше выводится ограниченное количество ссылок на страницы. К примеру, у нас 20я страница, значит, выводим с 10й по 30ю или как вам будет угодно. Вообще вариантов много, их количество может быть ограничено лишь вашей фантазией, но я приведу пример своего, который и использую.

Моя функция pages() имеет следующие параметры: $total — общее количество результатов данных (получаем отдельным запросом к БД), $p — текущая страница (внешняя переменная, передаваемый скрипту), $pp (per page) – количество выводимых результатов данных на каждой странице (статичный параметр).

Т.к. я заикнулся о MySQL (как источнике данных) начну именно с этого. Первое, это $total для получения которого мы посылаем запрос к БД похожий на тот, что делает выборку данных выводимых на одну страницу, но без ограничения (LIMIT) и/или сортировки (ORDER BY), здесь это просто не имеет смысла. К примеру:

$sql = "SELECT COUNT(*) FROM table_name WHERE cat_id=1";
$r = mysql_query($sql);
$total = mysql_result($r,0,0);

Подсчет делаем функцией COUNT(*), а cat_id=1 я привел как наглядный пример ограничений, в данном случае по категории, который используется в обоих выше упомянутых запросах к БД. Сама же выборка данных (выводимых на одну страницу, с учетом рассматриваемого примера) может иметь вид:

$sql = "SELECT * FROM table_name WHERE cat_id=1 LIMIT ".$start.", ".$pp;

Обратите внимание, что здесь нас интересуют данные, т.е. * и в игру вступают новые переменные $start и $pp. Если с последней переменной всё понятно и достаточно добавить строку типа: $pp = 10;, то $start — это внутренняя переменная, обозначающая позицию с которой начинается выборка, рассчитывается с учетом значения текущей страницы $p.

Дело в том, что LIMIT это часть SQL запроса имеющая определенный формат параметров. Здесь два варианта. Первый, это когда вы вводите один параметр, к примеру: LIMIT 10, что означает выборку первых 10 строк. Второй, это когда вы вводите два параметра, к примеру: LIMIT 5, 10, что означает выборку 10 строк результата запроса, начиная с 5ой.

Осталось только привести пример расчета значения переменной $start, вот мой вариант:

$start = ($p-1)*$pp;

При этом, есть одно важное условие: страницы начинаются с единицы (1). Для избежания проблем, можно учесть это в скрипте, при обработке внешнего параметра текущей страницы $p:

$p = (int) $_GET['p']; if ($p<1) $p=1;

Да, получилось так что я начал с конца, но думаю, идейную линию Вы не потеряли. В конце концов, мы говорим несколько о других вещах, а именно о «пейдж скролинге». И так, вот собственно моя функция:

function pages ($total, $p, $pp=10) {
  $pages  = array ();
  $tpages  = ceil ($total/$pp);
  $bpage  = $p - 10; if ($bpage<1) $bpage = 1;
  $epage  = $p + 10; if ($epage>$tpages) $epage = $tpages;

  if ( $p>1 ) {
    $pages[] = '<a href="' . $_SERVER['PHP_SELF'] .
      get2str("p", 1) . '">в начало</a>';
  }
  for ( $i=$bpage; $i<=$epage; $i++ ) {
    if ( $i==$p ) {
      $pages[] = '<b>'.$i.'</b>';
    } else {
      $pages[] = '<a href="' . $_SERVER['PHP_SELF'] .
        get2str("p", $i) . '">'.$i.'</a>';
    }
  }
  if ( $p<$tpages ) {
    $pages[] = '<a href="' . $_SERVER['PHP_SELF'] .
      get2str("p", $tpages) . '">в конец</a>';
  }

  if ( count($pages)>0 ) {
    echo '<p>'.implode (' | ',$pages).'</p>';
  }
}

Суть её сводится к тому, что мы создаем массив ссылок на страницы $pages, который потом склеиваем, используя функцию implode(). При этом, $tpages — количество страниц в результате, $bpage и $epage — ограничение части выводимых ссылок на страницы, о котором мы говорили ранее. Дальше идут расчеты и генерация ссылок. Чтобы не мучиться с указанием файла скрипта выводящего данных, я использую серверную переменную $_SERVER['PHP_SELF'], а для формирования строки переменных передаваемых скрипту и указания в ссылке нужной страницы ($i) функцию get2str(), о которой рассказывал в предыдущей заметке: Перевод переменных $_GET в строку. При этом, стоит учесть, что функция привязана к переменным передаваемым методом GET и с POST работать не будет. У каждого свои недостатки, но в данном случае такой вариант может быть и плюсом. Отмечу, что текущая страница в «пейдж скролинге» выделена жирным шрифтом и без ссылки.

Для того же, чтоб обобщить картину вы можете скачать собранный пример с некоторыми моими комментариями в нем, надеюсь, это поможет. Спасибо за внимание.

Publish: Четверг Ноя 29, 2007

2 Responses for "Как разбить данные на страницы"

feed for comments on this post

  • Комментарий #1271 author: Krasavin Reply (subscribed to comments)
    publish: Четверг Фев 14, 2008 at 10:58 пп

    Большое Вам спасибо. Для начинающего программиста четкие и подробные объяснения на пальцах — это незаменимая вещь. Благо, есть в инете люди, которые осознают необходимость подробных пояснений :-D
    Добавил Вашу ссылку к себе на сайт.

  • Комментарий #1272 author: wmas Reply
    publish: Четверг Фев 14, 2008 at 11:11 пп

    2Krasavin: Здравствуйте!
    Да просто так получилось, что меня попросили объяснить как это делается.
    Через ICQ, как-то неудобно да и четкости фокусировки добиться проблематично… мысля разбегается, сачком не словишь :mrgreen:
    Так что пришлось написать заметку.
    Я вообще не особи силен в программировании и мои решения могут быть не самыми лучшими, но рад если заметка чем-то смогла быть полезной.
    Спасибо за комментарий!


Popular links

Copyright © since 2006 Курилка.co.ua,
powered by WordPress