Постраничная навигация php примеры

Простая пагинация на PHP/Javascript. Создаем постраничную навигацию

Разрабатывая любой проект часто приходиться сталкиваться с необходимостью создания постраничной навигации или как еще называют — пагинация. Будь-то список статей, пользователей или любые другие выборки с базы данных, где большое количество записей требуют лимитированного вывода. Такой вывод можно реализовать двумя способами:

1. Выгружать все данные и показывать пользователю только часть.
2. Выгружать только часть данных, которые непосредственно показывать.

Каждый из способов имеет свои плюсы и минусы, очевидно, если записей в базе очень много, то выгружая все, мы очень сильно нагружаем компьютер пользователя. Просто представьте, что при открытии страницы у вас подгружается 100.000 записей, с другой стороны, если выгрузка имеет только 100 элементов, то такой способ будет работать быстрее, так как не нужно постоянно обращаться к серверу.

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

1. Функция pagePrint(), печатает ссылку на заданую страницу

function pagePrint($page, $title, $show, $active_class = '') < if($show) < echo '' . $title . ''; > else < if(!empty($active_class)) $active = 'class="' . $active_class . '"'; echo '' . $title . ''; > return false; >

$page — номер страницы;
$title — анкор ссылки (например, «1», «2», «10», «следующая»);
$show — показывать ссылку или текст, используется, чтобы вывести текущую страницу, или же неактивные ссылки «назад», «вперед»;
$active_class — класс CSS для активной страницы.

2. Начальный конфиг

