Вывести несколько страниц php

Постраничный вывод и базы данных

В SQL-запросах, для ограничения количества строк в результате используется инструкция LIMIT , например следующий вернёт первые 10 записей:

SELECT * FROM `table` ORDER BY `id` LIMIT 0, 10

В следующем запросе будут записи с 11 по 20:

SELECT * FROM `table` ORDER BY `id` LIMIT 11, 10

Для построения пагинации требуется знать сколько всего записей вернет SQL-запрос без LIMIT, для этого в MySQL есть опция SQL_CALC_FOUND_ROWS . С ней запрос вернет обычный результат.

SELECT SQL_CALC_FOUND_ROWS * FROM `table` ORDER BY `id` LIMIT 0, 10

Но теперь, если следом выполнить запрос SELECT FOUND_ROWS() , то он вернёт общее количество записей в предыдущем запросе.

На этом принципе был написан PHP-класс для постраничного вывода из базы данных.

Использование класса

В класс нужно передать URL страницы, количество записей на странице и SQL-запрос выборки из БД (например товары).

CSS-стили пагинатора:

.pagination-row < overflow: hidden; clear: both; margin: 0 0 20px 0; margin-bottom: 15px; >.pagination < padding: 0; margin: 0; text-align: center; >.pagination .page-item < display: inline-block; margin: 0 2px 3px; >.pagination .page-link < display: inline-block; height: 28px; min-width: 28px; line-height: 28px; font-size: 15px; text-decoration: none; text-align: center; border: 1px solid #ddd; border-radius: 3px; background: #fbfbfb; text-decoration: none; color: #000; >.pagination a.page-link:hover < background: #ffd57b; >.pagination .active a.page-link < background: #2bc2e0; border-color: #a5a5ca; >.pagination .separator .page-link < border-color: #fff; background: #fff; >.pagination .disabled .page-link

Стили для списка товаров:

.prod-list < overflow: hidden; margin: 0 -25px 20px 0; >.prod-item < width: 180px; height: 290px; float: left; border: 1px solid #ddd; padding: 20px; margin: 0 20px 20px 0; text-align: center; border-radius: 6px; >.prod-item-name < margin-bottom: 5px; >.prod-item-btn a

Источник

Читайте также:  Input внутри print python

Универсальный постраничный вывод на PHP

Наверное, каждый разработчик сталкивался с необходимостью постраничного вывода какой-либо информации на экран. Практически в каждом проекте всегда есть «что-то», что не помещается на одну страницу и его нужно вывести по частям, классическим примером этому может служить, вывод информации в yandex или google. Все видели панель навигации, внизу страницы, между страницами. Как сделать подобную панель навигации, и посвящена эта статья.

Статей, как сделать постраничный вывод, много, но если информации будет очень много, например, поиск в yandex с запросом, типа «php», то все эти скрипты, описанные в статьях, окажутся не пригодными к использованию, скрипт 1 реализует такой простейший постраничный вывод. Представьте, что по этому запросу yandex нашел 100 тыс. сайтов и на каждой странице находится по 10 сайтов, т.е. 10 тыс. страниц, и все эти ссылки вывести на экран :). Когда посетитель увидит этот ужас на вашем сайте, он сразу же «убежит» и никогда не вернется, а если это будет выглядеть, как показано в примере 1 — то это совсем другое дело.

Так будет выглядеть панель навигации, которая описана в этой статье. Итак, приступим. Все комментарии я буду выдавать по ходу работы.

Но сейчас немного теории и принципа работы данного скрипта

Принцип работы скрипта прост, мы просто пробегаем всю окрестность текущей страницы. Ищем в окрестности текущей страницы действительные ссылки и выводим их. Весь остальной код — это просто для наглядности, в частности первый цикл (в скрипте № 2), он предназначен для того, чтобы количество ссылок было постоянным. Приведу пример опять же с yandex, когда по запросу найдено много сайтов, то внизу страницы вы увидите панель навигации приблизительно такого вида, как показано в примере 2.

Приблизительно так выглядит панель навигации в yandex, когда вы находитесь на первой странице. Когда вы перейдете на 8 страницу, то панель навигации будет уже выглядеть так, как показано в примере 3.

1 2 3 4 5 6 7 8 10 11 12 13 14 15 .

