Не обходит этот вопрос приобщившихся в разной степени к PHP. Мне захотелось упростить пагинацию максимально. Основная задача — максимальная наглядность механизма. В связи с этим публикую скрипт полностью. Для наглядного тестирования потребуется база у меня с именем new — новости.
Итак, подключение к БД.
Переменная perpage — количество новостей на странице.
<?php
define('HOST', 'localhost');
define('USER', 'root');
define('PASSWORD', '123');
define('NAME_BD', 'new');
$perpage = 5;
mysql_connect(HOST, USER, PASSWORD) or die('error! No Connection!');
mysql_query("SET NAMES utf8");
mysql_select_db(NAME_BD) or die('error! Check BD connection');
Первое условие: если страница не задана или меньше, или равно 0,
устанавливаем переменную с номером страницы равной 1. Иначе номер — целое число:
if (empty($_GET['page']) || ($_GET['page'] <= 0)) {
$page = 1;
} else {
$page = (int) $_GET['page'];
}
Считаем все записи в базе, делим число всех записей на perapge и округляем в большую сторону (функция ceil), так получаем число страниц:
$count = mysql_numrows(mysql_query('select * from news')) or die(' Nothing happened');
$pages_count = ceil($count / $perpage);
Устанавливаем начальную позицию — переменная start_pos.
И начинаем выводить записи из базы:
$start_pos = ($page - 1) * $perpage;
$result = mysql_query('select * from news order by id desc limit '.$start_pos.', '.$perpage ) or die('error!');
while ($row = mysql_fetch_array($result)) {
?>
Выводим, допустим, только заголовки новостей:
<a href="new.php?myhead=<?=$row['id']?>"><?=$row['head']?></a>
<?php
}
mysql_free_result($result);
?>
Ссылки для перехода на первую страницу и для шага назад:
<a href="pag.php?page=1"> first </a>
<a href="pag.php?page=<?=$page-$perpage?>"> <</a>
В цикле ссылки на номера страниц. Первое условие выводит ссылку на номер страницы с предыдущего шага. Второе условие убирает несуществующие ссылки:
<?php
$page_plus=$page-1;
for ($i = 1; $i < $perpage; ++$i) {
if ($i==1 && $page > 1) {
echo "<a href="pag.php?page=$page_plus">$page_plus </a>";
}
if ($page_plus==$pages_count) {
break;
}
++$page_plus;
echo "<a href="pag.php?page=$page_plus"> $page_plus </a>";
}
?>
Ссылка для шага вперед и на последнюю страницу:
<a href="pag.php?page=<?=$page+$perpage?>">> </a>
<a href="pag.php?page=<?=$pages_count?>"> last </a>