www.kaminskiy-web.com | contact@kaminskiy-web.com
Статьи для веб-мастера - Kaminskiy-web

Главная страницаОбо мнеКонтактная информация
Статьи HTML и CSS JavaScript PHP и MySQL Раскрутка сайтов Хостинг Рейтинг украинского хостинга Анекдоты Анекдотов стрит

Постраничный вывод данных на PHP и MySQL

Автор статьи: Сергей Каминский

Сейчас многие сайты используют для хранения информации базы данных, в которых количество записей часто достигает сотен и тысяч. Поэтому, для удобства пользователей, записи выводятся порциями, то-есть постранично. В этой статье я расскажу как реализовать это на своем сайте с помощью PHP и MySQL. В приведенном примере будут выводиться ссылки "вперед" и "назад", "на первую страницу" и "на последнюю страницу", а также мы сможем ограничить количество ссылок, которые будут выводиться одновременно.

Как работает постраничный вывод информации

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

SELECT * FROM postranichno LIMIT 2 OFFSET 0;

Для вывода второй страницы нам нужно увеличить значение параметра OFFSET на количество записей, то-есть на два.

SELECT * FROM postranichno LIMIT 2 OFFSET 2;

Поскольку значение параметра OFFSET постоянно меняется, то мы количество записей присвоим переменной $quantity, а номер с которого нужно начинать вывод мы будем определять, умножая номер страницы на количество записей, и присваивать переменной $list, а потом подставим все это в запрос.

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

Готовый пример с комментариями

Первым делом создадим файл config.inc.php, который будет соединяться с базой данных MySQL. Мы будем подключать его во все скрипты, в которых нужно делать запросы к БД.

<?php

define('DB_HOST', 'localhost'); // сервер БД
define('DB_USER', 'login'); // логин БД
define('DB_PASS', 'password'); // пароль БД
define('DB_NAME', 'database'); // имя БД

if (!$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS)) {
    echo 'не могу подключиться к серверу БД';
        exit;
}
if (!mysql_select_db(DB_NAME)) {
    echo 'не могу подключить БД';
        exit;
}

?>

Чтобы было на чем испытать скрипт постраничного вывода, мы создадим с помощью install.php таблицу в базе данных MySQL и добавим туда семь записей.

<?php

// Подключаем файл для соединения с базой данных
include('config.inc.php');

// Создаем таблицу
mysql_query("create table postranichno (title char(70) null, 
description char(255) null); ");

// Добавляем данные в таблицу 
mysql_query("insert into postranichno values ('Название статьи номер 1',
'Описание статьи номер 1')"); 
mysql_query("insert into postranichno values ('Название статьи номер 2',
'Описание статьи номер 2')"); 
mysql_query("insert into postranichno values ('Название статьи номер 3',
'Описание статьи номер 3')"); 
mysql_query("insert into postranichno values ('Название статьи номер 4',
'Описание статьи номер 4')"); 
mysql_query("insert into postranichno values ('Название статьи номер 5',
'Описание статьи номер 5')"); 
mysql_query("insert into postranichno values ('Название статьи номер 6',
'Описание статьи номер 6')"); 
mysql_query("insert into postranichno values ('Название статьи номер 7',
'Описание статьи номер 7')"); 

?>

Запустите install.php чтобы записи добавились в базу данных. Теперь приступим к написанию основного PHP-скрипта postranichno.php, который и будет осуществлять постраничный вывод из базы данных MySQL. Все действия описываются в комментариях для лучшего понимания того, что мы делаем.

<?php

// запрещаем вывод предупреждений
Error_Reporting(E_ALL & ~E_NOTICE);

// подключаем файл, который устанавливает соединение с базой данных
include('config.inc.php');

// Устанавливаем количество записей, которые будут выводиться на одной странице
// Поставьте нужное вам число. Для примера я указал одну запись на страницу
$quantity=1;

// Ограничиваем количество ссылок, которые будут выводиться перед и
// после текущей страницы
$limit=3;

// Если значение page= не является числом, то показываем
// пользователю первую страницу
if(!is_numeric($page)) $page=1;

// Если пользователь вручную поменяет в адресной строке значение page= на нуль,
// то мы определим это и поменяем на единицу, то-есть отправим на первую
// страницу, чтобы избежать ошибки
if ($page<1) $page=1;

// Узнаем количество всех доступных записей 
$result2 = mysql_query("SELECT * FROM postranichno;");
$num = mysql_num_rows($result2);

// Вычисляем количество страниц, чтобы знать сколько ссылок выводить
$pages = $num/$quantity;

// Округляем полученное число страниц в большую сторону
$pages = ceil($pages);

