O lekcji
Zapytania przygotowane i bindowanie parametrów to bezpieczny i efektywny sposób na interakcję z bazą danych w PHP przy użyciu PDO. Oto szczegółowe przykłady operacji CRUD.
1. Tworzenie (CREATE)
Dodanie nowego rekordu do tabeli uzytkownicy
.
Kod:
<?php
// Połączenie z bazą danych
$dsn = 'mysql:host=localhost;dbname=mojabaza;charset=utf8mb4';
$username = 'root';
$password = '';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Przygotowanie zapytania
$sql = "INSERT INTO uzytkownicy (imie, nazwisko, email) VALUES (:imie, :nazwisko, :email)";
$stmt = $pdo->prepare($sql);
// Przypisanie wartości do parametrów
$stmt->bindParam(':imie', $imie);
$stmt->bindParam(':nazwisko', $nazwisko);
$stmt->bindParam(':email', $email);
// Wartości
$imie = "Jan";
$nazwisko = "Nowak";
$email = "[email protected]";
// Wykonanie zapytania
$stmt->execute();
echo "Nowy użytkownik został dodany.";
} catch (PDOException $e) {
echo "Błąd: " . $e->getMessage();
}
?>
2. Odczyt (READ)
Pobranie wszystkich użytkowników z tabeli.
Kod:
<?php
try {
// Przygotowanie zapytania
$sql = "SELECT id, imie, nazwisko, email FROM uzytkownicy WHERE nazwisko = :nazwisko";
$stmt = $pdo->prepare($sql);
// Przypisanie wartości do parametrów
$nazwisko = "Nowak";
$stmt->bindParam(':nazwisko', $nazwisko);
// Wykonanie zapytania
$stmt->execute();
// Pobranie wyników
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo "ID: {$row['id']} - Imię: {$row['imie']} - Nazwisko: {$row['nazwisko']} - Email: {$row['email']}<br>";
}
} catch (PDOException $e) {
echo "Błąd: " . $e->getMessage();
}
?>
3. Aktualizacja (UPDATE)
Aktualizacja adresu e-mail użytkownika o podanym id
.
Kod:
<?php
try {
// Przygotowanie zapytania
$sql = "UPDATE uzytkownicy SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
// Przypisanie wartości do parametrów
$stmt->bindParam(':email', $email);
$stmt->bindParam(':id', $id);
// Wartości
$email = "[email protected]";
$id = 1;
// Wykonanie zapytania
$stmt->execute();
echo "Adres e-mail użytkownika został zaktualizowany.";
} catch (PDOException $e) {
echo "Błąd: " . $e->getMessage();
}
?>
4. Usuwanie (DELETE)
Usunięcie użytkownika o podanym id
.
Kod:
<?php
try {
// Przygotowanie zapytania
$sql = "DELETE FROM uzytkownicy WHERE id = :id";
$stmt = $pdo->prepare($sql);
// Przypisanie wartości do parametrów
$stmt->bindParam(':id', $id);
// Wartość
$id = 1;
// Wykonanie zapytania
$stmt->execute();
echo "Użytkownik został usunięty.";
} catch (PDOException $e) {
echo "Błąd: " . $e->getMessage();
}
?>
Wyjaśnienia:
- Zapytania przygotowane:
- Zapobiegają atakom SQL Injection, ponieważ dane wejściowe są traktowane jako dane, a nie część zapytania SQL.
- Dzięki temu wstrzyknięcia kodu SQL, np. poprzez
DROP TABLE
, są niemożliwe.
- Metody bindowania parametrów:
bindParam()
:- Wiąże zmienną z nazwanym parametrem.
- Zmienna jest oceniana dopiero w momencie wykonania zapytania (
execute()
).
bindValue()
:- Wiąże wartość bezpośrednio z parametrem, natychmiast.
- Tryb FETCH:
PDO::FETCH_ASSOC
: Pobiera wyniki jako tablice asocjacyjne.- Inne tryby, takie jak
PDO::FETCH_OBJ
, mogą być używane w zależności od potrzeb.
- Obsługa błędów:
- Ustawienie
PDO::ATTR_ERRMODE
naPDO::ERRMODE_EXCEPTION
umożliwia przechwytywanie błędów za pomocątry-catch
.
- Ustawienie
Te przykłady i wyjaśnienia pokazują pełne wykorzystanie PDO z bindowaniem parametrów w operacjach CRUD.