Podział rekordów na strony
Często, gdy do wyświetlenia z bazy danych mamy wiele rekordów, postanawiamy podzielić cały materiał na części (strony). Jest to rozwiązanie wygodne i wydajne.
O czym jest artykuł?
Często, gdy do wyświetlenia z bazy danych mamy wiele rekordów, postanawiamy podzielić cały materiał na części (strony). Jest to rozwiązanie wygodne i wydajne. Zaraz przekonamy się także, że dość proste w implementacji. Umożliwimy także zamianę wartości liczby rekordów na stronę.
LIMIT - dyrektywa SQL
Przejdźmy do tego co będzie nam potrzebne. Będzie potrzebna nam na pewno baza danych (tutaj MySQL) z tabelą zawierającą wiele rekordów. W skrypcie będziemy potrzebować także, liczbę rekordów na stronę i wskaźnik od którego wiersza rozpoczynamy. Najprostszym rozwiązaniem byłoby pobranie całej tabeli do PHP i wyświetlenie tylko tej części, którą potrzebujemy. jest to jednak metoda wysoce nieoptymalna. W poniższym artykule zastosuję odpowiednią dyrektywę SQL - Limit.
Zapoznajmy się z tą dyrektywą. Dyrektywa ta ogranicza liczbę wyświetlanych rekordów.
Select * from contacts Limit 10;
Wywołanie powyższego zapytania pobierze pierwsze 10 rekordów. Wszystko pięknie, tylko wystarczy jeszcze dodać numer pierwszego rekordu. Możemy to zrobić w dwojaki sposób, gdyż dyrektywa Limit, która uwzględnia przesunięcie ma 2 warianty.
Select * from contacts Limit 50,25;
Select * from contacts Limit 25 Offset 50;
A teraz kod w PHP
Powyższe dwa zapytania dają dokłanie taki sam rezultat. Dobrze, mamy już główne narzędzie dzielące. Teraz wystarczy napisać kod PHP. Oto on:
![]()
//Połączenie z mysql i wybranie bazy
$link = mysql_connect('localhost','user','passwd');
mysql_select_db('contacts',$link);
![]()
//Domyślne wartości, odpowiednio liczby rekordów na strone i przesunięcia
$count=25;
$offset=0;
![]()
//Pobranie danych z $_GET jezsli ustawione
if(isset($_GET['count']))$count = $_GET['count'];
if(isset($_GET['offset']))$offset = $count*$_GET['offset']; //numer strony
![]()
//Pobranie liczby rekordów
$sql = 'Select count(*) from contacts';
$result = mysql_query($sql,$link);
$r = mysql_fetch_array($result);
//Liczba stron, użycie ceil - zaokrąglenie w górę, w celu zapewnienia, że żadna strona się nie straci
$pages = ceil($r[0]/$count);
![]()
//Pobranie odpowieniej paczki
$sql = 'Select * from contacts Limit '.$count.' offset '.$offset.';';
$result = mysql_query($sql,$link);
![]()
//Początek tabeli
echo '<table><tr><th>Imie i nazwisko</th><th>Telefon</th><th>Mail</th></tr>';
![]()
![]()
//Pętla po wszystkich rekordach
while(($row=mysql_fetch_array($result))!=NULL){
echo '<tr><td>'.$row['name'].'</td><td>'.$row['phone']. '</td><td>'.$row['email'].'</td></tr>';
}
echo '</table>';
![]()
//Pętla po stronach
for($i=0;$i<$pages;$i++){
//jeśli obecna strona, nie twórz linku do strony
if($i*$count==$offset){
echo ' '.$i.' ';
}else{
echo '<a href="index.php?count='.$count.'&offset='.$i.'"> '.$i.' </a>';
}
}
![]()
Na zakończenie
Powyższy kod po drobnych zmianach można dopasować do niemal dowolnej tabeli. Kilka osób może zapytać, czemu nie pobierać wszystkich rekordów skoro i tak pobieramy ich liczbę. Otóż dlatego, że wywołanie count(*) do zliczenia liczby rekordów jest znacznie szybsze niż pobranie wszystkich rekordów z tabeli i sprawdzenie przy pomocy mysql_num_rows.










