Постраничная навигация на PHP

Author Автор: Роман Чернышов    Опубликовано: 28 декабря 2010

Разрабатывая очередной проект, будь то крупный сайт или маленький скрипт, бывает необходимость в использовании постраничной разбивки выводимых данных. И реализация кнопок постраничной навигации. Казалось бы чего проще? Но не смотря на достаточно простую задачу, у многих программистов порой уходит час, а то и более на написание скрипта постраничной навигации. В то время, когда можно использовать готовое решение, и не тратить драгоценное денежное время на простые банальности.

Добавлено: новая версия скрипта постраничной навигации

Предлагаю вашему вниманию решение, которое я использую в своих проектах. На мой взгляд этот код достаточно универсален и его легко встроить в любой скрипт или CMS.

Скрипт на PHP

<?php    
//Настройки подключения к БД
$db_host = 'localhost';
$db_name = 'dbname';
$db_user = 'user';
$db_pass = 'pass';
 
$page = intval($_GET[page]); // значение текущей страницы из GET
$num = 10; // Переменная хранит число сообщений выводимых на станице
if ($page==0) $page=1;
// Определяем общее число сообщений в базе данных
// Берем из БД кол-во записей
 
	mysql_connect($db_host,$db_user,$db_pass) OR DIE("Error connect to SQL<br/> "); // коннект к БД, указать хост, лог и пасс
	@mysql_select_db("$db_name") or die("Error connect to DB<br/>"); 
	mysql_query ("set character_set_client='utf8'"); // установка кодировки ( возможно у вас cp1251)
	mysql_query ("set character_set_results='utf8'");
	mysql_query ("set collation_connection='utf8_general_ci'"); 
	$query = "SELECT count(`id`) FROM `table`"; // строка запроса в БД, "table" - заменить на название вашей таблицы 
	$mysql_result = mysql_query($query);
 
if(mysql_num_rows($mysql_result)>0){
	$count=mysql_fetch_row($mysql_result);
	}
$posts = $count[0]; // получем значение кол-во всех записей
// Находим общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
 
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href="/index.php?page=-1"><<</a>
<a href="/index.php?page='. ($page - 1).'"><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = '  <a href="/index.php?page='. ($page + 1).'">></a>
<a href="/index.php?page='.$total.'">>></a> ';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href="/index.php?page='. ($page - 2) .'">'. ($page - 2) .'</a>  ';
if($page - 1 > 0) $page1left = '<a href="/index.php?page='. ($page - 1) .'">'. ($page - 1) .'</a>  ';
if($page + 2 <= $total) $page2right = '  <a href="/index.php?page='. ($page + 2).'">'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = '  <a href="/index.php?page='. ($page + 1).'">'. ($page + 1) .'</a>';
 
//получаем записи из БД (начиная с $start, кол-во записей = $num)
 
$query = "SELECT * FROM `table` LIMIT $start, $num"; 
	$mysql_result = mysql_query($query);
?>

Выводим ссылки на страницы:

<?php
// если страниц больше чем одна
if ($total>1) echo '<p><div align="center" class="navigation">'
.$pervpage.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right
.$nextpage.'</div></p>';
?>

Стили оформления кнопок навигации:

.navigation {
color: #636363;
border: 0px;
font-family: tahoma;
}
 
.navigation a:link,
.navigation a:visited,
.navigation a:active {
display: inside;
text-decoration: none;
color: #FFF;
background-color: #13739B;
border: 1px solid #e1e1e3;
padding: 3px 6px;
font-size: 11px
}
 
.navigation a:hover {
background-color: #24323B;
color: #ffffff;
border-color: #e1e1e3;
}
 
.navigation span {
text-decoration: none;
background-color: #24323B;
padding: 3px 6px;
border: 1px solid #e1e1e3;
color: #fff;
font-size: 11px;
}
.navigation span.nav_ext {
border: none;
background: transparent;
}

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

Если возникнут вопросы по установке или какому-то участку кода, пишите в комментариях, постараюсь максимально объяснить, что и куда.

