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