Функции постраничного вывода в PHP


Оглавление (нажмите, чтобы открыть):

Постраничный вывод (PHP и MySQL)

Довольно часто на сайте возникает необходимость в отображении большого объема однотипной информации, при этом, для удобства восприятия, её следует разбивать на части, т.е. реализовать постраничный просмотр этой информации. Данное решение используется поисковыми системами при отображении результатов поиска, форумами, досками объявлений и т.д. Данная статья описывает то, как используя MySQL и PHP реализовать постраничный вывод.

Для начала отмечу, что статья не учит работе с базой данных и PHP, а даёт объяснение реализации, и приводит готовый к использованию PHP класс для постраничной разбивки (постраничной навигации).

Начнем! Допустим имеется база данных (MySQL), например, с объявлениями. Нам нужно реализовать их отображение на сайте, порциями по 20 штук на странице. Для перехода же между порциями в нижней части каждой страницы необходимо сформировать ссылки с номерами «порций» (ярлыки страниц):

Выборка данных порциями

Для выборки ВСЕХ объявлений из базы требуется запрос вида:

Конечно, это упрощенный вариант, и в реальных задачах, чаще всего, в запросе присутствуют различные условия (операторы WHERE , ORDER BY . ).

Для того чтобы этот запрос делал выборки порциями, необходимо к нему добавить оператор LIMIT :

Синтаксис оператора LIMIT: LIMIT [offset,] row_count

Необязательный параметр offset сообщает сколько рядов от начала выборки нужно пропустить, а row_count указывает сколько рядов нужно выбрать, т.е. LIMIT 0, 20 (или просто LIMIT 20 опустив нулевой offset) выбирает первые 20 рядов (с 0 по 19 ряд), а LIMIT 40, 20 указывает пропустить 40 (с 0 по 39 ряд) и выбрать следующие 20 (т.е. будут выбраны ряды с номера 40 по 59).

Обращаю ваше внимание, что ряды в выборке нумеруются с нуля, а не с единицы.

Таким образом запросы для нашего примера с объявлениями будут следующими:

и .т.д. offset увеличиваем на 20 для каждой следующей страницы, а row_count всегда равен 20.

Ещё необходимо отметить, что оператор LIMIT в запросе идет по порядку после WHERE , GROUP BY , HAVING , ORDER BY , но если вы новичок в MySQL, то можно сказать, что он идет в конце строки запроса (после него идут операторы довольно редко используемые).

Вторая часть с которой нам нужно разобраться это строка с ярлыками страниц.

Ярлыки страниц

Ярлыки — это ссылки для «перелистывания» страниц, т.е. ссылки нажимая на которые пользователь получает очередную порцию данных. Эти ссылки содержат в качестве параметра номер нужной порции (страницы).

Например, для выборки третьей двадцатки объявлений ярлык может иметь следующий вид:

При клике по этой ссылке запускается скрипт obyavleniya.php, которому доступен параметр page_number, сообщающий, что запрашивается 3 двадцатка объявлений — 3 страница. Скрипт пропускает первые 40 объявлений, и выбирает следующие 20.

Для вывода этой строки ярлыков требуется знать общее число страниц (чтобы знать сколько ярлыков «рисовать»). Его мы можем получить, разделив общее число объявлений на количество объявлений на странице, округлив результат до большего целого. Т.е., если в нашем примере, допустим, всего 107 объявлений, а выводим мы их на каждой странице по 20 штук, то число страниц будет: 107 / 20 = 5.35, т.е. 5 полных страниц (по 20 объявлений) + одна неполная (7 объявлений), итого, округлив получаем 6 страниц (соответственно будет 6 ярлыков).

Для подсчета общего числа объявлений, есть два пути. Первый путь — выполнить отдельный суммирующий запрос практически аналогичного запросу для выборки данных, только без ограничивающего оператора LIMIT , и ненужных операций сортировки ( ORDER BY ), например:

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

В MySQL 4.0.0 появились замечательные вещи, такие как функция FOUND_ROWS и связанная с ней SQL_CALC_FOUND_ROWS — опция оператора SELECT .

Рассмотрим второй вариант подсчета общего числа рядов:

Опять же, первый запрос делает выборку объявлений, а второй получает их общее число, но .

