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

Пожалуй одна из самых распростанённых задач для веб-программистов. Большинство новичков сталкиваются с ней, я не был исключением. Попытаемся же разобраться с логикой скрипта и реализовать его.

Приступим?

Первое, что нам нужно для этого иметь – это базу данных с несколькими десятками строк, например статей или комментариев к ним (что угодно). Мы будем рассматривать базу данных MySQL, она является самой популярной на данный момент. Естественно используемый язык – это PHP.

Есть? Отлично! Продолжаем…

1. Создаём для примера файл primer.php;
2. Создаём Базу данных primer (можете не создавать, если у вас уже есть подходящая);
3. Создаём таблицу primer вот такой структуры (опять же, если нет другой);

CREATE table primer (
id int auto_increment primary key key,
name varchar(100) NOT NULL,
text longtext NOT NULL
);

4. Набиваем её информацией. Я сделаю 20 записей, мне не день 😉
5. Набираемся терпения – сейчас будем кодить.

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

Запихиваем нижележаций код в primer.php и пытаемся понять как же он работает:

<?

 $server = 'localhost'; // ИМЯ СЕРВЕРА
 $user = 'root'; // ПОЛЬЗОВАТЕЛЬ - НЕ ИСПОЛЬЗУЙТЕ ROOT ДЛЯ ВАШЕЙ ЖЕ БЕЗОПАСНОСТИ
 $pass = ''; // ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ

 $db = 'primer'; // БАЗА ДАННЫХ
 $table = 'primer'; // НАЗВАНИЕ ТАБЛИЦЫ

 $chislo = 5; // ЧИСЛО СООБЩЕНИЙ НА СТРАНИЦЕ

 // ДЛЯ УДОБСТВА ОБОЗНАЧИМ ПЕРЕМЕННУЮ С ТЕКСТОМ ОШИБКИ
 $text_error = '<br />Ошибочка вышла!';

 // СОЕДЕНИМСЯ С MySQL
 $connect = mysql_connect ($server, $user, $pass);
 if (!$connect) {
 echo $text_error;
 exit;
 }

 // СОЕДЕНИЯЕМСЯ С БАЗОЙ ДАННЫХ
 $select = mysql_select_db($db);
 if (!$select) {
 echo $text_error;
 exit;
 }

 // СОЗДАЁМ ЗАПРОС
 $result = mysql_query("SELECT * from $table ORDER by id desc");
 // СЧИТАЕМ КОЛЛИЧЕСТВО ЗАПИСЕЙ В ТАБЛИЦЕ - У МЕНЯ ИХ 20
 $num_rows = mysql_num_rows($result);

 // А ТЕПЕРЬ СЧИТАЕМ НА СКОЛЬКО СТРАНИЦ НАМ РАЗБИТЬ ЗАПИСИ И ВЫДЕЛЯЕМ ЦЕЛОЕ ЧИСЛО
 $num_rows = round($num_rows/$chislo); // 20 ДЕЛИМ НА 5. СКОЛЬКО? :)


 // ЗДЕСЬ МЫ ПРОВЕРЯЕМ НА КАКОЙ СТРАНИЦЕ СЕЙЧАС ПОЛЬЗОВАТЕЛЬ
 if (isset($_GET['str'])) {
 $nav = $_GET['str'];
 }
 else {
 $nav = 0;
 }
 $nav = intval($nav); // ДЛЯ ЗАЩИТЫ ОТ НЕХОРОШИХ ДЯДЕНЕК МЫ ВЫДЕЛИМ ЦЕЛУЮ ЧАСТЬ $GET['str']
 echo 'Навигация: ';

 // А ТЕПЕРЬ ВЫВОДИМ НОМЕРА СТРАНЦ
 for ($i=1; $i<$num_rows; $i++) {
 if ($i != $nav) {
 echo '<a href="'.$PHP_SELF.'?str='.$i.'">'.$i.'</a> ';
 }
 else {
 // АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
 echo '<span>'.$i.'</span> ';
 }
 }

 echo '<hr />'; // ОТДЕЛИМ НАВИГАЦЮ ОТ КОНТЕНТА ДЛЯ НАГЛЯДНОСТИ

 // НАЧИНАЕМ ВЫВОДИТЬ САМУ ИНФОРМАЦИЮ ПОСТРАНИЧНО :)
 if (!isset($_GET['str'])) {
 $str = 0;
 }
 else {
 $str = $_GET['str']*$chislo - $chislo;
 }
 $nomer = $str + 5;
 // ФОРМИРУЕМ ЗАПРОС НУЖНОЙ НАМ ЧАСТИ ИНФОРМАЦИИ
 $result = mysql_query("SELECT * from $table ORDER by id asc limit $str, $nomer");
 // ИНАЧЕ ВЫВОДИМ ОШИБКУ
 if (!$result) {
 echo $text_error;
 exit;
 }

 echo '<div style="width: 40%;">';
 while ($row = mysql_fetch_array($result)) {
 echo '<p>'.$row['id'].' - <strong>'.$row['name'].'</strong>
 <br />
 '.substr($row['text'],0,100).'.. <a href="text.php?nomer='.$row['id'].'">>></a></p>';
 }
 echo '</div>';

 mysql_close($connect);

?>

