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

Вывод записей из базы данных постранично.

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

SELECT*FROM table LIMIT 5,8;

В этом запросе мы достаем из таблицы table 8 записей, начиная с 5-й.

Теперь применим возможности limit для написания пагинатора.

Для начала нужно создать таблицу, с тестовыми данными, можете применить этот патч:

//создание таблицы tbl_news

CREATE TABLE IF NOT EXISTS `tbl_news`(`id` int(8)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','короткое описание','полный текст','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);

//Теперь напишем 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>

<!--вывод новостей-->

<?foreach($newsData as $oneNews){?>

<div class=one_news>

<label><?=$oneNews['title']?></label>

<p><?=$oneNews['small_text']?>

<a href="/news.php?id=<?=$oneNews['id']?>">Подробнее</a>

<hr>

</div>

<?}?>

<!--вывод пагинатора-->

<ul>

<?if($pageNum>1){?>

<li><a href="/index.php?page=1">&lt;&lt;</a>

<li><a href="/index.php?page=<?=$pageNum-1;?>">&lt;</a>

<?}?>

<?for($i=1;$i<=$lastPage;$i++){?>

<li <?=($i==$pageNum)?'class="current"':''?>><a href="/index.php?page=<?=$i;?>"><?=$i;?></a>

<?}?>

<?if($pageNum <$lastPage){?>

<li><a href="/index.php?page=<?=$pageNum+1?>">></a>

<li><a href="/index.php?page=<?=$lastPage?>">>></a>

<?}?>

</ul>

</div>