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.
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.
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();
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();
Czym różni się require od include?
Poprawna: d) Brak pliku przy require kończy działanie skryptu.
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.
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>' : '';
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>' : '';
Po co przekierowanie po POST?
Poprawna: b) Odświeżenie nie powtórzy wtedy zapisu.
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.
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';
}
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';
}
Co daje PDO::ERRMODE_EXCEPTION?
Poprawna: a) Błąd można przechwycić w try/catch.