Постраничная навигация на 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
Заказать работу
предложить оффер

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

Archive

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