Jestem początkujący, ale pokaże Ci co ja zrobiłem:
(Większość komentarzy w j.ang ponieważ tak już się nauczyłem, polskie dopisane teraz)
Ten fragment zajmuje się łączeniem z bazą, i liczeniem potrzebnych limitów:
<?php
//do strony przekazany jest $page = $_GET['page'], oczywiście po sprawdzeniach
$conn = dbConnect(); //moja funkcja do łączenia się z bazą danych, Ty możesz mieć inną
// Check number of rows (for pagination)
$count = 'SELECT * FROM news';
// Count limit for results
$show_limit = 10; // określa ile ma być newsów na stronie
$max_pages = ceil($numRows/$show_limit); $page = ($page = 0
|| !$page || !is_numeric($page) ? 1
: $page); $page = ($page <= $max_pages ? $page : $max_pages);
$limit_start = ($page * $show_limit) - $show_limit; //określa jaki będzie LIMIT w poleceniu SQL
?>
Teraz mając już $max_pages i $limit_start mogę zapytać SQL
<?php
// SQL query for get news
$sql = "SELECT * FROM `news` ORDER BY `news_date` DESC LIMIT $limit_start, $show_li
mit";
?>
Następnie wyświetlam wyniki normalnie za pomocą while , a na samym dole dodaję:
<?php
paginate($page, $max_pages);
?>
A teraz jak wygląda sama funkcja paginate():
<?php
function paginate($cur_page, $last_page, $number = 1)
{
$real_number = ($number * 2) +1;
if ($last_page < $real_number) {$istart = 1; $iend = $last_page;}
elseif ($cur_page == 1) {$istart = 1; $iend = 1 + ($number * 2);}
elseif ($cur_page == $last_page) {$istart = $cur_page - ($number * 2); $iend = $cur_page;}
else {
if ($cur_page + $number > $last_page) {
$iend = $last_page;
$istart = $last_page - ($number * 2);
} elseif ($cur_page - $number < 1) {
$istart = 1;
$iend = ($number * 2 + 1);
} else {
$istart = $cur_page - $number; $iend = $cur_page + $number;
}
}
echo '<div id="pagination">'; echo '<li class="pgn1st">'; echo '<a href="?page=1" id="paginfirst'; if ($cur_page == 1
) {echo 'none';}; echo '"><span>first</span></a></li>'; echo '<li class="pgnprev"><a href="?page='.($cur_page == 1 ? 1
: $cur_page-1).'" id="paginprev'; if ($cur_page == 1
) {echo 'none';}; echo '"><span>prev</span></a></li>'; for($i=$istart; $i<=$iend; $i++)
{
echo '<li class="num"><a href="?page='.$i.'"'; if ($i == $cur_page) {echo ' class="active"';}; }
echo '<li class="pgnnext"><a href="?page='.($cur_page == $last_page ?
$cur_page : $cur_page + 1).'" id="paginnext'; if ($cur_page == $last_page) {echo 'none';}; echo '"><span>next</span></a></li>'; echo '<li class="pgnlast"><a href="?page='.$last_page.'" id="paginlast'; if ($cur_page == $last_page) {echo 'none';}; echo '"><span>last</span></a></li>'; }
?>
Funkcja wyświetla paginator w postaci:
<< < 1 2 3 > >>
Czyli
FIRST PREV 1 2 3 NEXT LAST
Dla 9 podstron, gdy będziemy znajdowali się na przykład na 6 będzie to wyglądać tak:
FIRST PREV 5 6 7 NEXT LAST
Przy czym można jej wstawić opcjonalny parametr
paginate($page, $max_pages, OPCJA);
Który może wynosić 2, 3 itp ... określa ile będzie cyferek ... dla 2 będzie to od 1 do 5 , dla 3 od 1 do 7 ...
Paginator podświetla aktualną stronę, jeśli stron jest mniej niż limit to wyświetla ich mniej...
Oparty jest na listach i wyświetla listę w postaci:
<div id="pagination"><ul> <li class="pgn1st"><a href="?page=1" id="paginfirstnone"><span>first
</span></a></li> <li class="pgnprev"><a href="?page=1" id="paginprevnone"><span>prev
</span></a></li> <li class="num"><a href="?page=1" class="active">1
</a></li> <li class="num"><a href="?page=2">2
</a></li> <li class="pgnnext"><a href="?page=2" id="paginnext"><span>next
</span></a></li> <li class="pgnlast"><a href="?page=2" id="paginlast"><span>last
</span></a></li>
Czyli bardzo łatwo to ostylować

Tutaj przykład dla 14 newsów w bazie i limitu 10 na strone, więc tylko 2 podstrony

Dodatkowo, FIRST, PREV , LAST, NEXT mają style z dopiskiem none gdy już nie ma dalszych stron do wyświetlenia (np jeśli znajdujemy się na stronie 9 z 9 to dalej już nie będzie NEXT i LAST ... można wtedy je ostylować jako szare lub display:none)
FIRST PREV NEXT LAST są w SPAN, by można było je zastąpić obrazkami (wtedy dla spanów display:none)
Linki w postaci jakasstrona.php?page=1
Skrypt jak widać amatorski, ale u mnie działa ... jak się podszkolę to napiszę sobie lepszy, na razie ten musi starczyć