Место для вас

Создание постраничной навигации на php

При извлечении большого количества данных на сайте лучше эту информацию разбить на части.
- Во-первых, это ускоряет загрузку сайта
- Во-вторых, это снижает нагрузку на сервер
- В-третьих, так удобнее просматривать информацию, поделенную на части.
!!! хотя сейчас можно добавить js скрипт infinite scroll и вся информация будет подгружаться на одной странице. Как на google картинки.

Сперва создаем 2 переменные:
$per_page — число записей на странице
$num_page — число ссылок перехода в навигации относительно активной ссылки

в $_GET['p'] будет передаваться номер записи, с которой будет начинаться выборка данных из БД.
то есть ссылка приобретает вид: http://your-site-name.com/index.php?p=10

теперь присвоим это значение переменной $start_row


$start_row = (!empty($_GET['p']))? intval($_GET['p']): 0;

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


mysql_query('SELECT COUNT(*) AS totalrows FROM table WHERE...');

либо если известно количество строк в БД, то присваиваем переменной $total это количество.

И так как номер строки, с которой будет начинаться выбор записей из БД не может быть меньше ноля и быть больше общего количества записей, то необходимо сделать проверку:


if ($start_row < 0) $start_row = 0; elseif ($start_row > $total) $start_row = $total;

теперь нужно создать функцию, которая будет делать все расчеты и отвечать за вывод навигации

function pagination($total,$per_page,$num_page,$start_row,$url=''){}
$total — общее число извлекаемых строк в базе данных
$per_page — количество отображаемых строк из БД на странице
$num_page — чило ссылок относительно активной страницы
$start_row — номер строки с которой начинается выборка из бд
$url — ul-адрес, который будет подставляться в ссылку

а теперь вся функция целиком:


function pagination($total, $per_page, $num_page, $start_row, $url='')
{
   $num_pages = ceil($total/$per_page); //Получаем общее число страниц

   if ($num_pages == 1) return '';

   $cur_page = $start_row; //Получаем количество элементов на страницы

   //Если количество элементов на страницы больше чем общее число элементов
   // то текущая страница будет равна последней
   if ($cur_page > $total){$cur_page = ($num_pages - 1) * $per_page;}

   //Получаем номер текущей страницы
   $cur_page = floor(($cur_page/$per_page) + 1);

   //Получаем номер стартовой страницы выводимой в пейджинге
   $start = (($cur_page - $num_links) > 0) ? $cur_page - $num_links : 0;
   //Получаем номер последней страницы выводимой в пейджинге
   $end = (($cur_page + $num_links) < $num_pages) ? $cur_page + $num_links : $num_pages;

   $output = '<span class="ways">';
   //Формируем ссылку на предыдущую страницу
   if ($cur_page != 1)
   {
      $i = $start_row - $per_page;
      if ($i $output .= '<a href="'.$url.'?p='.$i.'">Назад</a>';
   }
   else
   {
      $out put .='<span>Назад</span>';
   }
   $output .= '<span class="divider">|</span>';

   //Формируем ссылку на следующую страницу
   if ($cur_page < $num_pages)
   {
      $output .= '<a href="'.$url.'?p='.($cur_page * $per_page).'">Вперед</a>';
   }
   else
   {
      $output .='<span>Вперед</span>';
   }
   $output .= '</span>';

   //Формируем ссылку на первую страницу
   if ($cur_page > ($num_links + 1))
   {
      $output .= '<a href="'.$url.'">Начало</a>';
   }

   // Формируем список страниц с учетом стартовой и последней страницы 
   for ($loop = $start; $loop = 0)
   {
      if ($cur_page == $loop)
      {
         //Текущая страница
         $output .= '<span>'.$loop.'</span>';
      }
   else
   {
      $n = ($i == 0) ? '' : $i;
      $output .= '<a href="'.$url.'?p='.$n.'">'.$loop.'</a>';
   }
}
}

//Формируем ссылку на последнюю страницу
if (($cur_page + $num_links) < $num_pages)
{
   $i = (($num_pages * $per_page) - $per_page);
   $output .= '<a href="'.$url.'?p='.$i.'">Конец</a>';
}

return '</pre>
   <div class="wrapPaging"><strong>Страницы:</strong>'.$output.'</div>
<pre>';
}

Вот и все. Теперь, в том месте, где вы выдодите записи из БД нужно добавить ограничение LIMIT $start_row,$per_page

то есть запрос должен выглядеть так:


$select = "SELECT id, name, descr FROM table LIMIT $start_row,$per_page";

а там, где вы хотите, чтоб отображались ссылки на переходы по страницам, нужно вызвать функцию:
echo pagination($total,$per_page,$num_page,$start_row,'http://example-site.com/index.php');

В добавок. как бонус =)) вот дефолтные css стили для пагинации


div.wrapPaging {padding: 6px 0px 6px 16px; font-size: 14px; clear: both;}
div.wrapPaging i {margin: 0 5px 0 0;}
div.wrapPaging a {background: none; color: #025A9C; text-decoration: underline; font-size: 14px;}
div.wrapPaging a:hover {color: #ff0000;}
div.wrapPaging a, div.wrapPaging span {margin: 0 1px; padding: 2px 5px; line-height: 26px; text-decoration: none;}
div.wrapPaging strong {margin: 0 15px 0 0; font-size: 16px; font-weight: bold; color: #000;}
div.wrapPaging span {background: #E8E9EC; color: #000;}
div.wrapPaging span.divider {color: #999;}
div.wrapPaging span.ways {background: none; font-size: 15px; color: #999;}
div.wrapPaging span.ways a {font-size: 15px;}
div.wrapPaging span.ways span {background: none; color: #999;}

Место для вас

Добавить коментарий

кликните на картинку,
чтоб обновить код

Что за сайт

Этот сайт представляет унифицированную базу, где инфа собрана в единое целое, а не разбросанна по многочисленным сайтам, записям на листах бумаги или головам людей; а так же доступна круглосуточно не зависимо от кого-либо или чего-либо.

Будь в курсе

Интересненько

Вверх