решил написать про возможные варианты разбивки контента на страницы, но стоило только отвернуться как скачок напряжения, и пары абзацев
как не бывало. Но не будем о грустном.

Я встречал пока только два основных направления «пейджификации», это постраничная разбивка, для которой требуется в обязательном порядке знать общее число
страниц. И разбивка вида «ВПЕРЕД», «НАЗАД», для ее реализации достаточно немного изменить сам запрос дерганья контента из БД.
В случае постраничного отображения, мы получаем более наглядный и удобный способ визуализации, который легко можно представить как второй способ.
Но за все приходится платить, в данном случае дополнительным запросом к БД.
Второй вариант реализован путем получения ответа от Бд, составляющей страницу на 1 элемент больше чем собирались выводить, если этот элемент
присутствует то значит мы можем дать ссылку на последующую страницу. Иногда, где не требуется вся мощь и красота постраничного вывода, этот способ тоже применим.

пример реализации:

вариант «< НАЗАД | ВПЕРЕД >»

$start=isset($_GET['page']) ? $_GET['page'] : 0;	// с какого элемента начинаем забирать данные
$pages=15;											// количество выводимых полей из бд

$result=mysql_query("SELECT * FROM `table` ORDER BY `id` LIMIT $start,($pages+1)");

// код вывода ссылки если возможна навигация назад
$prev=($start-$pages>=0) ? '<a href="page.php?page='.($start-$pages).'"> BACK </a>' : 'BACK';
// если возможна навигация вперед
$next=count($result)>$pages ? '<a href="page.php?page='.($start+$pages).'"> NEXT </a>' : 'NEXT';

print $prev.' | '.$next;

Но что будет если мы передадим скрипту в запросе значение к примеру равное 2, по нашему алгоритму в $prev не будет ссылки, тогда как на самом деле
предыдущая страница есть. Так что в фильтре входящего значения необходимо несколько доработать код. Который будет валидировать данные и
все что не подходим нам по условиям отправлять в исключение.

if (((int)$start % (int)$pages)!=0){print '404, Sorry, page not found';exit;}

вариант «1 2 3 4 [5] 6 7 8»

$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице
$pages=15; // по сколько выводить записей на страницу
$page=$_GET['page']; // текущая страница

for ($i=1;$i<=ceil($max/$pages);$i++){
    print ($i==$page) ? ' <span style="color : #262626;	font-size : 0.82em;	font-weight : bold;">[ '.$i.' ]</span> ': ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.$i.'">'.$i.'</a> ';
}

результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 [ 14 ] 15 16 17 18 19 20 21 22 23 24 25

$max=mysql_query("SELECT COUNT(*) FROM `table`"); // количество записей в таблице
$pages=15; // по сколько выводить записей на страницу
$page=$_GET['page']; // текущая страница
$len=5; // количество отображаемых ссылок слева и справа от текущей страницы

//left
$left=$len>=$page-1? $page-1:$len;
for ($i=0;$i<=$left-1;$i++){

    print ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.($page+$i-$left).'">'.($page+$i-$left).'</a> ';
}

print '<span style="color : #262626;	font-size : 0.82em;	font-weight : bold;"> [ '.$page.' ] </span>';

//right
$right=ceil($max/$pages)<=$page+$len?ceil($max/$pages)-$page:$len;
for ($i=1;$i<=$right;$i++){

    print ' <a style="color : #C2C2C2;	font-size : 0.72em;" href="#page.php?page='.($page+$i).'">'.($page+$i).'</a> ';
}

результат:
9 10 11 12 13 [ 14 ] 15 16 17 18 19

В качестве max, page, pages, len можно поставить любые цифры и посмотреть на итоговый результат.