Запрос выборки объявлений в данном случае отличается от выборки из первого варианта только наличием опции SQL_CALC_FOUND_ROWS . Данная опция указывает MySQL вместе с выборкой данных сделать и подсчёт всех тех строк которые бы вернул запрос без оператора LIMIT . Т.е. по сути данный запрос включает в себя в скрытом виде COUNT запрос из первого варианта. При этом сама подсчитанная сумма не возвращается, а запоминается сервером. Теперь, для того чтобы узнать это число, нужно выполнить запрос с функцией FOUND_ROWS (при этом сервер не производит никаких вычислений, просто отдает то, что запомнил раньше).

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

Собираем все вместе

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

  1. первым делом при запуске скрипта смотрим какую страницу запрашивает пользователь (в нашем примере на это указывает параметр page_number);
  2. на основании номера запрашиваемой страницы вычисляем параметр offset оператора LIMIT ;
  3. запускаем запрос выборки объявлений с оператором LIMIT offset, 20 (где, 20 — это количество отображаемых объявлений на странице в нашем примере);
  4. получаем общее число объявлений в базе;
  5. на основании пункта 4 вычисляем общее число страниц объявлений и формируем строку ярлыков.

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

PHP класс Paging для постраничной разбивки

Теперь я приведу пример как организуется постраничная навигация с использованием PHP-класса Paging.

Единственное чем данный скрипт отличается от обычного скрипта без постраничной разбивки, так это тем, что запрос выборки данных которые нужно разделить на части производится не через mysqli->query() , а через метод get_page() реализованный в классе Paging, а так же тремя последними строками которые отображают ярлыки и строку отчет о выборке.

Постскриптум

P.S.: Этот постскриптум я привожу скорее для полноты изложения, нежели как реально актуальную информацию для большинства читателей.

Применение SQL_CALC_FOUND_ROWS и FOUND_ROWS() имеет некоторые подводные камни при использовании в UNION-запросах, так как операторы LIMIT могут использоваться в нескольких местах, и могут касаться как отдельных операторов SELECT в составе UNION, так и общего результата UNION в целом. Цель же SQL_CALC_FOUND_ROWS для UNION состоит в подсчёте количества строк, которые будут возвращены без глобального LIMIT . Поэтому следует привести условия применения SQL_CALC_FOUND_ROWS с запросами UNION :

  • Ключевое слово SQL_CALC_FOUND_ROWS должно указываться в первом операторе SELECT ;
  • Значение FOUND_ROWS() будет точным только при условии применения UNION ALL . Если указано UNION без ALL , происходит исключение дубликатов, и значение FOUND_ROWS() будет лишь приблизительным;
  • Если в UNION не присутствует LIMIT , то SQL_CALC_FOUND_ROWS игнорируется и возвращается количество строк во временной таблице, которая создается для выполнения UNION .

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

02.05.2012, 22:26

Постраничный вывод
Привет. Вот код постраничного вывода записей, оно то работает, но выводит только записи на.

Постраничный вывод
Здравствуйте, у меня есть постраничный вывод, вот его скрипт: $num_item_pages_list = $armory;.

Постраничный вывод
Добрый вечер. Пишу сайт, нужен постраничный вывод новостей, погуглил, не нашел не чего.

Постраничный вывод из бд
Имеенся менюшка — Категория_1 view_cat.php?cat=1 — Категория_2 view_cat.php?cat=2 — Категория_3.

Постраничный вывод
Всем добрый день! Есть код постраничного вывода из БД, все работает, но при нажатии на следующую.

Постраничная навигация php: простой скрипт

С проблемой создания постраничной навигации на языке php сталкиваются многие новички-программисты и не все понимают, как она должна работать. Рассмотрим подробно и по пунктам, как создать самую простую пагинацию.

Для начала представим, что у нас уже есть запрос, который в нужном формате выводит все записи из нужной таблицы.

Разбиваем страницы на нужное количество

Мы получили все записи на странице, но теперь их нужно разбивать. Для разбития на страницы мы добавим в наш запрос — вывод определённого количества записей, с помощью «LIMIT».

  • «$art» — показывает с какой записи выводить;
  • «$kol» — количество записей для вывода.
Мастер Йода рекомендует:  Преимущества покупки собственного сервера

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

К примеру, мы выводим по две записи на страницу, то есть если мы находимся на 1 странице — выводим первые две записи.

