Постраничный вывод данных из базы или же пагинатор
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> ';
}
Комментарии
joker
09.03.2013 13:00:42
09.03.2013 13:00:42
Спасибо огромное!
wrappermail
31.07.2015 13:34:46
31.07.2015 13:34:46
Спасибо! Ты молодец.
Новичок
24.09.2017 16:18:07
24.09.2017 16:18:07
Спасибо, разложено все по полочкам)понятно даже новичку