W budowie
Architektura aplikacji webowej, wzorce przepływu danych i obiektowe zapytania w PDO

Część 20 · Architektura aplikacji, wzorzec PRG i standard PDO — kurs PHP INF.03

Część 20 kursu PHP pod kątem INF.03: architektura aplikacji webowej, wzorzec PRG (Post-Redirect-Get), komunikaty Flash w sesji oraz obiektowy standard PDO. 16 ćwiczeń z automatycznym sprawdzaniem.

  • 45 min
  • 16 slajdów
  • Notatki nauczyciela: N
  • Strona modułu: otwórz
Plan · 45 min

Co dziś robimy

  1. 12 minPodział aplikacji na pliki Pliki współdzielone dołączamy przez require (błąd zatrzymuje skrypt) lub include (błąd…
  2. 12 minWzorzec POST-Redirect-GET Schemat jest prosty: odbierz POST, zapisz dane, ustaw komunikat w sesji i wywołaj…
  3. 12 minPDO, wyjątki i transakcje Tryb wyjątków ( ERRMODE_EXCEPTION ) sprawia, że błąd bazy przerywa skrypt i można go…
  4. 4 minĆwiczenia 16 zadań w module — wybierz 3–4 na lekcję
  5. 5 minPodsumowanie bilet wyjściowy i zadanie domowe
Atom 1 z 4 · ~12 min

Podział aplikacji na pliki

Zamiast jednego długiego pliku dzielimy aplikację na części: konfigurację połączenia, funkcje pomocnicze i osobne strony widoków. Dzięki temu tę samą bazę i funkcje wykorzystuje wiele podstron.

  • Pliki współdzielone dołączamy przez require (błąd zatrzymuje skrypt) lub include (błąd daje ostrzeżenie).
  • W praktyce bezpieczniej używać require_once .
  • Warto trzymać konfigurację poza katalogiem publicznym.
  • Plik z hasłem do bazy nie powinien być dostępny pod adresem w przeglądarce.
Kod · atom 1 · ~3 min

Jak to wygląda w kodzie

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/funkcje.php';

$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

$uczniowie = $pdo->query('SELECT imie FROM uczniowie')->fetchAll();
Przykład na żywo · atom 1 · ~3 min

Uruchom i pokaż

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/funkcje.php';

$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

$uczniowie = $pdo->query('SELECT imie FROM uczniowie')->fetchAll();
Sprawdzenie · atom 1 · ~2 min

Pytanie do klasy

Czym różni się require od include?

Atom 2 z 4 · ~12 min

Wzorzec POST-Redirect-GET

Po zapisie danych z formularza przekierowujemy użytkownika na inną stronę. Wzorzec nazywa się POST-Redirect-GET i chroni przed ponownym wysłaniem formularza po odświeżeniu.

  • Schemat jest prosty: odbierz POST, zapisz dane, ustaw komunikat w sesji i wywołaj header('Location: ...') , a potem exit .
  • Na stronie docelowej odczytaj i usuń komunikat.
  • Komunikat w sesji nazywa się często „flash”.
  • Dzięki niemu po przekierowaniu nadal można pokazać informację o sukcesie.
Kod · atom 2 · ~3 min

Jak to wygląda w kodzie

session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // zapis danych
    $_SESSION['komunikat'] = 'Zapisano zgloszenie';
    header('Location: lista.php');
    exit;
}

$komunikat = $_SESSION['komunikat'] ?? '';
unset($_SESSION['komunikat']);
echo $komunikat ? '<p>' . $komunikat . '</p>' : '';
Przykład na żywo · atom 2 · ~3 min

Uruchom i pokaż

session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // zapis danych
    $_SESSION['komunikat'] = 'Zapisano zgloszenie';
    header('Location: lista.php');
    exit;
}

$komunikat = $_SESSION['komunikat'] ?? '';
unset($_SESSION['komunikat']);
echo $komunikat ? '<p>' . $komunikat . '</p>' : '';
Sprawdzenie · atom 2 · ~2 min

Pytanie do klasy

Po co przekierowanie po POST?

Atom 3 z 4 · ~12 min

PDO, wyjątki i transakcje

PDO to wspólny interfejs do różnych baz. Dzięki temu kod wygląda tak samo dla MySQL i SQLite, a zapytania przygotowane są domyślnie dostępne.

  • Tryb wyjątków ( ERRMODE_EXCEPTION ) sprawia, że błąd bazy przerywa skrypt i można go obsłużyć w try/catch .
  • To czytelniejsze niż sprawdzanie wyniku po każdym zapytaniu.
  • Transakcja grupuje kilka operacji: beginTransaction() , potem zapytania, na końcu commit() albo rollBack() przy błędzie.
  • Dzięki temu dane nie zostaną zapisane połowicznie.
Kod · atom 3 · ~3 min

Jak to wygląda w kodzie

try {
    $pdo->beginTransaction();
    $pdo->prepare('INSERT INTO zamowienia (klient) VALUES (?)')->execute(['Ola']);
    $pdo->prepare('UPDATE stany SET sztuk = sztuk - 1 WHERE id = ?')->execute([3]);
    $pdo->commit();
    echo 'Zapisane';
} catch (Throwable $e) {
    $pdo->rollBack();
    echo 'Blad zapisu';
}
Przykład na żywo · atom 3 · ~3 min

Uruchom i pokaż

try {
    $pdo->beginTransaction();
    $pdo->prepare('INSERT INTO zamowienia (klient) VALUES (?)')->execute(['Ola']);
    $pdo->prepare('UPDATE stany SET sztuk = sztuk - 1 WHERE id = ?')->execute([3]);
    $pdo->commit();
    echo 'Zapisane';
} catch (Throwable $e) {
    $pdo->rollBack();
    echo 'Blad zapisu';
}
Sprawdzenie · atom 3 · ~2 min

Pytanie do klasy

Co daje PDO::ERRMODE_EXCEPTION?

Zamknięcie · ~3 min

Co zabrać z lekcji

  • Pliki współdzielone dołączamy przez require (błąd zatrzymuje skrypt) lub include (błąd daje ostrzeżenie).
  • Schemat jest prosty: odbierz POST, zapisz dane, ustaw komunikat w sesji i wywołaj header('Location: ...') , a potem exit .
  • Tryb wyjątków ( ERRMODE_EXCEPTION ) sprawia, że błąd bazy przerywa skrypt i można go obsłużyć w try/catch .
  • Ćwiczenia
Bilet wyjściowy: Kiedy rollBack()?
Odpowiedź: c) Przy błędzie
Hyżyk· Część 20 · Architektura aplikacji, wzorzec PRG i standard PD moduł 1 / 1