PHP в деталях

Работа с MySQL. Часть 4. Постраничный вывод


DL
28.4.2001

Регулярно в форуме задают один и тот же вопрос: как сделать постраничный вывод. И каждый раз человеку отвечают: "Легко! m строк, начиная с n-ной: Select запрос Limit $n,$m". На самом деле не так всё просто.

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

1. Обработать номер страницы (в том числе проверить, не больше ли он общего количества страниц)

2. Нарисовать навигационную строку (чтобы не просто "вперед-назад", а с ссылками на несколько соседних страниц)

Тут-то и начинаются главные проблемы.

Недавно я работал над сайтом, в котором эти постраничные выводы в статистике были в каждом списке (а списков было много!). Тут-то и созрело решение, как свести все эти штучки к простому и единому решению. Получились четыре функции, которые я теперь использую везде, где нужен постраничный вывод данных, и не напрягаю попусту голову проблемой (как же я делал это там, как бы вынуть этот код оттуда?).

Первая функция? для внутреннего пользования двумя следующими. Берёт номер страницы, общее количество строк и количество строк на странице и выдаёт номер страницы, уже проверенный. Вторая берёт то же самое, проверяет номер страницы и выдаёт парамерт LIMIT либо полный (LIMIT n,m), либо краткий (LIMIT m), если это первая страница, либо ничего не выдаёт. Третья функция из тех же трёх параметров и адреса для ссылки делает навигационную строку. Ещё одна функция выдаёт число для нумерованного списка.

Этого достаточно для нормальной работы с постраничным выводом данных. Посмотрим, что получается в коде программы:

// кол-во строк в страницах

$in_page = 10;

// получаем количество строк

$amount = @mysql_result(mysql_query("SELECT count(id) as goods_total FROM goods"),0);



// рисуем навигационную строку и пишем начало таблицы

print("<div align=center>". draw_bar($page, $amount, $in_page, "goods.php?page="). "</div>\n<table>");


// формируем запрос к базе

$goods_result = mysql_query(" SELECT id, name, description, price FROM goods ORDER BY name, price ". get_limit($page, $amount, $in_page));

// получаем номер для нумерованного списка

$count = get_count_limit($page, $amount, $in_page);

// выводим строки

while ($good_row = mysql_fetch_array($goods_result)) {

  $count++;

  print ("<tr");

  // фон каждой второй строки ? серым цветом

  if ($count/2==intval($count/2))

    print (" bgcolor=#e1e1e1");

  print ("><td >$count.</td><td>${good_row[name]}<br>${good_row[description]}</td><td >${good_row[price]}</td></tr>\n");

  };

// конец таблицы и нижняя навигационная строка

print("</table><div align=center>". draw_bar($page, $amount, $in_page, "goods.php?page="). "</div>\n");

Это ВСЁ, что нужно для постраничного вывода! Больше напрягаться не надо!

Одно только пояснение ? в качестве параметра функции draw_bar указывается адрес этого скрипта со всеми параметрами так, чтобы он туда только дописывал номер страницы. Если сложная выборка, надо будет ручками формировать этот адрес (всё-таки упрощение жизни вышло относительное: упрощаем одно ? усложняем другое).

Навигационная панель сделана в виде номеров страниц (" 1 | 2 | 3 "). Но привести к виду "0-10 | 11-20 | 21-30" не проблема.

Ниже есть ссылка на файл с этими функциями.


Содержание раздела