Пагинатор. Постраничный вывод данных на php

Пагинатор. Постраничный вывод данных на phpВ этой статье я приведу пример работы пагинатора — вывода записей из базы данных постранично. Для примера будем выводить новости.
Весь функционал опирается на возможность в sql делать выборку по лимиту, для этого в запрос добавляется ключевое слово — LIMIT. Limit может принимать два параметра rows и offset. Выглядеть это будет примерно так:

SELECT * FROM table LIMIT 5, 10;

В этом запросе мы достаем из таблицы table 10 записей, начиная с пятой.
Теперь применим возможности limit для написания пагинатора.
Для начала нужно создать таблицу, с тестовыми данными, можете применить этот патч:

-- создание таблицы tbl_news
CREATE TABLE IF NOT EXISTS `tbl_news` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `small_text` varchar(255) NOT NULL,
  `big_text` text NOT NULL,
  `date_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- заполнение таблицы тестовыми записями
INSERT INTO `tbl_news` (`id`, `title`, `small_text`, `big_text`, `date_create`, `is_active`) VALUES
	(1, 'Новость 1', 'короткое описание 1', 'полный текст', '2014-01-18 17:36:02', 1),
	(2, 'Новость 2', 'короткое описание', 'полный текст', '2014-01-18 17:36:02', 1),
	(3, 'Новость 3', 'короткое описание', 'полный текст', '2014-01-18 17:36:25', 1),
	(4, 'Новость 4', 'короткое описание', 'полный текст', '2014-01-18 17:36:02', 1),
	(5, 'Новость 5', 'короткое описание', 'полный текст', '2014-01-18 17:36:02', 1),
	(6, 'Новость 6', 'короткое описание', 'полный текст', '2014-01-18 17:36:50', 1),
	(7, 'Новость 7', 'короткое описание', 'полный текст', '2014-01-18 17:36:52', 1),
	(8, 'Новость 8', 'короткое описание', 'полный текст', '2014-01-18 17:36:55', 1),
	(9, 'Новость 9', 'короткое описание', 'полный текст', '2014-01-18 17:36:57', 1),
	(10, 'Новость 10', 'короткое описание', 'полный текст', '2014-01-18 17:37:01', 1),
	(11, 'Новость 11', 'короткое описание', 'полный текст', '2014-01-18 17:37:04', 1);

Теперь напишем php код, который будет отвечать за логику выборки данных и построение пагинатора:

// подключение файла, в котором осуществляется подключение к бд.
include "db_connection.php";
$countView = 5; // количество материалов на странице
// номер страницы
if(isset($_GET['page'])){
    $pageNum = (int)$_GET['page'];
}else{
    $pageNum = 1;
}
$startIndex = ($pageNum-1)*$countView; // с какой записи начать выборку
// запрос к бд
$sql = mysql_query("
    SELECT SQL_CALC_FOUND_ROWS * FROM `tbl_news` LIMIT $startIndex, $countView
") or die(mysql_error());
$newsData = array();
while($result = mysql_fetch_array($sql, MYSQL_ASSOC)){
    $newsData[] = $result;
}
// получение полного количества новостей
$sql2 = mysql_query("SELECT FOUND_ROWS()");
$result2 = mysql_fetch_array($sql2, MYSQL_ASSOC);
$countAllNews = $result2["FOUND_ROWS()"];
// номер последней страницы
$lastPage = ceil($countAllNews/$countView);

Код скрипта db_connection.php:

define("HOST", "localhost");
define("USER", "root");
define("PASSWORD", "");
define("DB_NAME", "test_db");
$db_connect = mysql_connect(HOST, USER, PASSWORD, TRUE); 
mysql_selectdb(DB_NAME,$db_connect);
mysql_set_charset('utf8');

Теперь сделаем вывод данных и пагинатора в браузере:

<style>
#work_area{
    width: 800px;
    margin: 100 auto;
}
#work_area li{
    display: inline;
    font-size: 14px;
    margin-right: 10px;
}
#work_area .current{
    border: 1px dotted;
    font-size: 18px;
    padding: 3px;
}
</style>

<div id="work_area">
    <!-- вывод новостей -->
    <?php foreach($newsData as $oneNews){ ?>
    <div class="one_news">
        <label><?=$oneNews['title'];?></label>
        <p><?=$oneNews['small_text'];?></p>
        <a href="/news.php?id=<?=$oneNews['id'];?>">Подробнее</a>
        <hr/>
    </div>
    <?php } ?>
    <br/>
    <!-- вывод пагинатора -->
    <ul>
        <?php if($pageNum > 1) { ?>
            <li><a href="/index.php?page=1">&lt;&lt;</a></li>
            <li><a href="/index.php?page=<?=$pageNum-1;?>">&lt;</a></li>
        <?php } ?>
        
        <?php for($i = 1; $i<=$lastPage; $i++) { ?>
            <li <?=($i == $pageNum) ? 'class="current"' : '';?>> <a href="/index.php?page=<?=$i;?>"><?=$i;?></a> </li>
        <?php } ?>
        
        <?php if($pageNum < $lastPage) { ?>
            <li><a href="/index.php?page=<?=$pageNum+1;?>">&gt;</a></li>
            <li><a href="/index.php?page=<?=$lastPage;?>">&gt;&gt;</a></li>
        <?php } ?>
    </ul>
</div>

Вот и все, пагинатор готов. Скачать исходники можно тут

Рассказать друзьям:


Оценить:
(8 оценок, среднее: 5,00 из 5)

Пагинатор. Постраничный вывод данных на php: 9 комментариев

  1. А нет ли примера организации пагинатора для файлов ?

    например у меня есть статья, которая представляет из себя html файл

    и мне нужно организовать постраничный вывод статьи..

    p.s. нужен пример пагинатора без СУБД

  2. Отличный и простой пагинатор, я еще новичок в php но в свой двиг впаял его как надо. Огромное спасибо за то что выложили хороший скрипт. Подскажите вот какой момент, а если на сайте 100.000 файлов, выдаст слишком много страниц, как это дело все компактно сделать?

    1. Нужно условие делать для вывода количества номеров страниц — первые 2-3 штуки, последние 2-3, активная ссылка, активная минус один и активная плюс один.
      тогда красиво получится, что-то типо такого: 1 2 3 … 6 7 8 … 500 501 502

      1. Можете пожалуйста скинуть в добавок и код с условием думаю очень многим новичкам пригодиться. Я вот искал долго пагинатор, на всех сайтах сложные замороченные а у вас самый дельный плюс еще хорошо что сразу с выводом файлов, но думаю компактность будет нелишней. Дополните пожалуйста статью если нетрудно, а то я сам поламаю свой код:-) Ищу вот еще поиск хороший на php что бы искать к примеру по titles в базе, есть у вас статьи по теме?

Добавить комментарий для ВитГо Отменить ответ

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

*

code