niedziela,
PHP, MySQL i paginacja
Paginacja w kontekście PHP i MySQL odnosi się do techniki dzielenia zawartości na mniejsze, łatwiejsze do zarządzania części, które są wyświetlane na różnych stronach. Jest to powszechnie stosowane w aplikacjach internetowych do prezentowania dużych zestawów danych, takich jak wyniki wyszukiwania, listy produktów w sklepach internetowych lub posty na blogach, w sposób, który jest łatwy do przeglądania dla użytkownika. Zamiast wczytywać i wyświetlać cały zestaw danych na jednej stronie, co może wpłynąć na wydajność strony i doświadczenia użytkownika, paginacja pozwala na wczytywanie danych partiami i prezentowanie ich na wielu stronach.
Przykładowa tabela bazy danych
Tabela kanaly_tv jest przeznaczona do przechowywania informacji o kanałach telewizyjnych i składa się z trzech kolumn.
- id – klucz główny;
- nazwa – przechowuje nazwę kanału telewizyjnego;
- numer – numer kanału.
Przykładowa tabela wraz z danymi jest dostępna do pobrania w formie kodu SQL: kanaly_tv.
Ogólny schemat działania skryptu
- Nawiązanie połączenia z bazą danych.
- Ustalenie parametrów dla stronicowania.
- Pobranie całkowitej liczby rekordów w tabeli, aby obliczyć liczbę stron.
- Wykonanie zapytania SQL, aby pobrać odpowiednią porcję danych z tabeli.
- Dane są wyświetlane w tabeli HTML.
- Generowane są linki do poszczególnych stron stronicowania.
Kompletny skrypt
Pamiętaj, aby dostosować wartości 'nazwa_hosta', 'nazwa_uzytkownika', 'haslo', 'nazwa_bazy_danych' do swojego środowiska oraz zmienić nazwę skryptu (w linkach) 'index.php' na właściwą.
<?php
// Parametry połączenia z bazą danych
$servername = "nazwa_hosta";
$username = "nazwa_uzytkownika";
$password = "haslo";
$dbname = "nazwa_bazy_danych";
// Tworzenie połączenia
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Sprawdzenie połączenia
if (!$conn) {
die("Błąd połączenia: " . mysqli_connect_error());
}
// Ustawienia stronicowania
$naStronie = 10; // Liczba rekordów na stronie
if (isset($_GET['strona'])) {
$aktualnaStrona = (int)$_GET['strona'];
} else {
$aktualnaStrona = 1;
}
$start = ($aktualnaStrona - 1) * $naStronie;
// Pobieranie liczby rekordów
$query = "SELECT COUNT(*) AS liczbaRekordow FROM kanaly_tv";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
$liczbaRekordow = $row['liczbaRekordow'];
// Obliczanie liczby stron
$liczbaStron = ceil($liczbaRekordow / $naStronie);
// Pobieranie danych z bazy
$query = "SELECT nazwa, numer FROM kanaly_tv LIMIT $start, $naStronie";
$result = mysqli_query($conn, $query);
echo "<table border='1'>";
echo "<tr><th>Nazwa</th><th>Numer</th></tr>";
while($row = mysqli_fetch_assoc($result)) {
echo "<tr><td>" . $row["nazwa"] . "</td><td>" . $row["numer"] . "</td></tr>";
}
echo "</table>";
// Wyświetlanie linków do stron
for ($strona = 1; $strona <= $liczbaStron; $strona++) {
echo "<a href='index.php?strona=$strona'>$strona</a> ";
}
// Zamykanie połączenia
mysqli_close($conn);
?>
Objaśnienie kodu
Połączenie z bazą danych
$servername = "nazwa_hosta";
$username = "nazwa_uzytkownika";
$password = "haslo";
$dbname = "nazwa_bazy_danych";
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Błąd połączenia: " . mysqli_connect_error());
}
Na początku nawiązywane jest połączenie z bazą danych MySQL:
- należy zdefiniować parametry połączenia: host, nazwę użytkownika, hasło, oraz nazwę bazy danych;
- funkcja
mysqli_connect
służy do nawiązania połączenia; - jeśli połączenie się nie powiedzie, skrypt kończy działanie, wyświetlając komunikat o błędzie.
Ustawienia stronicowania
$naStronie = 10;
if (isset($_GET['strona'])) {
$aktualnaStrona = (int)$_GET['strona'];
} else {
$aktualnaStrona = 1;
}
$start = ($aktualnaStrona - 1) * $naStronie;
Konfiguracja stronicowania:
- ustalenie ile rekordów ma być wyświetlanych na jednej stronie (
$naStronie
); - sprawdzenie, czy w URL-u jest parametr
strona
(np.index.php?strona=2
), jeśli tak, aktualna strona otrzymuje tę wartość, w przeciwnym 1 (od pierwszej strony). - obliczenia, od którego rekordu należy zacząć wyświetlanie na danej stronie.
Pobieranie całkowitej liczby rekordów
$query = "SELECT COUNT(*) AS liczbaRekordow FROM kanaly_tv";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
$liczbaRekordow = $row['liczbaRekordow'];
Ten fragment służy do określenia, ile łącznie jest rekordów w tabeli kanaly_tv
, jest to potrzebne do obliczenia liczby stron:
- wykonanie zapytania SQL, aby uzyskać liczbę wszystkich rekordów;
- wynik zapytania jest przekształcany na tablicę asocjacyjną, z której pobierana jest liczba rekordów.
Wyświetlanie danych z właściwej strony
$query = "SELECT nazwa, numer FROM kanaly_tv LIMIT $start, $naStronie";
$result = mysqli_query($conn, $query);
echo "<table border='1'>";
while($row = mysqli_fetch_assoc($result)) {
echo "<tr><td>" . $row["nazwa"] . "</td><td>" . $row["numer"] . "</td></tr>";
}
echo "</table>";
- W tym fragmencie pobierane są dane z tabeli
kanaly_tv
zaczynając od rekordu$start
i ograniczając ilość do$naStronie
. - Następnie dane są wyświetlane w formie tabeli HTML.
Generowanie linków do stron
for ($strona = 1; $strona <= $liczbaStron; $strona++) {
echo "<a href='index.php?strona=$strona'>$strona</a> ";
}
Generowanie linków do każdej strony. Użytkownik może kliknąć numer strony, aby przejść do odpowiedniej części danych.
Zamykanie połączenia
mysqli_close($conn);
Jawne zakończenie połączenia z z bazą danych.
Bezpieczeństwo
Warto zauważyć, że ten skrypt nie zawiera funkcji zabezpieczających przed atakami typu SQL Injection. W praktycznym zastosowaniu zaleca się stosowanie przygotowanych zapytań (ang. prepared statements) dla bezpieczeństwa. Ponadto, warto zweryfikować i oczyścić wszystkie dane wejściowe otrzymywane od użytkownika.
Przykład prezentuje bardzo prosty mechanizm, można go rozbudować o kolejne funkcje, takie jak m.in. możliwość nawigacji wstecz.