Собственно разбивка, точнее арифметика, 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 |