22 комментария to “Постраничная навигация на PHP”

  • Сергей 08.05.2011 в 6:58 пп

    Скажите, а как в этом скрипте реализовать примерно такое << < ..2|3|4|5|6.. > >>
    Т.е., если страниц больше 5, то скрывать остальные и добавить точки ().

    • Роман Чернышов 10.05.2011 в 12:19 дп

      Для реализации вывода навигации с большим числом отображаемых страниц(ссылок), нужно немного дописать код. Я предлагаю просто в зависимости от кол-ва страниц добавлять n-ое кол-во ссылок, добавив соответствующее условие, и внутри него цикл. Честно говоря, тоже сталкивался с данной задачей, но пока руки не дошли, в ближайшее время допишу код и выложу здесь.

  • Роман Чернышов 10.05.2011 в 12:24 дп

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

  • Руслан 16.12.2011 в 9:33 пп

    Роман, я на днях начал делать сайт, и столкнулся с необходимостью постраничной навигации по сайту. Причём мне нужно вставлять даже не один скрипт, а, скорее всего, несколько. То есть, переходы на следующую страницу осуществляются нажатием на ссылку «ЧИТАТЬ ЕЩЁ…» (это в текстовом разделе), а в разделе изображений «СМОТРЕТЬ ЕЩЁ…». Но так как, страниц становится больше, то и возникла такая необходимость, как постраничная навигация.
    Всё, что я нашёл (на данный момент) в Сети — это ничего с маслом. ваш скрипт меня заинтересовал, всё, вроде, понятно. Непонятно, как (и куда?) его устанавливать? Его же, наверное, нужно в корневой каталог помещать?
    Буду очень благодарен, если ответите на почту — так будет удобнеее.
    Спасибо.

  • Роман Чернышов 16.12.2011 в 9:54 пп

    Обновил код, он содержал лишние строки.

    Данный кусок года следует вставить в скрипт отвечающий за вывод списка записей в категории. Какая у вас CMS ? Могу помочь с установкой кода в скрипт.

  • Юрий 23.01.2012 в 4:04 пп

    Почему в переменной total всегда 1 ?

    • Роман Чернышов 17.03.2012 в 11:53 пп

      Возможно при запросе в базу, чтобы узнать общее кол-во всех записей, возвращается значение ноль, в результате $total всегда равен 1

  • Юрий 23.01.2012 в 4:25 пп

    if(mysql_num_rows($mysql_result)>0)
    {
    $count=mysql_fetch_row($mysql_result);
    }
    $posts = $count[0];

    Вот так считает…

  • Юрий 23.01.2012 в 4:33 пп

    Ну и чтоб добить и работало как надо, укажите класс для див в выводе ссылок 🙂

  • Renat 17.03.2012 в 10:25 пп

    Какую формулу выставлять чтобы отображалось только две записи на страницы?

    • Роман Чернышов 17.03.2012 в 11:34 пп

      Поменять значение
      $num = 10;
      на
      $num = 2;

  • Илья 05.05.2012 в 7:59 пп

    к этомой строке
    $total = intval(($posts — 1) / $num) + 1;
    выдается вот такая ошибка
    Warning: Division by zero in Q:\home\reklama\www\nov\str.php on line 42
    причем на всех скриптах где идет расчет колличества страниц этой формой

    • Роман Чернышов 06.05.2012 в 1:25 дп

      Данная ошибка означает, что вы пытаеттесь делить на ноль, чего делать нельзя. Очевидно, что переменная $num содержит ноль. Исправьте это.

  • Илья 05.05.2012 в 8:04 пп

    Скрипт копирую один в один только подключение свое и меняю таблицу базы данных

  • Илья 05.05.2012 в 8:18 пп

    <?php

    $result77 = mysql_query("SELECT str FROM options", $db);
    $myrow77 = mysql_fetch_array($result77);
    $num = $myrow77["str"];

    @$page = $_GET['page'];

    $result00 = mysql_query("SELECT COUNT(*) FROM nov_pr WHERE id='$id'");
    $temp = mysql_fetch_array($result00);
    $posts = $temp["0"];

    $total =intval(($posts — 1) / $num) + 1;
    $total =intval($total);

    $page = intval($page);

    if(empty($page) or $page $total) $page = $total;

    $start = $page * $num — $num;

    $result = mysql_query(«SELECT *FROM nov_pr WHERE id=’$id’ ORDER BY id LIMIT $start, $num»,$db);
    ?>

    вотон скрипт идентичный вашему только значение «num» берется из таблици «options» и все равно на строку
    $total =intval(($posts — 1) / $num) + 1;
    аналогичная ошибка
    Warning: Division by zero in Q:\home\reklama\www\nov\str.php on line 45
    Ребята если можно помогите пожалуйста, вообще не понимаю что за ерунда, у всер работает а у меня как обычно

    • Роман Чернышов 06.05.2012 в 1:27 дп

      Про ошибку отписал выше, а вот этот кусок кода(запрос в БД) совершенно не верен
      SELECT COUNT(*) FROM nov_pr WHERE id=’$id'»

      Ведь запись с указанном ID всего одна?

      замените, на
      SELECT COUNT(*) FROM nov_pr

  • nobll 28.05.2012 в 12:31 дп

    Спасибо за статью!

    Но у меня возникла необходимость сделать постраничную навигацию к плагину WordPress

    Плагин – каталог ссылок. Этот каталог вставляется на страницу через шорт код: add_shortcode(‘code’, ‘shortcod’);

    То есть каталог вставляется на определенную страницу сайта. И когда добавляю постраничную навигацию, при переходе на страницу «2», ВордПресс выдает «404 страница не найдена:(».
    Каким способом можно решить эту проблему?

    Третий день сижу, мозг кипит!)

    Буду благодарен, если подскажете начинающему, но очень перспективному программисту…:)

    • Роман Чернышов 01.06.2012 в 3:52 пп

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

  • Евгений 01.06.2012 в 1:51 пп

    А данный скрипт подойдет для фото галереи? Точнее есть просто страница с фотками, которые при помощи JQuery, открываются в увеличенном размере. Просто хотел разбить на страницы «фото галерею». Но возникает вопрос как работать с данным скриптом, куда его вставлять????

    • Роман Чернышов 01.06.2012 в 3:49 пп

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

  • Денис_ка 17.08.2013 в 7:31 пп

    Подскажите пожалуйста , у меня сайт на html , можно ли как — нибудь внедрить туда этот код , чтоб с бд подгружалось ??

    • Роман Чернышов 23.08.2013 в 1:33 дп

      Теоретически можно, если ваш хостинг поддерживает PHP и есть mySQL, а также все записи хранятся в БД, т.е. есть некая структура. Но боюсь если сам сайт на html, то БД он не использует и для навигации с помощью данного скрипта придется перекраивать сам сайт и делать еще много какой работы.

Оставить комментарий на Роман Чернышов

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 159₽
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка