WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Страничный вывод данных.


Прислал: NAS [ 01.10.2000 @ 15:25 ]
Раздел:: [ Статьи по PHP ]


Страничный вывод данных.

В прошлом опыте я рассказал, как организовать визуальное представление данных из таблиц СУБД 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/


 :::::  Андрей Казанцев пишет 06.10.2000 @ 12:40 
Очень хороший пример. Однако, частенько при многостраничном переходе необходима более точная навигация вида ( 1-5 | 6-10 | 11-15 ...). В приведенном выше примере кода Вы можете изменить последние две вставки (там где формируются ссылки) на мой код. Все остальное менять не надо. Вот мой код:
If ($total>$itemsPerPage):
$pages = floor($total/$itemsPerPage);
for($i=0;$i<$pages;$i++){
$begin[$i] = $itemsPerPage*$i+1;
}
{if (floor($total/$itemsPerPage)<>$total/$itemsPerPage)
{$begin[$pages] = $itemsPerPage*$pages+1;}}
else:
$begin[0] = 1;
endif;
for($i=0;$i<=count($begin);$i++){
echo $begin[$i],\'<br>\';
}
echo \'<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
<td align=\"center\">\';
for ($i=0;$i<count($begin)-1;$i++):
echo \"<a href=\'?first=$begin[$i]\'>\";
echo $begin[$i],\'-\',$itemsPerPage*($i+1);
echo \"</a>\";
echo \' | \';
endfor;
echo \"<a href=\'?first=$begin[$i]\'>\";
echo $begin[$i];
if ($begin[$i]!=$total) {echo \'-\',$total;}
echo \"</a>\";
echo \'</td>
</tr>
</table>\';


Желаю успехов!
 :::::  C.H. пишет 12.11.2000 @ 09:19 
Хорошый комментарий :)
 :::::  Олег пишет 03.01.2001 @ 05:28 
Да это все класс!
Но как сделать сортировку по указаному мной порядку(по украинскому алфавиту) а не по ASC ?
 :::::  Андрей Головин пишет 27.02.2001 @ 02:39 
чтобы сделать сортировку, то надо написать соотвествующий SQL-запрос:
SELECT * FROM tablename ORDER BY sort_field ASC
или
SELECT * FROM tablename ORDER BY sort_field DESC

ASC - сортирует по возрастанию, DESC - по убыванию.

задачу сортировки по любому алфавиту должна решать СУБД. это не указывается явно в запросе.

 :::::  NRG пишет 20.03.2001 @ 03:54 
Помогите написать на PHP фичу чтобы она из mp3 вытягивала таги и делала бызу с ссылками.
 :::::  VitCOM Web пишет 10.04.2001 @ 05:35 
Скажите, а как можно сделать постраничный вывод не используя базу данных, например из отдельного текстового файла
 :::::  Fireworm пишет 04.06.2001 @ 09:27 
Скажите, а как быть в том случае, если программа генерит запрос в зависимости от переданных ей данных? Передавать все параметры перечислив их в <a href="...."></a> -- несколько неудобно, так как мало ли какие данные должны быть скрыты или их очень много?
 :::::  Илья пишет 01.08.2001 @ 08:12 
Все cooL!
Только, как все это сделать на PERL'е?
 :::::  Наталья пишет 02.10.2001 @ 13:32 
У меня есть текстовый файл в формате csv (разделители точка с запятой),
например:
1; Иванов; 2790
2; Петров; 4390
3; Сидоров; 1230

Так вот, как на ПХП написать следующий скрипт:
Чтобы он мне выводил это в виде таблицы,
т.е. новую строчку начинал с тега tr
а точку с запятой понимал бы как столбцы, внутри строчки?
 :::::  t34 пишет 22.05.2003 @ 19:47 
ну и просьбы... а с чего все начиналось :) продаю валенки !! :)
 :::::  Владимир пишет 06.02.2004 @ 08:26 
Господа помогите найти скрипт. Весь интернет перерыл, а найти именно то что мне нужно не удалось. :(
Требования PHP, MySQL, поиск, по страничный вывод новостей.
 :::::  Бадям пишет 21.10.2004 @ 11:41 
плохой пример, т.к. прививает ужасный PHP-ный подход - смешивать логику, доступ к данным и представление в одну кучу.
правильней было бы написать класс Pager, рассчитывающий расклад по страницам, которому бы передавались параметры "кол-во записей на страницу", "кол-во страниц в томе", "реальное кол-во записей". и этот класс использовать в страницах представления информации. алгоритм расчета тривиален. но здесь подается как готовое решение, которому начинающие программеры будут следовать и тем самым множить ряды "коленочных" программистов.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0154760