Приблизительно так выглядит панель навигации в yandex, когда вы находитесь на 8 странице.

Как видно в примере 3, количество ссылок изменилось. Немного лучше выглядит панель навигации, в которой количество ссылок постоянно, но в таком скрипте больше кода.

Ссылки типа «следующая» отсутствуют, вместо них присутствуют ссылки на первую и последнюю страницу. Сделано сие намеренно — ни разу в жизни не нажимал на «следующая», если можно было нажать на номер страницы, а вот ссылки на первую и последнюю страницу не помешают.

Ниже приведен скрипт простейшего постраничного вывода, а также скрипты обеих навигационных панелей, т.е. с постоянным количеством ссылок и с отсеченными по «краям».

Скрипт 1. Простейший постраничный вывод

function link_bar($page, $pages_count) < for ($j = 1; $j '.$j.' '; > else < echo ' '.$j.' '; > // Выводим разделитель после ссылки, кроме последней // например, вставить "|" между ссылками if ($j != $pages_count) echo ' '; > return true; > // Конец функции // Подключение к базе данных mysql_connect('localhost', 'root', '') or die('error! Нет соединения с сервером mysql!'); mysql_select_db('data_base') or die('error! Нет соединения с базой данных!'); // Подготовка к постраничному выводу $perpage = 10; // Количество отображаемых данных из БД if (empty(@$_GET['page']) || ($_GET['page'] else < $page = (int) $_GET['page']; // Считывание текущей страницы >// Общее количество информации $count = mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!'); $pages_count = ceil($count / $perpage); // Количество страниц // Если номер страницы оказался больше количества страниц if ($page > $pages_count) $page = $pages_count; $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД // Вызов функции, для вывода ссылок на экран link_bar($page, $pages_count); // Вывод информации из базы данных echo '

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

'; $result = mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!'); while ($row = mysql_fetch_array($result)) < echo '

'.$row['some_field'].'

'; >

Скрипт 2. С постоянным количеством ссылок

function universal_link_bar($page, $count, $pages_count, $show_link) < // $show_link - это количество отображаемых ссылок; // нагляднее будет, когда это число будет парное // Если страница всего одна, то вообще ничего не выводим if ($pages_count == 1) return false; $sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками // Для придания ссылкам стиля $style = 'style="color: #808000; text-decoration: none;"'; $begin = $page - intval($show_link / 2); unset($show_dots); // На всякий случай :) // Сам постраничный вывод // Если количество отображ. ссылок больше кол. страниц if ($pages_count 2) && !isset($show_dots) && ($pages_count - $show_link > 2)) < echo '| < '; > for ($j = 0; $j < $page; $j++) < // Если страница рядом с концом, то выводить ссылки перед идущих для того, // чтобы количество ссылок было постоянным if (($begin + $show_link - $j >$pages_count) && ($pages_count-$show_link + $j > 0)) < $page_link = $pages_count - $show_link + $j; // Номер страницы // Если три точки не выводились, то вывести if (!isset($show_dots) && ($pages_count-$show_link >1)) < echo ' .  '; // Задаем любое значение для того, чтобы больше не выводить в начале ". " (три точки) $show_dots = "no"; > // Вывод ссылки echo ' '.$page_link.' '.$sperator; > else continue; > for ($j = 0; $j // Подобное находится в верхнем цикле if (!isset($show_dots) && $begin > 1) < echo ' .  '; $show_dots = "no"; > // Номер ссылки перевалил за возможное количество страниц if ($i > $pages_count) break; if ($i == $page) < echo ' '.$i.' '; > else < echo ' '.$i.' '; > // Если номер ссылки не равен кол. страниц и это не последняя ссылка if (($i != $pages_count) && ($j != $show_link)) echo $sperator; // Вывод ". " в конце if (($j == $show_link) && ($i < $pages_count)) < echo ' .  '; > > // Вывод ссылки на последнюю страницу if ($begin + $show_link + 1 < $pages_count) < echo ' >| '; > return true; > // Конец функции // Подключение к базе данных mysql_connect('localhost', 'root', '') or die('error! Нет соединения с сервером mysql!'); mysql_select_db('data_base') or die('error! Нет соединения с базой данных!'); // Подготовка к постраничному выводу $perpage = 10; // Количество отображаемых данных из БД if (empty($_GET['page']) || ($_GET['page'] else < $page = (int) $_GET['page']; // Считывание текущей страницы >// Общее количество информации $count = mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!'); $pages_count = ceil($count / $perpage); // Количество страниц // Если номер страницы оказался больше количества страниц if ($page > $pages_count) $page = $pages_count; $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД // Вызов функции, для вывода ссылок на экран universal_link_bar($page, $count, $pages_count, 10); // Вывод информации из базы данных echo '

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

