Php pagination one query

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

Пагинация PHP позволяет разделять данные по частям и получить ссылки на страницы. В этом руководстве мы расскажем, как создать простое разбиение на страницы в PHP и MySQL . Чтобы обеспечить повторное использование скрипта, мы создадим класс Pagination .

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

Перед тем, как мы начнём, взгляните на структуру файлов проекта.

Создание таблицы базы данных

Следующий SQL-запрос создаёт таблицу posts в базе данных MySQL с основными столбцами.

CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=Active, 0=Inactive', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Класс Pagination

Класс Pagination генерирует ссылки на страницы. Для настройки вида ссылок доступны различные параметры конфигурации PHP пагинации страниц.

  • $baseURL–URL веб-страницы.
  • $totalRows–общееколичествоэлементов.
  • $perPage–количествозаписейнастранице.
  • $numLinks–количествоотображаемыхссылок.
  • $firstLink–текстссылкинапервуюстраницу.
  • $nextLink–текстссылкинаследующуюстраницу.
  • $prevLink–текстссылкинапредыдущуюстраницу.
  • $lastLink–текстссылкинапоследнююстраницу.
  • $fullTagOpen–открывающийтэгблокассылок.
  • $fullTagClose–закрывающийтэгблокассылок.
  • $firstTagOpen–открывающийтэгпервогоэлемента.
  • $firstTagClose–закрывающийтэгпервогоэлемента.
  • $lastTagOpen–открывающийтэгпоследнегоэлемента.
  • $lastTagClose–закрывающийтэгпоследнегоэлемента.
  • $curTagOpen–открывающийтэгтекущегоэлемента.
  • $curTagClose–закрывающийтэгтекущегоэлемента.
  • $nextTagOpen–открывающийтэгследующегоэлемента.
  • $nextTagClose–закрывающийтэгследующегоэлемента.
  • $prevTagOpen–открывающийтэгпредыдущегоэлемента.
  • $prevTagClose–закрывающийтэгпредыдущегоэлемента.
  • $numTagOpen–открывающийтэгчисловогоэлемента.
  • $numTagClose–закрывающийтэгчисловогоэлемента.
  • $showCount–показыватьколичествостраниц.
  • $queryStringSegment–флагстрокизапросастраницыпри пагинации PHP MySQL .
'; protected $fullTagClose = '
'; protected $firstTagOpen = ''; protected $firstTagClose= ' '; protected $lastTagOpen = ' '; protected $lastTagClose = ''; protected $curTagOpen = ' '; protected $curTagClose = ''; protected $nextTagOpen = ' '; protected $nextTagClose = ' '; protected $prevTagOpen = ' '; protected $prevTagClose = ''; protected $numTagOpen = ' '; protected $numTagClose = ''; protected $showCount = true; protected $currentOffset= 0; protected $queryStringSegment = 'page'; function __construct($params = array()) < if (count($params) >0)< $this->initialize($params); > > function initialize($params = array()) < if (count($params) >0) < foreach ($params as $key =>$val)< if (isset($this->$key))< $this->$key = $val; > > > > /** * Генерируем ссылки на страницы */ function createLinks()< // Если общее количество записей 0, не продолжать if ($this->totalRows == 0 || $this->perPage == 0) < return ''; >// Считаем общее количество страниц $numPages = ceil($this->totalRows / $this->perPage); // Если страница только одна, не продолжать if ($numPages == 1)< if ($this->showCount)< $info = 'Showing : ' . $this->totalRows; return $info; >else < return ''; >> // Определяем строку запроса $query_string_sep = (strpos($this->baseURL, '?') === FALSE) ? '?page=' : '&page='; $this->baseURL = $this->baseURL.$query_string_sep; // Определяем текущую страницу $this->currentPage = $_GET[$this->queryStringSegment]; if (!is_numeric($this->currentPage) || $this->currentPage == 0)< $this->currentPage = 1; > // Строковая переменная вывода контента $output = ''; // Отображаем сообщение о ссылках на другие страницы if ($this->showCount)< $currentOffset = ($this->currentPage > 1)?($this->currentPage - 1)*$this->perPage:$this->currentPage; $info = 'Показаны элементы с ' . $currentOffset . ' по ' ; if( ($currentOffset + $this->perPage) < $this->totalRows ) $info .= $this->currentPage * $this->perPage; else $info .= $this->totalRows; $info .= ' из ' . $this->totalRows . ' | '; $output .= $info; > $this->numLinks = (int)$this->numLinks; // Если номер страницы больше максимального значения, отображаем последнюю страницу if($this->currentPage > $this->totalRows)< $this->currentPage = $numPages; > $uriPageNum = $this->currentPage; // Рассчитываем первый и последний элементы $start = (($this->currentPage - $this->numLinks) > 0) ? $this->currentPage - ($this->numLinks - 1) : 1; $end = (($this->currentPage + $this->numLinks) < $numPages) ? $this->currentPage + $this->numLinks : $numPages; // Выводим ссылку на первую страницу if($this->currentPage > $this->numLinks)< $firstPageURL = str_replace($query_string_sep,'',$this->baseURL); $output .= $this->firstTagOpen.''.$this->firstLink.''.$this->firstTagClose; > // Выводим ссылку на предыдущую страницу if($this->currentPage != 1)< $i = ($uriPageNum - 1); if($i == 0) $i = ''; $output .= $this->prevTagOpen.'baseURL.$i.'">'.$this->prevLink.''.$this->prevTagClose; > // Выводим цифровые ссылки for($loop = $start -1; $loop = 1)< if($this->currentPage == $loop)< $output .= $this->curTagOpen.$loop.$this->curTagClose; >else< $output .= $this->numTagOpen.'baseURL.$i.'">'.$loop.''.$this->numTagClose; > > > // Выводим ссылку на следующую страницу if($this->currentPage < $numPages)< $i = ($this->currentPage + 1); $output .= $this->nextTagOpen.'baseURL.$i.'">'.$this->nextLink.''.$this->nextTagClose; > // Выводим ссылку на последнюю страницу if(($this->currentPage + $this->numLinks) < $numPages)< $i = $numPages; $output .= $this->lastTagOpen.'baseURL.$i.'">'.$this->lastLink.''.$this->lastTagClose; > // Удаляем двойные косые $output = preg_replace("#([^:])//+#", "\1/", $output); // Добавляем открывающий и закрывающий тэги блока $output = $this->fullTagOpen.$output.$this->fullTagClose; return $output; > >

