Przejdź do treści

Centrum Kształcenia Zawodowego i Ustawicznego w Mrągowie

PHP, MySQL i paginacja

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

  1. Nawiązanie połączenia z bazą danych.
  2. Ustalenie parametrów dla stronicowania.
  3. Pobranie całkowitej liczby rekordów w tabeli, aby obliczyć liczbę stron.
  4. Wykonanie zapytania SQL, aby pobrać odpowiednią porcję danych z tabeli.
  5. Dane są wyświetlane w tabeli HTML.
  6. 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.

Trzy miesiące temu na naszej stronie…

Artykuł: Pierwszy skrypt bash

Pierwszy skrypt bash

Artykuł: Harmonogram egzaminów maturalnych

Harmonogram egzaminów maturalnych

Artykuł: Staże w Hiszpanii

Staże w Hiszpanii

Artykuł: Conformité Européenne

Conformité Européenne

Artykuł: Display Stream Compression

Display Stream Compression

Artykuł: High Dynamic Range

High Dynamic Range

Nasze technikum

Technik informatyk

Szkoły dla dorosłych

Nasza szkoła

Pełna oferta edukacyjna

Oferta szkoły