Переменную $art мы получаем по формуле — количество записей умножаются на текущую страницу, тем самым мы получаем последнюю запись на текущей странице. И вычитаем «количество записей на страницу».

Определяем страницу, на которой находимся

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

Мы получаем текущую страницу через переменную $_GET, а если мы этой переменной нет, то у нас по умолчанию первая страница.

Формируем постраничную навигацию

Для формирования и вывода пагинации нам нужно узнать количество всех записей, найдём это через простой запрос:

Затем нужно узнать, сколько у нас будет страниц:

Делим количество записей на количество выводимых на страницу и округляем до большего числа

Теперь у нас есть всё, чтобы сформировать наши ссылки для навигации, выведем через цикл:

«Постраничный вывод на PHP»

На форуме CodeNet.Ru неоднократно задавали вопрос о том, как сделать постраничный вывод на PHP. Я объяснял, что такое LIMIT, и как его использовать в MySql.

Но все время оказывалось, что вопрос касался только навигации по страницам:

Вот универсальная процедура, выводящая такой блок ссылок:

  • $records — всего записей
  • $r_start — текущая страница
  • $URL — адрес, заканчивающийся на «=»
  • $inpage — записей на страницу

Оставить комментарий

Комментарии

Привет всем помогите сделать постраничный вывод для гостевой
Это сам вывод с гостевой как его разбить постранично потому что много собирается
у тех примерах я шотоникак немогу разобраться молодой в этом деле

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

[php]
function LeftRight($records,$r_start,$URL,$inpage) <
$str=»»;

if($records =5 and $r_start ($page_count-5)) <
$sstart=$page_count-10;
$send=$page_count;
>

if($sstart $records) $send=[highlight]$page_count[/highlight];


#Выводим список ссылок
for($i=$sstart;$i $page_count or $r_start «.LeftRight($records,r_start,»index.php?start=»,$inpage).» «;
[/php]

/* печатаем единичную ссылку на страницу */

function print_navigation_link ($page_number) <

/* печатаем навигационную полосу */

for ($i=0;$i navig_len;$i++) <

* Класс поддержки навигации информации по страницам.

* Конструктору передается информация , он разбивает ее по страницам.

* @author : Barinov Roman

* @date created : 16.08.2007

* @date modifyed : no

function page_navigation_maker ( $data_income, $step ) <

$this->page_counter = ceil($this->array_len / $this->page_len) ;

/* Получаем страницу длиной в $this->data_step , под номером $page_number */

function get_page ( $page_number ) <

$start_position = ($this->page_len * $page_number);

for ($i=0;$i page_len;$i++) <

if (isset($this->in_array[$i + $start_position])) $arr[] = $this->in_array[$i + $start_position];

/* Получаем количество страниц в списке */

/* Получаем количество Элементов списка */

/* Получаем количество элементов текущего листа */

return ($this->current_page_number) * $this->page_len;

$navig_panel = new page_navigation_printer($page_counter,$_SERVER[‘PHP_SELF’]);

echo »

«;

while ($i get_current_length()) <

echo »

«;

А воттак даже чють быстрее получается и без избыточности и перехлесте условий

if ($records%$inpage==0) $add=0; else $add=1;

if ($r_start =5 and $r_start ($ggg-5)) <

if ($records%$inpage==0) $add=0; else $add=1;
$ggg=(intval($records/$inpage)+$add);

Код конечно хороший но у меня почему-то на второй странице выводит вместо 10 указаных на страницу 20.

может я неправиьлно делаю цикл вывода while($list=mysql_fetch_array($list_result)).

$page_posts = 10; // Количество файлов на страницу

$query=»SELECT something FROM table LIMIT

2Fluffy Fear
проше так $str = substr($str, 0, -3);

Заметил в коде как минимум 2 недоделки.

1-я(эстетичская):
После начальных » =5)

В ORACLE нет ключевого слова LIMIT. Как «выкрутиться» из этого положения:

SELECT t1.rn, t1.col1 FROM
(
SELECT rownum rn, col1 FROM Table1
) t1
WHERE t1.rn BETWEEN 11 AND 20;

Подробнее написано здесь:
https://www.arrowsent.com/oratip/tip41.htm

но если нужно выбрать много колонок, то проще так:

