PHP: stronnicowanie

Często prezentując wyniki zapytania z bazy MySQL na swojej stronie za pomocą skryptu PHP uwidacznia się potrzeba podziału tych wyników na poszczególne strony, szczególnie kiedy tych rekordów jest wiele, a skrypt wykonywałby się bardzo długo, aby je załadować. W związku z tym chciałbym Wam przedstawić funkcję do stronnicowania, z której korzystam już jakiś czas. Napisanie własnej funkcji umożliwiającej stronnicowanie jest o tyle dobre, że będziesz mógł ją wykonać w każdym pliku składającym się na skrypt bez konieczności powielania raz już napisanego kodu.

Naszą funkcje umieszczę w pliku functions.php, w którym znajdują się wszystkie funkcje wykorzystywane globalnie. Rozpocznijmy więc o deklaracji argumentów funkcji:

1
function page_number($query, $num, $link, $page) {

Pierwszy argument $page odnosi się do zapytania, które pozwoli nam zobaczyć ile rekordów znajduje się w naszej bazie danych, kolejny $num informuje ile rekordów ma się znajdować na jednej stronie, argument $link jest niczym innym jak adresem do pliku, może przyjmować takie wartości jak np. „news.php” czy „index.php?modules=news”. Ostatni argument $page zwraca numer aktualnej strony skryptu. Przejdźmy teraz do „ciała” funkcji:

1
2
3
$result = mysql_query($query);
$numquery=mysql_num_rows($result);
$numpages = ceil($numquery / $num);

Pierwsze dwie linijki odpowiadają za wywołanie zapytania MySQL oraz zwrócenie liczby rekordów tego zapytania. Natomiast ostatnia linijka zwraca liczbę stron jaką skrypt będzie generował. Teraz musimy wyświetlić kolejne numery stron:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$number_page = '<center>';
if ($numpages > 1) {  
    if ($page > 1) {
        $prevpage = $page - 1 ;
                $number_page .= '<a href="'.$link.'&page='.$prevpage.'">';
                $number_page .= '<<</a> ';
    }
    if($page>6) {
            $number_page .= '<a href="'.$link.'&page='.$page.'>Pierwsza</a>, ..., ';
    }
    for ($i=$page-5; $i < $page+5; $i++) {
        if ($i == $page) {
            $number_page .= '<b>'.$i.'</b>';
        } elseif ($i>0 && $i<=$numpages) {
                        $number_page .= '<a href="'.$link.'&page='.$i.'">'.$i.'</a>';
        }
        if ($i < $numpages && $i>0) {
            $number_page .=', ';
        }
    }
    if($page<$numpages-5) {
                   $number_page .='..., <a href="'.$link.'&page='.$numpages.'">Ostatnia</a>';  
    }
    if ($page < $numpages) {
        $nextpage = $page + 1 ;
                $number_page .=' <a href="'.$link.'&page='.$nextpage.'">';
                $number_page .='>></a>';
    }
}
$number_page .='</center>';

Jak działa powyższy kod? Jeśli stron jest mniej niż 6 wyświetla się tak:

<< 1, 2, 3, 4 >>

Gdzie pogrubiona cyfra, to numer aktualnej strony, a reszta to linki do danej strony. Przy większej ilości stron skrypt wyświetla stronnicowanie tak:

<< Pierwsza, ..., 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, …, Ostatnia >>

Jak wywołać kod w naszym skrypcie? Bardzo prosto, najpierw musisz dołączyć plik functions.php:

1
include("functions.php");

W miejscu, gdzie ma się wyświetlać stronnicowanie umieszczasz:

1
2
3
$query = 'SELECT id FROM news ';
$module_name = 'index.php?id=account';
page_number($query, 15, $module_name, $page);

Pamiętaj również, że argument $page jest zmienną w tym skrypcie, która pobierana jest z adresu skryptu za pomocą $_GET[‚page’], czyli adres skrypt.php?id=news&page=15 powoduje, że zmienna $page przyjmuje wartość „15”. Dodatkowo w skrypcie zadeklaruj:

1
2
3
4
if ($page == '') {
     $page = 1 ;
}
$offset = ($page-1) * 15;

Powoduje to, że w przypadku braku zadeklarowanej zmiennej page przyjmie ona wartość jeden. Natomiast zmienna offset będzie wykorzystywana w zapytaniu, które odpowiada za wyświetlanie rekordów na stronie. Ta zmienna wskazuje miejsce, od którego ma zacząć liczyć kolejne piętnaście rekordów. Należy ją umieścić tak w zapytaniu:

1
$result = mysql_query('SELECT id, title, views, date FROM news ORDER BY date DESC, id DESC LIMIT '.$offset.', 15');

W taki oto sposób możemy funkcję page_number() wykorzystywać w dowolnym pliku, który należy do naszego skryptu.

Comments

PHP: Funkcja generująca przyjazne linki | Arkadiusz Tobiasz

[…] bazę danych, czwarty to dodatkowy tekst i ostatni to numer strony, jeśli korzystamy z numeracji (pisałem o tym wcześniej). W zmiennej $url przedstawiamy strukturę “przyjaznego linku” i wykorzystując […]

Reply

Leave a Comment

twelve − four =