Простой пример использования класса пагинации PHP . Сначала включите и инициализируйте класс Pagination с некоторыми базовыми настройками.

'http://localhost/php_pagination/index.php', 'totalRows'=>$rowCount, 'perPage'=>$limit ); $pagination = new Pagination($pagConfig); ?>

Чтобы отобразить ссылки на страницы, используйте метод createLinks() .

Читайте также:  Knowledge allbest ru economy 0 html

Конфигурация базы данных (dbConfig.php)

Файл dbConfig.php используется для соединения с MySQL и выбора базы данных для пагинации PHP . Укажите параметры хост ( $dbHost ), имя пользователя ( $dbUsername ), пароль ( $dbPassword ), и имя базы данных ( $dbName ) в соответствии с требованиями вашего сервера баз данных.

connect_error) < die("Connection failed: " . $db->connect_error); > ?>

Отображение данных с разбиением на страницы (index.php)

В файле index.php ограниченный набор постов будет запрашиваться из базы данных, и отображаться вместе со ссылками на другие страницы. Для PHP пагинации страниц нужно создать объект класса Pagination и передать базовые параметры, чтобы сгенерировать ссылки на страницы. Чтобы отобразить ссылки, используйте метод createLinks() .

query("SELECT COUNT(*) as postNum FROM posts"); $resultNum = $queryNum->fetch_assoc(); $rowCount = $resultNum['postNum']; //инициализируем класс pagination $pagConfig = array( 'baseURL'=>'http://localhost/php_pagination/index.php', 'totalRows'=>$rowCount, 'perPage'=>$limit ); $pagination = new Pagination($pagConfig); //получаем записи $query = $db->query("SELECT * FROM posts ORDER BY id DESC LIMIT $offset,$limit"); if($query->num_rows > 0) < ?> 
fetch_assoc()) < ?>
?>
createLinks(); ?> ?>

Заключение

Мы реализовали постраничный вывод на PHP и MySQL настолько просто, насколько это только возможно. Вы можете расширить функциональность этого класса.

Источник

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

В 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

Источник

Пагинация на PHP

простая пагинация на php

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

Подключение БД:

Первым делом как обычно нужно подключить базу данных, для этого видите этот код.

В этом коде первым делом у нас идут переменные для настройки при подключение БД, потом уже подключаемся, после пишем условии для проверки подключения базы данных, если его нет, то выводим надпись «Не удается подключиться к серверу базы данных!», и запрещаем дальше работать скрипту.

Создание пагинации на PHP:

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

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

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

Теперь нужно вычислить сколько всего мы имеем страниц.

Тут сперва мы создаём строку с SQL запросом, которое получает количество элементов в БД, потом отправляем этот запрос в базу данных, и получаем число количества , потом вычисляем сколько всего страниц, делением количеств элементов, на число данных на одной странице.

Здесь мы создаём SQL запрос и в нём после слова LIMIT назначаем от какого элемента брать и сколько, потом делаем запрос к БД, и вывод данные которые получили, закрываем соединение с MySQL.

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

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

скрипт простой пагинации на php

Если мы нажмём на кнопку «Next», то у нас переключится, вот это всё что нужно знать.

Вывод:

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

Ещё стоит сказать, что я брал код с этого сайта, по ссылке.

Источник

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