PDO
SQL
Podstawy MySQL i Połączenie z PHP (PDO)
Wprowadzenie Baza Danych i PHP
MySQL (lub MariaDB) to najpopularniejszy system zarządzania relacyjnymi bazami danych (RDBMS) używany z PHP. Aby połączyć się z bazą danych i wykonywać zapytania SQL, używamy w PHP rozszerzenia PDO (PHP Data Objects).
- RDBMS: Bazy przechowują dane w tabelach z relacjami (np. tabela „Klienci" powiązana z tabelą „Zamówienia").
- SQL: Structured Query Language — język komunikacji z bazą (pobieranie, dodawanie, modyfikowanie danych).
- PDO: Nowoczesny, bezpieczny i uniwersalny interfejs do baz danych w PHP (zalecany zamiast starszego
mysqli_).
Baza danych GameVault — inicjalizacja krok po kroku
Zanim napiszesz pierwszy skrypt PHP, musisz mieć działającą bazę danych. Przejdź kolejno przez 4 kroki.
Otwórz XAMPP Control Panel. Kliknij Start przy Apache i MySQL. Oba muszą świecić na zielono.
W przeglądarce wejdź na http://localhost/phpmyadmin. Logowanie: użytkownik root, hasło puste (XAMPP domyślnie).
Kliknij Nowa w lewym panelu. Wpisz nazwę gamevault, kodowanie utf8mb4_unicode_ci, kliknij Utwórz.
Wybierz bazę gamevault, kliknij zakładkę SQL, wklej skrypt z sekcji poniżej i kliknij Wykonaj.
Schemat relacji tabel (ERD)
Opis tabel
🧑 gracze
Konta użytkowników sklepu. gracz_id to unikalny identyfikator (PK). nick jest UNIQUE — dwóch graczy nie może mieć tego samego nicku. Jeden gracz może mieć wiele zakupów.
🎮 gry
Katalog gier w sklepie. gatunek pozwala filtrować po typie (RPG, FPS…). wydawca_id to klucz obcy — każda gra należy do wydawcy. CHECK pilnuje, że cena nie jest ujemna.
🛒 zakupy
Tabela łącząca graczy z grami — realizuje relację wiele-do-wielu. Jeden gracz kupuje wiele gier, jedną grę może kupić wielu graczy. Przechowuje historyczną cenę i datę zakupu.
Skrypt inicjalizacyjny — wklej do phpMyAdmin → zakładka SQL
gracze, gry, zakupy, wydawcy.
PDO Krok 1: Nawiązanie Połączenia
Połączenie z bazą danych ustanawiamy przez obiekt PDO. Wszelkie operacje bazodanowe wykonuje się za jego pomocą. Zapisz poniższy kod jako polaczenie.php i dołączaj go do kolejnych plików przez require_once 'polaczenie.php';.
$host = 'localhost';
$baza = 'gamevault'; // nazwa bazy utworzonej w phpMyAdmin
$user = 'root';
$haslo = ''; // XAMPP: domyślnie puste
$charset = 'utf8mb4';
// DSN = Data Source Name — mówi PDO jak i gdzie się połączyć
$dsn = "mysql:host=$host;dbname=$baza;charset=$charset";
$opcje = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // błędy jako wyjątki
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // $row['kolumna']
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $haslo, $opcje);
// echo "Połączono pomyślnie!";
} catch (\PDOException $e) {
echo "Błąd połączenia: " . $e->getMessage();
}
?>
Konstrukcja try...catch jest kluczowa — obsługuje błędy połączenia (np. brak serwera lub złe hasło).
SQL Krok 2: Proste Zapytania (SELECT)
Do pobierania danych używamy instrukcji SQL SELECT. Wywołaj metodę query() na obiekcie PDO, a następnie iteruj przez wyniki pętlą.
Instrukcja SELECT i wyświetlanie wyników
require_once 'polaczenie.php'; // $pdo gotowy do użycia
$stmt = $pdo->query('SELECT nick, kraj FROM gracze ORDER BY nick');
echo "<ul>";
// Pobieramy wiersz po wierszu — $row to tablica asocjacyjna
while ($row = $stmt->fetch()) {
// $row['nick'] i $row['kraj'] to klucze = nazwy kolumn SQL
echo "<li>{$row['nick']} ({$row['kraj']})</li>";
}
echo "</ul>";
?>
Ponadpodstawowe Krok 3: Złożone Zapytania (JOIN)
Aby połączyć dane z kilku tabel w jednym wyniku, używamy instrukcji JOIN (łączenia).
- Relacja 1:Wiele: Jeden gracz ma wiele zakupów.
- INNER JOIN: Zwraca tylko wiersze powiązane w obu tabelach.
Przykład JOIN — zakupy graczy z tytułami gier
FROM gracze g
INNER JOIN zakupy z ON g.gracz_id = z.gracz_id
INNER JOIN gry gr ON z.gra_id = gr.gra_id
ORDER BY g.nick;
require_once 'polaczenie.php';
$sql = 'SELECT g.nick AS gracz, gr.tytul AS gra, z.data_zakupu
FROM gracze g
JOIN zakupy z ON g.gracz_id = z.gracz_id
JOIN gry gr ON z.gra_id = gr.gra_id
ORDER BY g.nick';
$zakupy = $pdo->query($sql)->fetchAll();
foreach ($zakupy as $r) {
echo "<p>{$r['gracz']} kupił: {$r['gra']} ({$r['data_zakupu']})</p>";
}
?>
"SELECT * WHERE nick='" . $_GET['n'] . "'").
Używaj Prepared Statements, aby uniknąć ataków SQL Injection.
Ćwiczenie Zadania Praktyczne
Zadanie 1: Połączenie i Proste Pobieranie (Podstawowe)
Połącz się z bazą gamevault i wyświetl listę wszystkich graczy.
Zadanie 2: Prepared Statement z Parametrem (Ponadpodstawowe)
Pobierz gry wybranego gatunku — gatunek jako parametr URL (?gatunek=RPG).
Rozwiązania Przykładowy Kod PHP
Rozwiązanie Zadania 1 — polaczenie.php + gracze.php
$host = 'localhost'; $baza = 'gamevault'; $user = 'root'; $haslo = '';
$dsn = "mysql:host=$host;dbname=$baza;charset=utf8mb4";
$opcje = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
try { $pdo = new PDO($dsn, $user, $haslo, $opcje); }
catch (\PDOException $e) { echo "Błąd: " . $e->getMessage(); exit; }
?>
<?php // gracze.php
require_once 'polaczenie.php';
$stmt = $pdo->query('SELECT nick, kraj FROM gracze ORDER BY nick');
echo "<h2>Lista graczy GameVault</h2><ul>";
while ($row = $stmt->fetch()) {
echo "<li>{$row['nick']} ({$row['kraj']})</li>";
}
echo "</ul>";
?>
Rozwiązanie Zadania 2 — Prepared Statement z parametrem URL
require_once 'polaczenie.php';
// Pobieramy parametr z URL: ?gatunek=RPG (domyślnie RPG)
$gatunek = $_GET['gatunek'] ?? 'RPG';
// Krok 1: przygotuj zapytanie z placeholderem ?
$stmt = $pdo->prepare('SELECT tytul, cena FROM gry WHERE gatunek = ? ORDER BY cena DESC');
// Krok 2: wykonaj bezpiecznie — PDO samo zabezpieczy dane
$stmt->execute([$gatunek]);
$gry = $stmt->fetchAll();
echo "<h2>Gry z gatunku: $gatunek</h2>";
echo "<table border='1' cellpadding='8'><tr><th>Tytuł</th><th>Cena</th></tr>";
foreach ($gry as $g) {
echo "<tr><td>{$g['tytul']}</td><td>{$g['cena']} zł</td></tr>";
}
echo "</table>";
?>
Materiały Narzędzia i Linki
- PHP Manual: PDO Manual — oficjalna dokumentacja, podstawa nowoczesnego PHP.
- W3Schools SQL: SQL JOIN — wizualizacja różnych typów łączeń tabel.
- Bezpieczeństwo: Wyszukaj „PHP PDO prepared statements" — klucz do bezpiecznej komunikacji z bazą danych.