Разбиение по страницам в PHP с помощью MySQL

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

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

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

  • php_pagination/
    • class.php
    • php
    • php

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

Следующий 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.
<?php /** * CodexWorld * * Этот класс помогает интегрировать разбиение на страницы в PHP. * * @class Pagination * @author CodexWorld * @link http://www.codexworld.com * @license http://www.codexworld.com/license * @version 1.0 */ class Pagination{ protected $baseURL = ''; protected $totalRows = '';   protected $perPage      = 10;     protected $numLinks     =  2;     protected $currentPage  =  0;     protected $firstLink    = 'Первая';     protected $nextLink     = 'Следующая &raquo;';     protected $prevLink     = '&laquo; Предыдущая';     protected $lastLink     = 'Последняя';     protected $fullTagOpen  = '<div class="pagination">';     protected $fullTagClose = '</div>';     protected $firstTagOpen = '';     protected $firstTagClose= '&nbsp;';     protected $lastTagOpen  = '&nbsp;';     protected $lastTagClose = '';     protected $curTagOpen   = '&nbsp;<b>';     protected $curTagClose  = '</b>';     protected $nextTagOpen  = '&nbsp;';     protected $nextTagClose = '&nbsp;';     protected $prevTagOpen  = '&nbsp;';     protected $prevTagClose = '';     protected $numTagOpen   = '&nbsp;';     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=': '&amp;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.'<a href="'.$firstPageURL.'">'.$this->firstLink.'</a>'.$this->firstTagClose;         }         // Выводим ссылку на предыдущую страницу if($this->currentPage != 1){             $i = ($uriPageNum - 1);             if($i == 0) $i = '';             $output .= $this->prevTagOpen.'<a href="'.$this->baseURL.$i.'">'.$this->prevLink.'</a>'.$this->prevTagClose;         }         // Выводим цифровые ссылки for($loop = $start -1; $loop <= $end; $loop++){             $i = $loop;             if($i >= 1){                 if($this->currentPage == $loop){                     $output .= $this->curTagOpen.$loop.$this->curTagClose;                 }else{                     $output .= $this->numTagOpen.'<a href="'.$this->baseURL.$i.'">'.$loop.'</a>'.$this->numTagClose;                 }             }         }         // Выводим ссылку на следующую страницу if($this->currentPage < $numPages){             $i = ($this->currentPage + 1);             $output .= $this->nextTagOpen.'<a href="'.$this->baseURL.$i.'">'.$this->nextLink.'</a>'.$this->nextTagClose;         }         // Выводим ссылку на последнюю страницу if(($this->currentPage + $this->numLinks) < $numPages){             $i = $numPages;             $output .= $this->lastTagOpen.'<a href="'.$this->baseURL.$i.'">'.$this->lastLink.'</a>'.$this->lastTagClose;         }         // Удаляем двойные косые         $output = preg_replace("#([^:])//+#", "\1/", $output);         // Добавляем открывающий и закрывающий тэги блока         $output = $this->fullTagOpen.$output.$this->fullTagClose;                  return $output;             } }

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

<?php //подключаем файл класса pagination include_once 'Pagination.class.php'; //инициализируем класс $pagConfig = array(     'baseURL'=>'http://localhost/php_pagination/index.php',     'totalRows'=>$rowCount,     'perPage'=>$limit ); $pagination =  new Pagination($pagConfig); ?>

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

<!-- отображаем ссылки на страницы --> <?php echo $pagination->createLinks(); ?>

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

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

<?php // Конфигурация базы данных $dbHost     = "localhost"; $dbUsername = "root"; $dbPassword = "*****"; $dbName     = "codexworld"; // Создаём соединение с базой данных $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName); // Проверяем соединение if ($db->connect_error) {     die("Connection failed: " . $db->connect_error); } ?>

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

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

<?php //включаем файл класса pagination include_once 'Pagination.class.php'; //включаем файл конфигурации базы данных include_once 'dbConfig.php'; $limit = 5; $offset = !empty($_GET['page'])?(($_GET['page']-1)*$limit):0; //получаем число записей $queryNum = $db->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){ ?>     <div class="posts_list">     <?php while($row = $query->fetch_assoc()){ ?>         <div class="list_item"><a href="javascript:void(0);"><?php echo $row["title"]; ?></a></div>     <?php } ?>     </div>    <!-- отображаем ссылки на страницы -->     <?php echo $pagination->createLinks(); ?> <?php } ?>

Заключение

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

Скачать исходный код Посмотреть просмотр

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *