| Собственно разбивка, точнее арифметика, 3-ий класс
 <?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>";
 }
 ?>
 
 
 
 
 ЭффективностьКак видите, в коде заложена не совсем эффективная концепция. Сначала мы возвращаем все результаты из SQL запроса, а потом делаем навигацию в полученном результате. С точки зрения правильного подхода неэффективно вытягивать все строки а потом выводить только нужные. MySQL позволяет ещё на стадии написания SQL запроса ограничить результат только текущеё страницей через инструкцию LIMIT. Например чтобы вывести 3-ю страницу с 20 строками достаточно написать
 
 <?php
 $result=mysql_query("SELECT * FROM table WHERE .... LIMIT 40, 20");
 while ($row=mysql_fetch_array($result)){
 echo $row['field1'];
 }
 ?>
 
 
 но тогда возникает проблема подсчета всех страниц. Как узнать сколько бы вернул запрос записей без ограничения LIMIT? Выхода два:
 
 Будут ли эти варианты эффективнее в вашем конкретном случае решать вам, опытным путем. Вариант с новым MySQL наверняка будет лучше, а вариант с отдельным подсчетом будет приемлим только в случае несложной выборки WHERE по индексам. Последний вариант, для примера, реализован в phpMyAdmin
 
 |