Постраничный вывод результата

Постраничный вывод результата
Собственно разбивка, точнее арифметика, 3-ий класс
$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;
}
?>
Найдено:
Страница: из
// вывести страницы для выбора
for ($i = 1; $i <= $countedpages; $i++) {
if ($currentpage!=$i) {
echo ".$PHP_SELF."?show=".$showperpage."&page=".$i."\">".$i."";
} else {
echo $i;
}
echo " ";
}
?>
if (!mysql_num_rows($result)){
echo "
По запросу ничего не найдено
";} else {
$i = $start_pos;
echo ".$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 "
- "
$i++;
}
echo "";
}
?>
Эффективность
Как видите, в коде заложена не совсем эффективная концепция. Сначала мы возвращаем все результаты из SQL запроса, а потом делаем навигацию в полученном результате. С точки зрения правильного подхода неэффективно вытягивать все строки а потом выводить только нужные. MySQL позволяет ещё на стадии написания SQL запроса ограничить результат только текущеё страницей через инструкцию LIMIT. Например чтобы вывести 3-ю страницу с 20 строками достаточно написать
$result=mysql_query("SELECT * FROM table WHERE .... LIMIT 40, 20");
while ($row=mysql_fetch_array($result)){
echo $row['field1'];
}
?>
но тогда возникает проблема подсчета всех страниц. Как узнать сколько бы вернул запрос записей без ограничения LIMIT? Выхода два:
- Если Вам повезло с версией MySQL > 4.0.x то сделать так:
$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];
?> - Предварительно сделать SELECT COUNT(id) FROM table WHERE...
Будут ли эти варианты эффективнее в вашем конкретном случае решать вам, опытным путем. Вариант с новым MySQL наверняка будет лучше, а вариант с отдельным подсчетом будет приемлим только в случае несложной выборки WHERE по индексам. Последний вариант, для примера, реализован в phpMyAdmin. В нашей веб-студии разработка сайта Винница так же не обходится бес использования скрипта постраничного вывода данных.