Пагинация. Упрощение

в 11:27, , рубрики: Песочница, метки: , ,

Не обходит этот вопрос приобщившихся в разной степени к 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>

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js