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 указывается адрес этого скрипта со всеми параметрами так, чтобы он туда только дописывал номер страницы. Если сложная выборка, надо будет ручками формировать этот адрес (всё-таки упрощение жизни вышло относительное: упрощаем одно — усложняем другое).

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