SELECT * FROM
(
SELECT rownum rn, col1, col2, col3 FROM table
WHERE rownum = 11;

Примечание: в последнем варианте сортировку (ORDER BY) нельзя выносить за скобки (т.е. во внешний запрос), иначе сортировка будет неправильной.

Постраничный вывод на PHP

Когда-нибудь (конечно, если у вас есть сайт на PHP и MySQL) вам понадобится вывести все записи из базы данных. Ведь, например, выводить по 100 постов на одной странице крайне неразумно, поэтому следует сделать на сайте постраничный вывод записей из базы данных.

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

Например, чтобы вывести 10 записей из таблицы data , начиная с 10-й записи, следует писать так:

Страница нашего сценария будет называться viewpost.php. Переменная $str будет содержать значение нужной страницы.

Данные будем выводить из таблицы data . Структурируем вывод данных следующим образом: будем выводить краткое описание ( description ) и заголовок ( title ).

Конечно, для того чтобы все это выводилось приемлемо нужно будет сгруппировать элементы с помощью HTML и CSS. Хотя для моего примера все просто.

Помогите сделать постраничный вывод php mysql [закрыт]

Помогите пожалуйста сделать постраничную навигацию, 4 примера уже попробовал не получается

Закрыт по причине того, что не по теме участниками Dmitriy Simushev, zRrr, cheops, Nicolas Chabanovsky ♦ 13 май ’16 в 7:01 .

Похоже, этот вопрос не соответствует тематике сайта. Те, кто голосовал за его закрытие, указывали следующую причину:

  • «Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.» – Dmitriy Simushev, zRrr, cheops

Если вопрос можно переформулировать согласно правилам, изложенным в справке, отредактируйте его.

2 ответа 2

Самое простое, что можно использовать для постраничного вывода — это LIMIT . Как будто для этого и сделан.

$offset — Самый главной и сложный параметр в этом деле. Он определяет какая страница будет выведена в HTML.
Сервер БД пропускает первые $offset строк(и), выбранных запросом и начинает выдачу результатов, начиная со строки номер $offset + 1 .
$page_size — количество записей на странице. наверное то же, что Ваш $users_on_page .
Сервер выдаст в результате не более этого количества строк.

Важно чтобы был ORDER BY . Порядок должен быть, чтобы не случалось такого, что одни и те же строки будут то на первой, то на десятой странице.

Номер страницы вычисляется по $offset и $page_size :
$page_number = $offset % $page_size . Вроде так.
Можно и по номеру страницы определить требуемый offset:
$offset = ($page_number — 1) * $page_size Количество страниц получают из запроса $countQuery и $page_size :
$page_count = ($count / $page_size) + (($count % $page_size) == 0 ? 0 : 1)

Формируются необходимые кнопки/ссылки навигации. $page_number (от 1 до $page_count ) используется в названии. Надо же как-то показать номер страницы.
Вычисленный $offset используется как параметр, который будет передан обратно на сервер при нажатии на кнопку.
В Вашем примере нет никаких элементов навигации по страницам и я не будут ничего придумывать. Идея и так ясна.

Функции постраничного вывода в PHP

При закрытии подписчики были переданы в рассылку «Как сделать популярный сайт.» на которую и рекомендуем вам подписаться.

Вы можете найти рассылки сходной тематики в Каталоге рассылок.

Статистика

PHP для начинающих Функции постраничного вывода в PHP

Номер строки Значение
«.$pp.» «.$page_array[$i].»
Как читать RSS:
RSS Reader
— для PC Windows
NewsCopier
— для КПК Windows Mobile
FoCuS
— для мобильного телефона
Hand/RSS
— для Palm OS
Другие программы.

Каталог RSS:
что такое RSS?
Компьютеры/Интернет
Безопасность, Блоги/Форумы, Дизайн, Каталоги, Компьютерная техника, Обзоры/Новости, Персональные страницы, Провайдеры, Программирование, Программы, Сервисы

Скачать файлы:

Музыка
Мелодии для мобильных

Изображения
Видео
Игры
Программы

Онлайн игры:
Здравствуйте уважаемые читатели, сегодня хотелось бы обсудит проблему постраничного вывода в PHP и привести возможные пути решения. В этой статье я приведу довольно уникальную функцию с точки зрения её возможностей.

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

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

Вы видите, что функция имеет два входных параметра $start — точка выборки из базы данных и $count — количество данных, в файле либо в базе данных. Эта функция самая простая, так что на неё мало надежды при использовании на крупных сайтах где много информации.

Рассмотрим более сложную функцию, но имеющую больше функциональности.

function PagePrint ( $variable ) <
global $beginPage , $endPage ; //——Объявляем глобальные переменные, отвечающие за ссылку на первую и последнюю страницу
$href = » ; //——Перемменная содержащая в себе постраничный вывод
$separator = ‘ ‘ ; //——Переменная задающая разделитель между ссылками, по умолчанию пробел
$style = ‘style=»»text-decoration:none»» style=»»color:orange»» style=»»font-weight:bold»»‘ ; //——-Задаёт стиль текущей страницы
$stylePage = ‘style=»»text-decoration:none»» style=»»color:blue»» style=»»font-weight:bold»»‘ ; //——Задаёт стиль ссылки на первую и последнюю страницу
if( is_array ( $variable )): //——Проверяем тип array
#Перебираем массив и присваиваем $number — количество записей, $start — точка извлечения, $pageCount — количество записей, $andere — другие свойства ссылки, $class — стиль для ссылок, $showLink — количество ссылок на странице
list( $number , $start , $pageCount , $andere , $class , $showLink )= $variable ;
#Обрабатывам $start
if(empty( $start ) && ! is_int ( $start ) && ! is_numeric ( $start )) $start = 0 ;
else $start = $start ;
#Обрабатываем $number
if(empty( $number ) && ! is_int ( $number ) && ! is_numeric ( $number )) $number = 10 ;
else $number = $number ;

$page =(( $start / 10 )+ 1 ); //——-Рассчитывавем номер страницы
$count = ceil ( $pageCount / $number ); //——Количество страниц

#Вывод сслыки на первую и последнюю страницы
if( $count !== 1 ) :
$beginPage = » ? start = 0 «.$andere.»» » . $stylePage . «>перв» ; //———Первая страница
$endPage = » ? start = «.(($count-1)*10).$andere.»» » . $stylePage . «>посл» ; //——Последняя страница
else: FALSE ;
endif;

if( $pageCount == 10 ): return False ;
else:
#Постраничный вывод
$begin = $page — intval ( $showLink / 2 ); //——Определяет номер страницы с которой выводить
for( $j = 0 ; $j $showLink ; $j ++):
$i = $begin + $j ; //——Номер страницы
#Защищает скрипт если $ if( $i 1 ):
$showLink ++;
continue;
endif;
#Постраничный вывод
if( $i > $count ) break; //——Защита если количество $i>возможных записей
if( $i == $page ) $href = $href . » . $style . » >» . $i . «» ; //——Вывод текущей страницы
else $href = $href . » ? start = «.(($i — 1)*10).$andere.»» » . $class . «>» . $i . » » ; //——Вывод следующих страниц
endfor;
return $href ;
endif;
endif;
>

Входным параметром функции является массив из шести элементов:


$number — количество отображаемых сообщений на странице
$start — точка извлечения из базы данных, т.е номер сообщения с которого начинается зивлечение данных
$pageCount — общее количество записей, т.е сколько всего содержит база записей
$andere — другие параметры ссылки, будь то новые переменные или что-либо ещё
$class — данный параметр задаёт внешний вид ссылок, т.е ссылки на страницы
$showLink — количество ссылок на странице
Первый параметр может быть передан через метод @$_GET[‘number’], только в том случае, если Вы захотите чтобы пользователь мог изменять количество сообщений на странице.
Второй параметр обязательно передаётся в массив методом @$_GET[‘start’], так как параметр $start всё время меняется когда пользователь кликает по ссылке на страницу.

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

Как Вы можете видеть функция сильно расширяет возможности при создании постраничного вывода. Теперь Вы можете разместить свой постраничный вывод на маленьком участке страницы, регулируя количество отображаемых ссылок параметром $showLink. Всё это удобно при создании галлерей, поиска по каталогу сайта или чего-нибудь ещё.
Ниже будут приведены примеры вызова функции:

PagePrint(», @$_GET[‘start’], 90, », », 10) — Всего записей в базе 90, постраничный вывод будет отображать по десять ссылок

PagePrint(@$_GET[‘number’], @$_GET[‘start’], 90, », », 10) — Всего записей в базе 90, постраничный вывод будет отображать по десять ссылок и есть возможность изменять количество отображаемых записей на странице

PagePrint(@$_GET[‘number’], @$_GET[‘start’], 90, ‘&category=1’, », 10) — Всего записей в базе 90, постраничный вывод будет отображать по десять ссылок, есть возможность изменять количество отображаемых записей на странице и ссылка передаёт дополнительную переменную category со значением 1

PagePrint(@$_GET[‘number’], @$_GET[‘start’], 90, ‘&category=1’, ‘style=»»color:black»»‘, 10) — Всего записей в базе 90, постраничный вывод будет отображать по десять ссылок, есть возможность изменять количество отображаемых записей на странице, ссылка передаёт дополнительную переменную category со значением 1 и ссылки на странице будут чёрного цвета.
Надеюсь приведённые ниже объяснения и комментарии внутри функции помогут разобраться Вам с принципом работы функции.

Вывод функций в PHP как общеукрепляющее средство

Дата публикации: 2020-08-30

От автора: мужики! Женщины готовят против нас «подлый» заговор! Путем ласки, нежности и любви они заставляют делать мужчин необдуманные поступки: дарить им цветы, баловать конфетами и покупать красивые вещи. Для достижения своих «злостных» целей девушки применяют различные гастрономические «изыски»: вкусные борщи, котлеты и блинчики. Единственным «противоядием» против женских ухищрений являются серверные языки программирования. Сегодня мы повысим резистентность «слабых» мужских организмов путем рассмотрения вывода данных функций PHP.

Echo и другие

Основной функцией PHP для вывода строковых данных является echo. Простой пример вывода строки:

Постраничный вывод на PHP при использовании MySQL

Для начала немного теории. Что надо сделать? Сначала, надо проверить выбрана ли страница просмотра. Потом надо подсчитать откуда выводить записи. Делается это просто: текущую страницу умножаем на количество записей на страницу. Наконец, надо сделать SQL-запрос к базе данных и вывести результат. И в конце концов написать нивигацию.

Приступим. Выполните SQL-запрос:

Я предлагаю все оформить в виде функций обработчиков. Создадим функцию page(), которая обрабатывает данные о запрошенном номере страницы:

Что она делает? Проверяет выбрана ли страница и если в ней присутствуют буквы, то выводит сообщение об ошибке. Далее сделаем SQL-запрос:

С функциями покончили! Как ими пользоваться?

PHP: Новый тип навигационной системы при постраничном выводе

Оглавление

Введение

Практически каждый разработчик сталкивался с необходимостью постраничного вывода информации. Каким бы ни был проект, в нем всегда есть «что-то», что не помещается на одну страницу: авторские стихи в маленькой домашней страничке или архив новостей в информационном портале. И каждый раз, когда мы создаем механизм поиска «Первой страницы», «Следующей страницы», «Предыдущей страницы», мы занимаемся рутинной работой. Каждый раз, когда мы в очередной раз переделываем готовую функцию постраничного вывода под новый интерфейс, мы напрасно теряем время. Однако, как правило, попытки создать какую-то единую универсальную функцию постраничного вывода наталкивались на то, что постраничный вывод тесно связан с контекстом. Эту связь можно разделить по степени важности на два уровня:

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

Проблема, связанная с организацией внешнего вида (второстепенная проблема). В каждом проекте свой метод вывода информации. Это касается не только внешнего вида постраничных переходов (это может быть кнопка, которая переходит от страницы к странице с помощью метода POST; это может быть ссылка, которая формирует GET-овую строку запроса; и др.), но и способа хранения данных (кнопка или ссылка может формироваться динамически, «на лету»; это может быть шаблон, хранящийся в БД, и др.)

Невозможно создать универсальную систему постраничного вывода (читай: независимую от контекста), если невозможно разделить постраничный вывод и контекст. Причем не заниматься этим «разделением» в каждом проекте, а сделать это один раз, создав универсальную систему, и затем просто использовать ее. Всё это приводит нас к следующему разделу:

Цели и задачи

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

Однако, прежде, чем начинать обсуждение чего-либо, хотелось бы «сверить часы»: объяснить значение терминов, используемых в этой статье, создать своеобразный терминологический словарь:

Словарь терминов

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

Постраничный просмотр — способ вывода запрошенной пользователем информации по частям. Каждый постраничный просмотр имеет собственные параметры деления информации на части (например, можно выводить информацию о каждой неделе или о каждом дне текущего месяца). При постраничном просмотре может быть видима информация только одной выбранной части. Эти части называются «страницами».

Страница — часть информации, выводимая на при постраничном просмотре, в соответствии с заданными параметрами деления информации на страницы.

Навигационная система или система постраничного вывода — это набор кнопок или ссылок, позволяющих пользователю осуществить постраничный просмотр (см. пример N1).

Пример 1. Простейшая неграфическая навигационная система

Первая страница Предыдущая страница 4 5 6 7 8 9 Следующая страница Последняя страница

Активная страница — страница, содержимое которой в данный момент просматривает пользователь. В примере N1 активной является седьмая (7) страница.

Навигационная ссылка — кнопка или ссылка (в зависимости от реализации), с помощью которой пользователь может «пролистать» на ту страницу, которая в данный момент не является активной. В примере N1 страницы 4-6, 8-9, «Первая страница», «Предыдущая страница», «Следующая страница», «Последняя страница» являются навигационными ссылками.

Строка в формате md5 — строка, содержащая параметры системы постраничного вывода, однако сформированная таким образом, чтобы внешне походить на md5-строки, генерируемые функцией md5(). См. пример N2.

Основная идея

Основная идея, изложенная в этой статье, проста: если очень сложно (практически невозможно) отделить контекст от параметров постраничного вывода, то нужно попробовать использовать другой внешний вид этих параметров при передаче их в навигационных ссылках. Как правило, все системы постраничного вывода обладают несколькими основными параметрами, а именно:

  1. Количество элементов
  2. Номер активной страницы
  3. Количество навигационных ссылок
  4. Количество элементов на активной странице

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

  1. Количество элементов
  2. Номер активной страницы

Тому есть 2 причины: во-первых, наши рассуждения могут быть легко распространены на два других параметра; во-вторых, это не будет отвлекать нас в процессе рассуждений.

Теперь изложим нашу идею более подробно для системы постраничного вывода с двумя основными параметрами: поскольку оба параметра — количество элементов и номер активной страницы — являются целыми неотрицательными числами, наиболее оптимальные решением было бы передавать их в виде специально сформированной строки, например, abcd2as15ks2sdm3 (См. пример N2)

Пример 2. Общий вид специально отформатированной строки,
объединяющей оба основных параметра системы постраничного вывода

abcd 2 as 15 ks 2sdm3
«Маскирующая» часть 1 Номер активной страницы «Разделяющая» часть 2 Общее число элементов «Разделяющая» часть 3 «Маскирующая» часть 4
Необязательная часть. Мы сами определим, как она должна выглядеть. Целое число ≥ 0 Разделитель-«не цифра» (например, буквы латинского алфавита) Целое число ≥ 0 Разделитель-«не цифра» (например, буквы латинского алфавита) Необязательная часть. Мы сами определим, как она должна выглядеть.

Создание строки в формате md5

Итак, давайте подробней обсудим, как будет формироваться наша cтрока в формате md5. Конечно, можно использовать любой другой алгоритм ее формирования, и необязательна эта строка должна быть похожа на md5-строку. И, конечно же, наш способ приведен исключительно в качестве примера. Мы предлагаем формировать строку в формате md5 с учетом следующих условий:

Будем использовать «маскирующую» часть 1 фиксированной длины в 5 символов; для этого сгенерируем с помощью функции md5() строку и будем использовать ее первые 5 символов:

Будем использовать «разделяющую» часть 2 фиксированной длины в 3 символа, который будем случайным образом выбирать из заранее определенной строки $t_str :

Аналогично «разделяющей» части 2, найдем «разделяющую» часть 3:

Теперь совместим все части вместе. Получим результирующую строку вида: где

  • $part_1 — «маскирующая» часть 1, полученная на шаге 1;
  • $curindex — номер текущей страницы;
  • $part_2 — «разделяющая» часть 2, полученная на шаге 2;
  • $total — общее число элементов
  • $part_3 — «разделяющая» часть 3, полученная на шаге 3.

Длина нашей строки $res , полученной на шаге 4, может быть меньше, чем 32 символа, и поэтому, поскольку мы создаем строку в формате md5, сгенерируем с помощью функции md5() еще одну, «дополняющую» строку и будем использовать ее для «дополнения» до 32-х символов нашей строки $res . Для этого воспользуемся функцией str_pad(): где функция str_pad() принимает следующие параметры (более подробно — см. описание функции на сайте https://www.php.net):

  • $res — результирующая строка, полученная на шаге 4;
  • GENERAL_LENGTH — длина строки, которая будет сравниваться с длиной строки $res ; если длина строки $res меньше, чем GENERAL_LENGTH, то наша строка $res будет дополнена в соответствии с последующими двумя параметрами до длины GENERAL_LENGTH;
  • md5(uniqid(mt_rand())) — случайным образом сгенерированная строка в формате md5, которая будет использоваться до «дополнения» нашей строки $res до длины GENERAL_LENGTH;
  • STR_PAD_RIGHT — означает, что «дополняющая» строка будет добавляться к нашей строке $res справа.

Оформим формирование строки в формате md5 в виде отдельной функции:

Итак, основная идея нами реализована : мы создали функцию, позволяющую «прятать» параметры системы постраничного вывода внутрь одной, специального вида строки. Какие преимущества нам это дает? Поскольку теперь наша система постраничного вывода характеризуется всего одним параметром, то это даст нам возможность встраивать систему постраничного вывода в контекст, а не наоборот, как это было раньше. Осталось только реализовать класс, который позволил бы принимать эту специального вида строку и преобразовывать ее в соответствующие параметры навигационной системы.

Описание класса

Мы создадим базовый класс, в котором присутствуют всего 2 функции: конструктор и инициализация основных параметров системы постраничного вывода по заранее данной строке специального формата.

Мы используем именно класс, хоть это и несколько замедлит выполнение скрипта, для того чтобы иметь возможность использовать несколько систем постраничного вывода одновременно (например, постраничный вывод новостей еженедельно и постраничный вывод новостей ежедневно внутри каждой выбранной недели) без каких-либо особых осложнений. Описание класса приведено ниже:

Класс содержит две переменных: общее число элементов и номер активной страницы.

Конструктор класса инициализирует «пустой» набор элементов (это предоставит возможность инициализировать экземпляр класса несколько раз):

Прежде, чем анализировать заданную строку в формате md5, исключим из нее «маскирующую» часть 1:

Проанализируем заданную строку в формате md5 с помощью функции preg_split() (более подробно — см. описание функции на сайте https://www.php.net): где

    ‘/[^0-9]/si’ — образец, позволяющий выделить из строки $str те ее части, которые состоят только из цифр; например, если то результатом выполнения функции будет массив значений:

$str — заданная строка в формате md5;

3 — специальный параметр функции preg_split(), которая говорит, что нужно анализировать только первых три (3) совпадения в заданной строке $str ;например, если то результатом выполнения функции будет массив значений:

PREG_SPLIT_NO_EMPTY — специальный параметр, который позволяет выводить только непустые строки, которые соответствуют заданному шаблону поиска.

Поскольку функция preg_split() возвращает в качестве результата массив значений, то наиболее удобно использовать функцию list() обработки результатов — запишем первое полученное число во временную переменную $curpage , а второе — во временную переменную $total (этот порядок определяется способом формирования строки в формате md5 с помощью функции » makeSecureParam «):

Чтобы исключить всевозможные «неожиданности», преобразуем полученные результаты к целым неотрицательным числам, а результат запишем в соответствующие переменные нашего класса:

Оформим анализ строки в формате md5 в виде функции init , которая позволит выделить из данной строки необходимые параметры навигационной системы: общее число элементов и номер активной страницы.

Итоги

Статья может быть полезной любому человеку, знакомому с синтаксисом РНР и владеющему по крайней мере начальным опытом программирования на РНР. В этой статье нет готовых рецептов. В ней изложен метод решения, которым каждый может воспользоваться. Главной идеей является «сокрытие» всех параметров навигационной системой внутри одной строки специального формата (в приведенном примере используется формат «а-ля md5» 🙂 ). Представлена функция, формирующая строку в формате md5, и базовый класс, позволяющий инициализировать параметры навигационной системы по заданной строке в формате md5. Преимущества данного метода:

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

Полностью работающий текст класса и функции, описанных в этой статье, можно скачать здесь: code.zip

Copyright &copy 2002 by Felenka.

Добавить комментарий