MySQL: Постраничный вывод
Регулярно в форуме задают один и тот же вопрос: как сделать постраничный вывод. И каждый раз человеку отвечают: "Легко! m строк, начиная с n-ной: Select запрос Limit $n,$m". На самом деле не так всё просто.
Я уже писал про синтаксис параметра LIMIT, однако, без толку. Для полноценного постраничного вывода строк из базы требуется большее. Требуется
- Обработать номер страницы (в том числе проверить, не больше ли он общего количества страниц)
- Нарисовать навигационную строку (чтобы не просто "вперед-назад", а с ссылками на несколько соседних страниц)
Тут-то и начинаются главные проблемы.
Недавно я работал над сайтом, в котором эти постраничные выводы в статистике были в каждом списке (а списков было много!). Тут-то и созрело решение, как свести все эти штучки к простому и единому решению. Получились четыре функции, которые я теперь использую везде, где нужен постраничный вывод данных, и не напрягаю попусту голову проблемой (как же я делал это там, как бы вынуть этот код оттуда?).
Первая функция — для внутреннего пользования двумя следующими. Берёт номер страницы, общее количество строк и количество строк на странице и выдаёт номер страницы, уже проверенный. Вторая берёт то же самое, проверяет номер страницы и выдаёт парамерт LIMIT либо полный (LIMIT n,m), либо краткий (LIMIT m), если это первая страница, либо ничего не выдаёт. Третья функция из тех же трёх параметров и адреса для ссылки делает навигационную строку. Ещё одна функция выдаёт число для нумерованного списка.
Этого достаточно для нормальной работы с постраничным выводом данных. Посмотрим, что получается в коде программы:
<?php
// кол-во строк в страницах
$in_page = 10;
// получаем количество строк
$amount = @mysql_result(mysql_query("SELECT count(id) as goods_total FROM goods"),0);
// рисуем навигационную строку и пишем начало таблицы
print("<div align=center>". <b>draw_bar($page, $amount, $in_page,
"goods.php?page=")</b>. "</div>\n<table>");
// формируем запрос к базе
$goods_result = mysql_query("SELECT id, name, description, price FROM goods
ORDER BY name, price ". <b>get_limit($page, $amount, $in_page)</b>);
// получаем номер для нумерованного списка
$count = <b>get_count_limit($page, $amount, $in_page)</b>;
// выводим строки
while ($good_row = mysql_fetch_array($goods_result)) {
$count++;
print ("<tr");
// фон каждой второй строки — серым цветом
if ($count/2==intval($count/2))
print (" bgcolor=#e1e1e1");
print ("><td align=right>$count.</td><td>${good_row[name]}
<br>${good_row[description]}</td><td align=right>${good_row[price]}</td></tr>\n");
};
// конец таблицы и нижняя навигационная строка
print("</table><div align=center>". <b>draw_bar($page, $amount,
$in_page, "goods.php?page=")</b>. "</div>\n");
Это ВСЁ, что нужно для постраничного вывода! Больше напрягаться не надо!
Одно только пояснение — в качестве параметра функции draw_bar указывается адрес этого скрипта со всеми параметрами так, чтобы он туда только дописывал номер страницы. Если сложная выборка, надо будет ручками формировать этот адрес (всё-таки упрощение жизни вышло относительное: упрощаем одно — усложняем другое).