За неимением времени прошу поделиться сабжем, чем больше тем лучше. Хорошо, если свои, не выдернутые из порталов.
А он всего один: 1. Определяешь общее количество сообщений. 2. Делишь на 10 (если надо 10 записей на странице) и округляешь в большую сторону - так определишь сколько всего страниц получится. 3. Делаешь запрос с лимитом (номер страницы умноженый на 10)
PHP: // Переменная хранит число пользователей выводимых на станице $num = 20; // Извлекаем из URL текущую страницу $page = $_GET['page']; // Определяем общее число пользователей в базе данных $result = mysql_query("SELECT COUNT(*) as cnt FROM `users`"); $users = mysql_result($result, 0, "cnt"); // Находим общее число страниц $total = intval(($users - 1) / $num) + 1; // Определяем начало сообщений для текущей страницы $page = intval($page); // Если значение $page меньше единицы или отрицательно // переходим на первую страницу // А если слишком большое, то переходим на последнюю if(empty($page) || $page < 0) $page = 1; if($page > $total) $page = $total; // Вычисляем начиная к какого номера // следует выводить сообщения $start = $page * $num - $num; $result = mysql_query("SELECT * FROM `users` ORDER by `id` ASC LIMIT $start, $num"); for ($i = 0; $i < mysql_num_rows($result); $i++) { //Здесь пишешь то, что должно выводиться на странице N раз } //Вводим ссылки на др.страницы $file = 'users.php'; if ($page != 1) $pervpage = "<a href= ./$file?page=1><< </a>"; // <a href= ./$file?page=". ($page - 1) ."><</a> "; // Проверяем нужны ли стрелки вперед if ($page != $total) $nextpage = #"<a href= ./$file?page=". ($page + 1) .">></a> "<a href= ./$file?page=" .$total. "> >></a>"; // Находим две ближайшие станицы с обоих краев, если они есть if($page - 2 > 0) $page2left = " <a href= ./$file?page=". ($page - 2) .">". ($page - 2) ."</a> | "; if($page - 1 > 0) $page1left = "<a href= ./$file?page=". ($page - 1) .">". ($page - 1) ."</a> | "; if($page + 2 <= $total) $page2right = " | <a href= ./$file?page=". ($page + 2) .">". ($page + 2) ."</a>"; if($page + 1 <= $total) $page1right = " | <a href= ./$file?page=". ($page + 1) .">". ($page + 1) ."</a>"; // Вывод меню echo $page2left.$page1left."<b>".$page."</b>".$page1right.$page2right; }
Вот мой вариант. Его писал не я и вообще не помню откуда он у меня, но работает хорошо. Итак: $index = номер страницы; $count = общее число элементов; $delimiter = количество элементов на странице; $href_link = шаблон ссылки где (%) - подстановка номера страницы; $count_list= количество ссылок на другии листы помимо активного; В запросе использовать: Code: LIMIT ( $index - 1 ) * $delimiter, $delimiter Сама функция: Code: <?php function string_spliter($index, $count, $delimiter, $href_link, $count_list = 10) { $max_c = intval($count_list / 2) - 1; //$text .= '<center>'; if ($count <= $delimiter) { return ; } else { $max_int = intval($count / $delimiter); $max = $count / $delimiter; $c_max = $max > $max_int ? $max_int + 1 : $max_int; if ($max_int > ($max_c * 2 + 1)) { $r_min = ($index - $max_c >= 1) ? $index - $max_c : 1 ; $r_max = ($index + $max_c <= $c_max) ? $index + $max_c : $c_max; if ($r_min < $max_c + 1) { $r_max = $r_min + $max_c + $max_c; } if ($r_max - $r_min < $max_c * 2 ) { $r_min = $r_max - $max_c - $max_c ; } } else { $r_min = 1; $r_max = $c_max; } $r_min = $r_min < 1 ? 1 : $r_min; $r_max = $r_max > $c_max ? $c_max : $r_max; if ($index > 1) { $link = str_replace('(%)', $index - 1 , $href_link); $array[] = '<a href="' . $link . '">«</a> '; } else { $array[] = ' '; } for ($i = $r_min; $i <= $r_max; $i++) { $link = str_replace('(%)', $i, $href_link); $t = ($i == $index) ? $i . ' ' : "<a href='$link'>$i</a> "; $array[] = $t; } if ($index < $c_max) { $link = str_replace('(%)', $index + 1 , $href_link); $array[] = '<a href="' . $link . '">»</a>'; } else { $array[] = ' '; } } if (is_array($array)) { $text = '<center><table><tr>'; foreach ($array as $cell) { $text .= '<td>' . $cell . '</td>'; } $text .= '</tr></table></center>'; } return $text; } $step = $_GET['step']; $step = $step == null ? 1 : $step; echo string_spliter($step, 120, 10, 'test2.html?step=(%)'); ?>
да мне щас не до этого особо. Писал не я да и ладно. Вот зато кто то поставил плюс в репу даже не прочитав мой пост... =\
А вот мой вариант уже непосредственно самого вывода списка страниц. Подходит, когда страниц много (обрезает там всякие штуки) PHP: function pages($count,$current,$link) { function dolink($num,$text,$link) { return "<a style=\"text-decoration: none\" href=\"".str_replace("%num",$num,$link)."\">$text</a>|"; } if ($count <= 1 || $current < 1 || $current > $count) return ""; $result = "|"; $left = ""; $right = ""; $center = ""; $ll = true; $lr = true; for ($i = 1; $i <= $count; $i++) { if ($i >= $current - 2 && $i <= $current + 2) if ($i == $current) $center .= "<b>$i</b>|"; else $center .= dolink($i,$i,$link); if ($i < 4) if ($i >= $current - 2 && $i <= $current + 2) $ll = false; else $left .= dolink($i,$i,$link); if ($i > $count - 3) if ($i >= $current - 2 && $i <= $current + 2) $lr = false; else $right .= dolink($i,$i,$link); } if ($current > 1) $result .= dolink($current - 1,"<",$link); if ($left != "") { $result .= $left; if ($ll && $current != 6) $result .= "...|"; } $result .= $center; if ($right != "") { if ($lr && $current != $count - 5) $result .= "...|"; $result .= $right; } if ($current < $count) $result .= dolink($current + 1,">",$link); return $result; } $count - количество страниц $current - номер текущей страницы $link - формат ссылки (%num - тэг вставки номера страницы) Например: PHP: echo "<center>страница: ".pages(40,27,"index.php?page=%num")."</center>";
Он не поддерживает rewritemod, т.е. делает ссылки вида http://url?next=3, но очень несложно сделать его поддержку, подкорректировав скрипты в директории plugins.