$page_setting = [ 'limit' => 50, // кол-во записей на странице 'show' => 5, // 5 до текущей и после 'prev_show' => 0, // не показывать кнопку "предыдущая" 'next_show' => 0, // не показывать кнопку "следующая" 'first_show' => 0, // не показывать ссылку на первую страницу 'last_show' => 0, // не показывать ссылку на последнюю страницу 'prev_text' => 'назад', 'next_text' => 'вперед', 'class_active' => 'active', 'separator' => ' . ', ]; $page = (int) $_GET['page']; if(empty($page)) $page = 1; // если страница не задана, показываем первую

3. Пример выборки данных из базы

$start = ($page-1)*$page_setting['limit']; $res = $db->query("SELECT * FROM table LIMIT ,");

Для выборки используется LIMIT, где старт вычисляется по формуле (page-1)*limit, то есть для первой страницы start = 0.

4. Подсчет кол-ва страниц и проверка основных условий.

С подсчетом количества страниц иногда возникают проблемы, так как страниц может быть только целое число, а при делении (кол-во записей)/(лимит записей на странице) может получится дробное. Данный результат необходимо округлить в больную строну, потому что, обычное округление round(), выдаст ошибочный результат.

Пример, всего записей 31, на странице публикуем по 10, таким образом по формуле получается 3.1 страница, при округлении round(3.1) = 3, что неправильно, так как теряется одна запись. Поэтому используется функция ceil(), ceil(3.1) = 4.

$res = $db->query("SELECT count(*) AS count FROM dle_getmovie_movies "); $row = $res->fetch(PDO::FETCH_ASSOC); $page_count = ceil($row['count'] / $page_setting['limit']); // кол-во страниц $page_left = $page - $page_setting['show']; // находим левую границу $page_right = $page + $page_setting['show']; // находим правую границу $page_prev = $page - 1; // узнаем номер предыдушей страницы $page_next = $page + 1; // узнаем номер следующей страницы if($page_left < 2) $page_left = 2; // левая граница не может быть меньше 2, так как 2 - первое целое число после 1 if($page_right >($page_count - 1)) $page_right = $page_count - 1; // правая граница не может ровняться или быть больше, чем всего страниц if($page > 1) $page_setting['prev_show'] = 1; // если текущая страница не первая, значит существует предыдущая if($page != 1) $page_setting['first_show'] = 1; // показываем ссылку на первую страницу, если мы не на ней if($page < $page_count) $page_setting['next_show'] = 1; // если текущая страница не последняя, значит существуюет следующая if($page != $page_count) $page_setting['last_show'] = 1;

5. Выводим на экран:

pagePrint($page_prev, $page_setting['prev_text'], $page_setting['prev_show']); pagePrint(1, 1, $page_setting['first_show'], $page_setting['class_active']); if($page_left > 2) echo $page_setting['separator']; for($i = $page_left; $i if($page_right < ($page_count - 1)) echo $page_setting['separator']; if($page_count != 1) pagePrint($page_count, $page_count, $page_setting['last_show'], $page_setting['class_active']); pagePrint($page_next, $page_setting['next_text'], $page_setting['next_show']);

Вот и все, алгоритм разобран, ниже представлен код для вывода пагинации на Javascript:

// функция смены страницы function pageChange(page) < var page_show = 0; var page_txt = ''; var setting = page_setting(); setting.page_left = page - setting.show; // находим левую границу setting.page_right = page + setting.show; // находим правую границу setting.page_prev = page - 1; // узнаем номер предыдушей страницы setting.page_next = page + 1; // узнаем номер следующей страницы if(setting.page_left < 2) setting.page_left = 2; // левая граница не может быть меньше 2, так как 2 - первое целое число после 1 if(setting.page_right >(setting.page_count - 1)) setting.page_right = setting.page_count - 1; // правая граница не может ровняться или быть больше, чем всего страниц if(page > 1) setting.prev_show = 1; // если текущая страница не первая, значит существует предыдущая if(page != 1) setting.first_show = 1; // показываем ссылку на первую страницу, если мы не на ней if(page < setting.page_count) setting.next_show = 1; // если текущая страница не последняя, значит существуюет следующая if(page != setting.page_count) setting.last_show = 1; page_txt += pagePrint(setting.page_prev, setting.prev_text, setting.prev_show); page_txt += pagePrint(1, 1, setting.first_show, setting.class_active); if(setting.page_left >2) page_txt += setting.separator; for(var i = setting.page_left; i if(setting.page_right < (setting.page_count - 1)) page_txt += setting.separator; if(setting.page_count != 1) page_txt += pagePrint(setting.page_count, setting.page_count, setting.last_show, setting.class_active); page_txt += pagePrint(setting.page_next, setting.next_text, setting.next_show); document.getElementById("pagenavi").innerHTML = page_txt; return false; >// функция для публикации ссылки на страницу function pagePrint(page, title, show, active_class = '') < if(show) < return '' + title + ''; > else < var active = ''; if(active_class != '') active = 'class="' + active_class + '"'; return '' + title + ''; > return false; > var page = 1; // получаем номер страницы, для примера 1 if(page != undefined) page = 1; // если страница не задана, показываем первую var page_count = 10; // считаем кол-во страниц, для примера 10 // начальные настройки var page_setting = function() < return < 'limit': 50, // кол-во записей на странице 'show': 5, // 5 до текущей и после 'prev_show': 0, // не показывать кнопку "предыдущая" 'next_show': 0, // не показывать кнопку "следующая" 'first_show': 0, // не показывать ссылку на первую страницу 'last_show': 0, // не показывать ссылку на последнюю страницу 'prev_text': 'назад', 'next_text': 'вперед', 'class_active': 'active', 'separator': ' . ', 'page_count': page_count, 'page_left': 0, 'page_right': 0, 'page_prev': 0, 'page_next': 0 >>; pageChange(page); // совершаем первый вызов

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

Читайте также:  Php строка как код

Источник

Постраничная навигация на PHP

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

Приступим?

Первое, что нам нужно для этого иметь – это базу данных с несколькими десятками строк, например статей или комментариев к ним (что угодно). Мы будем рассматривать базу данных MySQL, она является самой популярной на данный момент. Естественно используемый язык – это PHP.

1. Создаём для примера файл primer.php;
2. Создаём Базу данных primer (можете не создавать, если у вас уже есть подходящая);
3. Создаём таблицу primer вот такой структуры (опять же, если нет другой);

CREATE table primer ( id int auto_increment primary key key, name varchar(100) NOT NULL, text longtext NOT NULL );

4. Набиваем её информацией. Я сделаю 20 записей, мне не день 😉
5. Набираемся терпения – сейчас будем кодить.

Сам код довольно небольшой и несложный, поэтому вылажу его сразу весь, пометки Вам помогут разобраться без проблем.

Запихиваем нижележаций код в primer.php и пытаемся понять как же он работает:

Ошибочка вышла!'; // СОЕДЕНИМСЯ С MySQL $connect = mysql_connect ($server, $user, $pass); if (!$connect) < echo $text_error; exit; >// СОЕДЕНИЯЕМСЯ С БАЗОЙ ДАННЫХ $select = mysql_select_db($db); if (!$select) < echo $text_error; exit; >// СОЗДАЁМ ЗАПРОС $result = mysql_query("SELECT * from $table ORDER by id desc"); // СЧИТАЕМ КОЛЛИЧЕСТВО ЗАПИСЕЙ В ТАБЛИЦЕ - У МЕНЯ ИХ 20 $num_rows = mysql_num_rows($result); // А ТЕПЕРЬ СЧИТАЕМ НА СКОЛЬКО СТРАНИЦ НАМ РАЗБИТЬ ЗАПИСИ И ВЫДЕЛЯЕМ ЦЕЛОЕ ЧИСЛО $num_rows = round($num_rows/$chislo); // 20 ДЕЛИМ НА 5. СКОЛЬКО? :) // ЗДЕСЬ МЫ ПРОВЕРЯЕМ НА КАКОЙ СТРАНИЦЕ СЕЙЧАС ПОЛЬЗОВАТЕЛЬ if (isset($_GET['str'])) < $nav = $_GET['str']; >else < $nav = 0; >$nav = intval($nav); // ДЛЯ ЗАЩИТЫ ОТ НЕХОРОШИХ ДЯДЕНЕК МЫ ВЫДЕЛИМ ЦЕЛУЮ ЧАСТЬ $GET['str'] echo 'Навигация: '; // А ТЕПЕРЬ ВЫВОДИМ НОМЕРА СТРАНЦ for ($i=1; $i'.$i.' '; > else < // АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ echo ''.$i.' '; > > echo '
'; // ОТДЕЛИМ НАВИГАЦЮ ОТ КОНТЕНТА ДЛЯ НАГЛЯДНОСТИ // НАЧИНАЕМ ВЫВОДИТЬ САМУ ИНФОРМАЦИЮ ПОСТРАНИЧНО :) if (!isset($_GET['str'])) < $str = 0; >else < $str = $_GET['str']*$chislo - $chislo; >$nomer = $str + 5; // ФОРМИРУЕМ ЗАПРОС НУЖНОЙ НАМ ЧАСТИ ИНФОРМАЦИИ $result = mysql_query("SELECT * from $table ORDER by id asc limit $str, $nomer"); // ИНАЧЕ ВЫВОДИМ ОШИБКУ if (!$result) < echo $text_error; exit; >echo '
'; while ($row = mysql_fetch_array($result)) < echo '

'.$row['id'].' - '.$row['name'].'
'.substr($row['text'],0,100).'.. >>

'; > echo '
'; mysql_close($connect); ?>

Поясню лишь, что в переменной "str" передаётся номер страницы, на которой находится пользователь, в адрессной строке браузера это выглядит так:

Читайте также:  Html iframe border none

Вот и всё, скрипт постраничного вывода у нас готов! Примерно, это должно выглядеть так:

Если это необходимо, редактируем скрипт (например, сделаем его функцией и будем использовать каждый необходимый нам раз) и влепляем его в Ваш дизайн на странице.

Источник

Постраничная навигация php примеры

Проблема реализации постраничной навигации часто встает перед начинающими PHP-программистами. К разбиению объёмного текста на отдельные страницы прибегают во многих Web-приложениях от гостевых книг и форумов до различных каталогов. Давайте
решим эту проблему.
Итак, что нам требуется для реализации постраничной навигации? Для примера возьмем гостевую книгу, содержащую несколько сотен сообщений, в которой требуется выводить на страницу Х сообщений.
Рассмотрим задачу более конкретно. Сообщения пользователей хранятся в базе данных post со следующей структурой:
id – номер сообщения,
text – тело сообщения,
name – имя автора,
time – время создания.
В итоге нам надо получить вывод Х сообщений на страницу, а также организовать удобную навигацию, например, такую:

где 4 - текущая станица. Для того чтобы отслеживать текущую страницу, будем использовать параметр page, передаваемый через URL. К примеру:

Здесь X - номер станицы (для примера, пусть Х будет равно 25).

Теперь, после этого небольшого введения, можно приступать к непосредственной реализации.

// Устанавливаем соединение с базой данных
include "config.php";
// Переменная хранит число сообщений выводимых на станице
$num = 25;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM post");
$posts = mysql_fetch_row($result);
// Находим общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM post LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
?>

Читайте также:  Узнать версию python debian

На этом первая часть закончена. Двумерный массив postrow хранит все поля таблицы post, необходимые для отображения станицы. Вот пример как можно организовать вывод сообщений.

Теперь надо организовать навигацию. Формируем составляющие будущей навигации.
Коды стрелки «в начало» и «назад» поместим в одну переменную, также поступим и со стрелками «в конец» и «вперед».

// Вывод меню
echo $pervpage.$page2left.$page1left.''.$page.''.$page1right.$page2right.$nextpage;

Источник

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