./comments
./contacts telegram: @stikname
email: ;

Постраничный вывод данных из базы или же пагинатор

PHP
Постраничный вывод информации из БД


Как вывести информацию из БД и разделить на страницы?

Итак, видел много таких штук и везде все по разному.
Решил выложить и свой взгляд на это, чтобы всё было разобрано по шагам и очень доступно.

Приступим...

Для начала установим кол-во записей, выводимых на страницу.
$nums = 10;


Затем мы определимся на какой странице находимся (в нашем случае мы будем передавать номер страницы GET'ом).
if (isset($_GET['page'])) {
$page = intval($_GET['page']);
}
else {
$page = 1;
}


Посмотрим сколько всего у нас страниц, чтобы юзер не ввёл нам 1589 страницу из 13 возможных

Для этого необходимо подсчитать кол-во элементов всего:
$query = "SELECT COUNT(*) AS `counter` FROM `table`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['counter'];


А уже кол-во страниц выясняется нехитрым методом деления всех элементов на кол-во на страницу и округляется в большую сторону.
$pages = ceil($elements/$nums);


Теперь проверим чтобы текущая страница не была меньше 1 и не больше последней страницы
if ($page < 1) {
$page = 1;
}
elseif ($page > $pages) {
$page = $pages;
}


итак, в $page находится номер нашей страницы.

Для лимита в нашем запросе, нам необходимо подстачитать первый оператор, который показывает с какой записи мы зачинаем делать выборку
$start = ($page-1)*$nums;


Всё! Запрос составлен:
$query = "SELECT * FROM `table` LIMIT {$start}, {$nums}";


Переключение страниц:

В нашем пагинаторе мы не будем выводить все страницы от 1 .. до 130 например, а будем выводить только соседние по отношению к текущей, например если у нас выбрана страница 9, то мы введем слева и справа от неё пределённое кол-во страниц, допустим у нас это кол-во будет равно 4.
$neighbours = 4;


Определяем крайнего левого и правого соседей
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;

$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;


А как же нам вывести листалку?
if ($page > 1) {
print ' <a href="?page=1">начало</a> ... <a href="?page=' . ($page-1) . '">←сюда</a> ';
}

for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
if ($i != $page) {
print ' <a href="?page=' . $i . '">' . $i . '</a> ';
}
else {
// выбранная страница
print ' <b>' . $i . '</b> ';
}
}

if ($page < $pages) {
print ' <a href="?page=' . ($page+1) . '">туда→</a><a href="?page=' . $pages . '">конец</a> ... ';
}


Вот мы и написали модный переключатель страниц как на многих популярных сайтах.

Весь код:

$nums = 10;

if (isset($_GET['page'])) {
$page = intval($_GET['page']);
}
else {
$page = 1;
}

$query = "SELECT COUNT(*) AS `counter` FROM `table`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);

$elements = $row['counter'];

$pages = ceil($elements/$nums);

if ($page < 1) {
$page = 1;
}
elseif ($page > $pages) {
$page = $pages;
}

$start = ($page-1)*$nums;

// когда у нас в таблице нет записей
if ($start < 0) $start = 0;

$query = "SELECT * FROM `table` LIMIT {$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());

while ($row = mysql_fetch_assoc($sql)) {
// здесь выводим записи из базы
}

// далее нам надо прицепить переключение страниц

$neighbours = 4;
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;

$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;

if ($page > 1) {
print ' <a href="?page=1">начало</a> ... <a href="?page=' . ($page-1) . '">←сюда</a> ';
}

for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
if ($i != $page) {
print ' <a href="?page=' . $i . '">' . $i . '</a> ';
}
else {
// выбранная страница
print ' <b>' . $i . '</b> ';
}
}

if ($page < $pages) {
print ' <a href="?page=' . ($page+1) . '">туда→</a> ... <a href="?page=' . $pages . '">конец</a> ';
}
07.02.2013 16:17:41
stk
853
3
Комментарии

joker
09.03.2013 13:00:42
Спасибо огромное!
wrappermail
31.07.2015 13:34:46
Спасибо! Ты молодец.
Новичок
24.09.2017 16:18:07
Спасибо, разложено все по полочкам)понятно даже новичку