|
 |
Путь: >
Базы данных
Базы данных
Автор: - Yurik
Дата публикации - 11.5.2005
Просмотров: - 9602
Постраничный вывод результата
[p]Предпосылки[/p]
Подразумевается что у вас уже есть отработанный SQL запрос, который вернул идентификатор результата $result.
[nb]Хотя мы будем выводить только N строк, в большинстве случаев очень желательно ещё на этапе написания SQL запроса ограничить количество возвращаемых результатов чтобы не было переполнения через инструкцию LIMIT offset, quantity:[code]SELECT * FROM table WHERE ..... LIMIT 0, 200[/code]
[/nb]
[p]Собственно разбивка, точнее арифметика, 3-ий класс[/p]
[php]
<?php
$showperpage=0;
// сколько показывать на страницу
if (isset($HTTP_GET_VARS['show'])){
$showperpage=(int)$HTTP_POST_VARS['show'];
}
if (isset($HTTP_POST_VARS['show'])){
$showperpage=(int)$HTTP_POST_VARS['show'];
}
// сколько показывать на страницу по умолчанию
if (($showperpage<1)||($showperpage>100)) {
$showperpage=20;
}
// сколько записей получилось
$counted=mysql_num_rows($result);
// сколько будет страниц
$countedpages=ceil($counted/$showperpage);
// получить из УРЛ текущую страницу
$currentpage=0;
if (isset($HTTP_GET_VARS['page'])) {
$currentpage=(int)$HTTP_GET_VARS['page'];
}
if ($currentpage>$countedpages) {
$currentpage=$countedpages;
}
if ($currentpage<1) {
$currentpage=1;
}
// первая позиция
$start_pos=($currentpage-1)*$showperpage+1;
// последняя позиция
$end_pos=$start_pos+$showperpage-1;
if ($end_pos>$counted) {
$end_pos=$counted;
}
?>
<p>Найдено: <?=$counted?></p>
<p>Страница: <?=$currentpage?> из <?=$countedpages?></p>
<p><?php
// вывести страницы для выбора
for ($i = 1; $i <= $countedpages; $i++) {
if ($currentpage!=$i) {
echo "<a href=\"".$PHP_SELF."?show=".$showperpage."&page=".$i."\">".$i."</a>";
} else {
echo $i;
}
echo " ";
}
?></p>
<?php
if (!mysql_num_rows($result)){
echo "<p>По запросу ничего не найдено</p>";
} else {
$i = $start_pos;
echo "<ol start=\"".$i."\">";
// перейти на начальную позицию
mysql_data_seek($result, $i-1) or echo "Could not seek to row ".($i-1);
// вывести найденные результаты до позиции $end_pos
while ($row=mysql_fetch_array($result)){
if ($i>$end_pos){
break;
}
echo "<li>".$row['field1']."</li>";
$i++;
}
echo "</ol>";
}
?>
[
/php]
[p]Эффективность[/p]
Как видите, в коде заложена не совсем эффективная концепция. Сначала мы возвращаем все результаты из SQL запроса, а потом делаем навигацию в полученном результате. С точки зрения правильного подхода неэффективно вытягивать все строки а потом выводить только нужные. MySQL позволяет ещё на стадии написания SQL запроса ограничить результат только текущеё страницей через инструкцию LIMIT. Например чтобы вывести 3-ю страницу с 20 строками достаточно написать
[php]
<?php
$result=mysql_query("SELECT * FROM table WHERE .... LIMIT 40, 20");
while ($row=mysql_fetch_array($result)){
echo $row['field1'];
}
?>[
/php]
но тогда возникает проблема подсчета всех страниц. Как узнать сколько бы вернул запрос записей без ограничения LIMIT? Выхода два:
- Если Вам повезло с версией MySQL > 4.0.x то сделать так:
[php]
<?php
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE ..... LIMIT 0, 200";
$result = mysql_query($sql);
$sql = "SELECT FOUND_ROWS()";
$count_row=mysql_fetch_row(mysql_query($sql));
$counted=$count_row[0];
?>[
/php]
- Предварительно сделать SELECT COUNT(id) FROM table WHERE...
Будут ли эти варианты эффективнее в вашем конкретном случае решать вам, опытным путем. Вариант с новым MySQL наверняка будет лучше, а вариант с отдельным подсчетом будет приемлим только в случае несложной выборки WHERE по индексам. Последний вариант, для примера, реализован в phpMyAdmin
Обсудить в ФОРУМе - комментариев ()
Путь: >
Базы данных
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|