'; $result = mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!'); while ($row = mysql_fetch_array($result)) < echo '

'.$row['some_field'].'

'; >

Скрипт 3. С отсеченными по «краям» ссылками

function yandex_link_bar($page, $count, $pages_count, $show_link) < // $show_link - это количество отображаемых ссылок; // нагляднее будет, когда это число будет парное // Если страница всего одна, то вообще ничего не выводим if ($pages_count == 1) return false; $sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками // Для придания ссылкам стиля $style = 'style="color: #808000; text-decoration: none;"'; $begin = $page - intval($show_link / 2); unset($show_dots); // На всякий случай :) // Сам постраничный вывод // Если количество отображ. ссылок больше кол. страниц if ($pages_count 2) && ($pages_count - $show_link > 2)) < echo '| < '; > for ($j = 0; $j 1) < echo ' .  '; $show_dots = "no"; > // Номер ссылки перевалил за возможное количество страниц if ($i > $pages_count) break; if ($i == $page) < echo ' '.$i.' '; > else < echo ' '.$i.' '; > // Если номер ссылки не равен кол. страниц и это не последняя ссылка if (($i != $pages_count) && ($j != $show_link)) echo $sperator; // Вывод ". " в конце if (($j == $show_link) && ($i < $pages_count)) < echo ' .  '; > > // Вывод ссылки на последнюю страницу if ($begin + $show_link + 1 < $pages_count) < echo ' >| '; > return true; > // Конец функции // Подключение к базе данных mysql_connect('localhost', 'root', '') or die('error! Нет соединения с сервером mysql!'); mysql_select_db('data_base') or die('error! Нет соединения с базой данных!'); // Подготовка к постраничному выводу $perpage = 10; // Количество отображаемых данных из БД if (empty($_GET['page']) || ($_GET['page'] else < $page = (int) $_GET['page']; // Считывание текущей страницы >// Общее количество информации $count = mysql_numrows(mysql_query('select * from table')) or die('error! Записей не найдено!'); $pages_count = ceil($count / $perpage); // Количество страниц // Если номер страницы оказался больше количества страниц if ($page > $pages_count) $page = $pages_count; $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД // Вызов функции, для вывода ссылок на экран yandex_link_bar($page, $count, $pages_count, 10); // Вывод информации из базы данных echo '

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

'; $result = mysql_query('select * from table limit '.$start_pos.', '.$perpage) or die('error!'); while ($row = mysql_fetch_array($result)) < echo '

'.$row['some_field'].'

'; >

Переменные, которые требуют подробного описания:
$page — Текущая страница, передается от скрипта к скрипту методом get.
$perpage — Количество отображаемых данных из базы данных, на примере yandex — это количество ссылок на сайты, отображаемых на одной странице.
$count — Общее количество информации, на примере yandex — это количество найденных сайтов по запросу.
$pages_count — Количество страниц, без комментариев.
$start_pos — Начальная позиция, используется только в запросе к базе данных.

Вот и все! Универсальный постраничный вывод готов ;).

Дополнение применительно к MySQL

Пусть есть база с новостями, на странице надо выводить на 10 новостей, текущая страница находится в переменной $_GET[‘p’]

$query = "SELECT * FROM `news` ORDER BY `id`"; $result = @mysql_query($query); $total = mysql_num_rows($result); for($i = 10*$_GET['p']; $i

всё же на самом деле в несколько раз проще и понятнее, если немного поглубже ознакомиться с MySQL, того же самого можно добиться след. запросом:

$query = "SELECT * FROM `news` ORDER BY `id` DESC LIMIT ".($_GET['p'])*10.", ".10; $result = mysql_query($query); $total = mysql_num_rows($result); for($i = 0; $i

Источник

Оцените статью