Регулярно в форуме задают один и тот же вопрос: как сделать постраничный вывод. И каждый раз человеку отвечают: "Легко! 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 указывается адрес этого скрипта со всеми параметрами так, чтобы он туда только дописывал номер страницы. Если сложная выборка, надо будет ручками формировать этот адрес (всё-таки упрощение жизни вышло относительное: упрощаем одно — усложняем другое). Навигационная панель сделана в виде номеров страниц (" 1 | 2 | 3 "). Но привести к виду "0-10 | 11-20 | 21-30" не проблема. |