Собственно разбивка, точнее арифметика, 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 "
"
.$row['field1'].""; $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 наверняка будет лучше, а вариант с отдельным подсчетом будет приемлим только в случае несложной выборки WHERE по индексам. Последний вариант, для примера, реализован в phpMyAdmin
У нас разработка сайта Киев так же подразумевает использование различных скриптов и технологий. |