Страничный вывод данных.
Страничный вывод данных.
В прошлом опыте я рассказал, как организовать визуальное представление данных из таблиц СУБД mySQL. Описанный метод применим, если количество выводимых данных не велико или заранее известно. Но, иногда, необходимо предоставить пользователю возможность просмотреть
большой массив данных. Для этого его (массив ;), обычно разбивают на страницы с возможностью перехода от одной страницы к другой.
К счастью, данная задача решается не протосто, а очень просто. mySQL
поддерживает параметр запроса SELECT ... LIMIT первый,кол-во,
где первый - индекс элемента, с которого
начинается выборка, а кол-во - количество
элементов в выборке. Причем, параметр LIMIT накладывается
на результат работы всех предыдущих параметров, таких как WHERE,
ORDER BY и пр. Т.е. сначала производится полная
выборка, а потом происходит ее "урезание" до заданных пределов.
Предположим, что желаемое количество рядов данных, выводимое на одну
страницу задано в переменной $itemsPerPage, а
номер страницы передается в адресной строке с именем page,
например: //your.host.ru?page=1. Теперь,
зная количество рядов на страницу и номер страницы мы можем вычислить
индекс первого элемента в выборке (первый):
$first = $page*$itemsPerPage;
Здесь необходимо заметить, что индекс самого первого элемента в базе
- 0. Аналогично примем, что первая страница будет иметь индекс 0.
Устанавливаем соединение с сервером mySQL и получаем список полей таблицы,
как в предыдущем опыте:
mysql_connect("yourhost","user","password");
mysql_select_db("database");
$res = mysql_list_fields("database","table");
echo "<TABLE BORDER=1>";
echo "<TR>";
for ($i = 0; $i < mysql_num_fields($res); $i++) {
echo "<TH>";
echo mysql_field_name($res,$i);
echo "</TH>";
}
Далее сформируем SQL-запрос:
$sql = "SELECT * FROM table
ORDER BY $order
LIMIT $first,$itemsPerPage";
Предположим, что мы передаем в адресной строке еще и имя поля, по которому
происходит сортировка данных - $order. Это не
важно для темы данного опыта, но наглядно демонстрирует возможности работы
параметра LIMIT.
На этом можно было бы и закончить описание того, как получить набор данных,
соответствующий заданным границам, так как далее можно напрямую скопировать код из предыдущего опыта. Я приведу этот
код еще раз:
$res = mysql_query($sql);
while ($row = mysql_fetch_row($res)) {
echo "<TR>";
for ($i = 0; $i < $fields; $i++) {
echo "<TD>".$row[$i]."</TD>";
}
echo "</TR>";
}
echo "</TR></TABLE>";
Т.е., этот код настолько универсален, что ему, практически, безразлично
содержание запроса.
Далее мы должны сформировать ссылки для навигации по нашему многостраничному
документу:
$res = mysql_query("SELECT COUNT(*) FROM table");
$itms = mysql_fetch_array($res);
$total = $itms[0];
$pages = floor($total/$itemsPerPage);
if (($total%$itemsPerPage) != 0) {
$pages++;
}
if (empty($page)) { $page = 0; }
В первых трех строчках мы запрашиваем у сервера базы данных количество
рядов данных в таблице. Далее расчитываем общее количество страниц, которое
получается в нашем документе ($pages). Последняя
строчка используется для того, чтобы при дальнейших действиях не возникло
неоднозначности, если пользователь вызвал наш документ без параметров
в адресной строке.
Далее формируем сами ссылки:
if ($page!=0) {
echo "
<A HREF='$PHP_SELF?order=name&page=".($page - 1)."'>
Назад (".($page).")</A>";
}
if (($page+1)<$pages) {
echo "
<A HREF='$PHP_SELF?order=name&page=".($page + 1)."'>
Далее (".($page + 2).")</A>";
}
Переменная $PHP_SELF содержит имя текущего скрипта.
Таким образом (предположим, что наш документ называется data.phtml) вид
формируемых ссылок будет таким:
<A HREF="//your.host.ru/data.phtml?order=name&page=2">
Назад (1)</A>
<A HREF="//your.host.ru/data.phtml?order=name&page=3"> Вперед
(3)</A>
Кроме того, вы самостоятельно сможете дополнить этот документ ссылками
на первую и последнюю страницу. Удачи!
©
Андрей Головин //exper.ural.ru/
|