В этой статье я приведу пример работы пагинатора — вывода записей из базы данных постранично. Для примера будем выводить новости.
Весь функционал опирается на возможность в 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"><<</a></li>
<li><a href="/index.php?page=<?=$pageNum-1;?>"><</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;?>">></a></li>
<li><a href="/index.php?page=<?=$lastPage;?>">>></a></li>
<?php } ?>
</ul>
</div>
Вот и все, пагинатор готов. Скачать исходники можно тут

(16 оценок, среднее: 4,06 из 5)
вот бы тоже самое только с базой на текстовых файлах
разбиваешь через explode и вперед
Спасибо, все очень просто и понятно.
А нет ли примера организации пагинатора для файлов ?
например у меня есть статья, которая представляет из себя html файл
и мне нужно организовать постраничный вывод статьи..
p.s. нужен пример пагинатора без СУБД
Спасибо Вам большое! Ваша статья — лучшее, что я смог найти по пагинаторам.
Отличный и простой пагинатор, я еще новичок в php но в свой двиг впаял его как надо. Огромное спасибо за то что выложили хороший скрипт. Подскажите вот какой момент, а если на сайте 100.000 файлов, выдаст слишком много страниц, как это дело все компактно сделать?
Нужно условие делать для вывода количества номеров страниц — первые 2-3 штуки, последние 2-3, активная ссылка, активная минус один и активная плюс один.
тогда красиво получится, что-то типо такого: 1 2 3 … 6 7 8 … 500 501 502
Можете пожалуйста скинуть в добавок и код с условием думаю очень многим новичкам пригодиться. Я вот искал долго пагинатор, на всех сайтах сложные замороченные а у вас самый дельный плюс еще хорошо что сразу с выводом файлов, но думаю компактность будет нелишней. Дополните пожалуйста статью если нетрудно, а то я сам поламаю свой код:-) Ищу вот еще поиск хороший на php что бы искать к примеру по titles в базе, есть у вас статьи по теме?
Действительно просто и понятно. Спасибо!