Nakon ovog poglavlja
Što ćete znati napraviti
- Otvoriti PDO vezu s predvidivim postavkama.
- Izvršiti pripremljeni upit i mapirati rezultat.
- Potvrditi ili vratiti transakciju uz try/catch.
Jedno kontrolirano mjesto
Veza s ispravnim charsetom i iznimkama
DSN opisuje driver, host, bazu i charset. Korisničko ime i lozinka dolaze iz okoliša, ne iz commita. ERRMODE_EXCEPTION pretvara kvar baze u iznimku, a isključene emulirane pripreme koriste nativne pripremljene upite kada driver to podržava.
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=phpnova;charset=utf8mb4',
getenv('DB_USER') ?: '',
getenv('DB_PASSWORD') ?: '',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
Vrijednost nije SQL
Parametar odvaja podatak od naredbe
Placeholder rezervira mjesto za vrijednost. Driver šalje strukturu upita odvojeno od vrijednosti pa korisnički tekst ne može postati SQL sintaksa. Parametar ne može predstavljati naziv stupca ili smjer sortiranja; takve dijelove biramo iz allowliste.
<?php
$statement = $pdo->prepare(
'SELECT id, title FROM articles WHERE author_id = :author ORDER BY id DESC'
);
$statement->execute(['author' => $authorId]);
$articles = $statement->fetchAll();
Sve ili ništa
Rollback i ponovno bacanje iznimke
Transakciju započinjemo neposredno prije povezane skupine promjena i držimo je kratkom. Ako bilo koji upit ne uspije, vraćamo promjene pa iznimku ponovno bacamo kako viši sloj ne bi pomislio da je operacija uspjela.
<?php
$pdo->beginTransaction();
try {
$debit->execute(['amount' => $amount, 'id' => $fromId]);
$credit->execute(['amount' => $amount, 'id' => $toId]);
$pdo->commit();
} catch (Throwable $exception) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
throw $exception;
}
Primijenite naučeno
Vježba: Repozitorij članaka
Napišite funkcije findById i saveDraft koristeći PDO.
- Sve vrijednosti vežite parametrima.
- Za nepostojeći zapis vratite null ili bacite domensku iznimku.
- Ne vraćajte PDO objekt iz domenskog sloja.
Za provjeru i nastavak