// Здесь мы увеличиваем число страниц на единицу чтобы начальное значение было
// равно единице, а не нулю. Значение page= будет
// совпадать с цифрой в ссылке, которую будут видеть посетители
$pages++; 

// Если значение page= больше числа страниц, то выводим первую страницу
if ($page>$pages) $page = 1;

// Выводим заголовок с номером текущей страницы 
echo '<strong style="color: #df0000">Страница № ' . $page . 
'</strong><br /><br />'; 

// Переменная $list указывает с какой записи начинать выводить данные.
// Если это число не определено, то будем выводить
// с самого начала, то-есть с нулевой записи
if (!isset($list)) $list=0;

// Чтобы у нас значение page= в адресе ссылки совпадало с номером
// страницы мы будем его увеличивать на единицу при выводе ссылок, а
// здесь наоборот уменьшаем чтобы ничего не нарушить.
$list=--$page*$quantity;

// Делаем запрос подставляя значения переменных $quantity и $list
$result = mysql_query("SELECT * FROM postranichno 
                      LIMIT $quantity OFFSET $list;");

// Считаем количество полученных записей
$num_result = mysql_num_rows($result);

// Выводим все записи текущей страницы
for ($i = 0; $i<$num_result; $i++) {
    $row = mysql_fetch_array($result);
    echo '<div><strong>' . $row["title"] . '</strong><br />' . 
    $row["description"] . '</div><br>';
}

echo 'Страницы: ';

// _________________ начало блока 1 _________________

// Выводим ссылки "назад" и "на первую страницу"
if ($page>=1) {

    // Значение page= для первой страницы всегда равно единице, 
    // поэтому так и пишем
    echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=1"><<</a> &nbsp; ';

    // Так как мы количество страниц до этого уменьшили на единицу, 
    // то для того, чтобы попасть на предыдущую страницу, 
    // нам не нужно ничего вычислять
    echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . $page . 
    '">< </a> &nbsp; ';
}

// __________________ конец блока 1 __________________

// На данном этапе номер текущей страницы = $page+1
$this = $page+1;

// Узнаем с какой ссылки начинать вывод
$start = $this-$limit;

// Узнаем номер последней ссылки для вывода
$end = $this+$limit;

// Выводим ссылки на все страницы
// Начальное число $j в нашем случае должно равнятся единице, а не нулю
for ($j = 1; $j<$pages; $j++) {

    // Выводим ссылки только в том случае, если их номер больше или равен
    // начальному значению, и меньше или равен конечному значению
    if ($j>=$start && $j<=$end) {

        // Ссылка на текущую страницу выделяется жирным
        if ($j==($page+1)) echo '<a href="' . $_SERVER['SCRIPT_NAME'] . 
        '?page=' . $j . '"><strong style="color: #df0000">' . $j . 
        '</strong></a> &nbsp; ';

        // Ссылки на остальные страницы
        else echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . 
        $j . '">' . $j . '</a> &nbsp; ';
    }
}

// _________________ начало блока 2 _________________

// Выводим ссылки "вперед" и "на последнюю страницу"
if ($j>$page && ($page+2)<$j) {

    // Чтобы попасть на следующую страницу нужно увеличить $pages на 2
    echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($page+2) . 
    '"> ></a> &nbsp; ';

    // Так как у нас $j = количество страниц + 1, то теперь 
    // уменьшаем его на единицу и получаем ссылку на последнюю страницу
    echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?page=' . ($j-1) . 
    '">>></a> &nbsp; ';
}

// __________________ конец блока 2 __________________

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

Как убрать ненужные вам функции

Я в коде выделил два блока. Первый из них реализует вывод ссылок "назад" и "на первую страницу". Второй, соответственно, "вперед" и "на последнюю страницу". Если подобные возможности вам не нужны, то просто удалите данные блоки кода. Также в примере ограничено количестов ссылок которые выводятся до и после текущей страницы, чтобы не заполнять ими все окно браузера. Если вам это не нужно, то поменяйте значение переменной $limit на число, которое больше количества страниц, например, 3000.

Несколько советов

Для того, чтобы номера ссылок соответствовали номерам страниц и отсчет начинался не с нуля, а с единицы, мне пришлось немного усложнить код. Надеюсь, что комментарии помогли вам во всем разобраться. Вы можете изменять количество записей одновременно выводимых на странице на нужное вам целое число – на работу скрипта это никак не повлияет. Точно также вы можете просто поменять название файла postranichno.php на другое не изменяя код.

Размещая на своем сайте ссылку на первую страницу ставьте ее сразу на postranichno.php?page=1, а не просто на postranichno.php. Оба варианта дадут одинаковый результат, но первый будет более правильным выбором.

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

Другие записи по теме в разделе статьи по PHP и MySQL

Копирование статьи запрещено.