Поясню лишь, что в переменной "str" передаётся номер страницы, на которой находится пользователь, в адрессной строке браузера это выглядит так:

Вот и всё, скрипт постраничного вывода у нас готов! Примерно, это должно выглядеть так:

Если это необходимо, редактируем скрипт (например, сделаем его функцией и будем использовать каждый необходимый нам раз) и влепляем его в Ваш дизайн на странице...

Комментарии

Оставьте свой комментарий
В
Вера

Здравствуйте!
Объясните, пожалуйста, как передаётся номер страницы, на которой находится пользователь, то есть как сделать, чтобы str принимал эти значения?

B
BaNru

$_GET['str']
Передается через URL - str=5
http://example.com/index.php?str=5

Г
Гость

Ну запихнул я это все в php файл, а дальше как? У меня посты в другом файле выводятся!

B
BaNru

Сделать include в том файле, где надо выводить новости:

<?php include('/папка_елси_надо/имя_этого_файла_с_новостями.php'); ?>

C
celldweller

Добрый день. У меня вопрос такой: использовал ваш скрипт, для создания постраничной навигации. Все вроде бы как работает, только 1 вопрос:
Допустим у нас есть 5 статей: 1, 2, 3, 4, 5. Они все лежат в базе и чувствуют себя хорошо. Мы делаем навигацию и вывод по 1 статье на страницу. Предположим, что потом мы удалили статью номер 3, получается что все номера страниц сдвинуться на 1, получится 1,2,3,4. А это уже большая проблема. Потому, что пользователь перейдя по ссылке на 3 страницу - попадет по факту на материал на 4, а по ссылке на 4, попадет на 5. Тоже самое будет и с поисковыми машинами. Не считаете ли вы это значительным недостатком данного скрипта?

Г
Генадий

А можно пример с использованием драйвера PDO для базы.. а то с sql на вы...
А такой способ постраничной навигации подойдет для примерно 2500 строк?

К
Константин

Вместо round нужно было использовать ceil, эта функция как раз предназаначена для округления дробного числа до целого в большую сторону. И никаких единичек к round прибавлять не надо будет. И вообще не надо к round 1 прибавлять, у вас ведь может получиться дробное число, например, 3.789. Round () это число округлит до 4, прибавив 1, вы получите несуществующую страницу 5.

Т
Тимофей

Для тех кому интересно навял дополнение небольшое к сему скрипту, тут выводятся только ближайшие ссылки и первая с последней страницы

$i = $nav;
$next = $i+1;
$previous = $i-1;
if (!isset($_GET['page'])) {echo '1
';}
else {
if ($i == 1) {echo ''.$i.'

';}
else {
if ($i == $num_rows) {echo '

'.$i.'';}
else {
echo '

'.$i.'

';}}}
?>

R
rusik

Кое-как решил проблему с неактивной ссылкой первой страницы при заходе без $_GET['str'] или же при заходе на страницу в первый раз...
...

// А ТЕПЕРЬ ВЫВОДИМ НОМЕРА СТРАНиЦ
for ($i=1; $i<=$num_rows; $i++) {
if ($i != $nav) {

if (isset($_GET['str'])) {
echo ' ';
} else {

if ($i == '1') {

echo ''.$i.' ';
} else {

echo ' ';
}
}
}
else {
// АКТИВНУЮ СТРАНИЦУ ДЕЛАЕМ НЕ ГИПЕРССЫЛКОЙ
echo ''.$i.' ';
}
}

M
mr.Andersons

Пример конечно хорош, но нужны доделки. Сделал всё, что перечислено выше, по своему:

//А ТЕПЕРЬ СЧИТАЕМ НА СКОЛЬКО СТРАНИЦ НАМ РАЗБИТЬ ЗАПИСИ И ВЫДЕЛЯЕМ ЦЕЛОЕ ЧИСЛО
$num_rows = ceil($num_rows/$chislo); // 20 ДЕЛИМ НА 5. СКОЛЬКО? 🙂 - я использовал ceil для округления в большую сторону.
Не понял только одного, почему переходя на вторую или следующие страницы, на пример 2, выводит с 6 по 15 и если на стр 3 - с 11 по 20. короче выводи 10 записей, а не 5. У меня 21 запись, правильно выводит только первую и последнюю страницу. Подскажите в чём дело. Заранее спасибо.

I
IntegralAL

Дискуссия интересна). Будем считать, что код расчитан на простое объяснение. Оптимизация не обговорена).

J
Jensi

Так нужно:

// СЧИТАЕМ КОЛЛИЧЕСТВО ЗАПИСЕЙ В ТАБЛИЦЕ - У МЕНЯ ИХ 20
$num_rows = mysql_query("SELECT COUNT(*) from $table");

// А ТЕПЕРЬ СЧИТАЕМ НА СКОЛЬКО СТРАНИЦ НАМ РАЗБИТЬ ЗАПИСИ И ВЫДЕЛЯЕМ ЦЕЛОЕ ЧИСЛО
$num_rows = round($num_rows/$chislo)+1; // 20 ДЕЛИМ НА 5. СКОЛЬКО? 🙂
Иначе последней странички не будет. И почитать сообщение https://www.internet-technologies.ru/articles/postranichnaya-navigaciya-na-php.html#comment_404 от Svoloch.

Загрузить еще