PDO (PHP Data Objects) is de aanbevolen manier om vanuit PHP met een database te communiceren. PDO werkt met MySQL, PostgreSQL, SQLite en meer. Je maakt een verbinding door een nieuw PDO-object aan te maken.
<?php
$host = "localhost";
$dbNaam = "mijn_database";
$gebruiker = "root";
$wachtwoord = "";
$pdo = new PDO("mysql:host=$host;dbname=$dbNaam;charset=utf8mb4", $gebruiker, $wachtwoord);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
De DSN (Data Source Name) bevat het type database, de host en de databasenaam. Met setAttribute() zorgen we ervoor dat PDO exceptions gooit bij fouten, zodat je ze kunt opvangen met try-catch.
Gebruik ALTIJD PDO::ERRMODE_EXCEPTION zodat databasefouten als exceptions worden gegooid. Zonder deze instelling worden fouten stilzwijgend genegeerd.
Let op: In de oefeningen hieronder hoef je GEEN <?php en ?> tags te typen. Het platform regelt dit automatisch. Je typt alleen de PHP-code zelf. De oefeningen simuleren database-interactie — er is geen echte database verbinding nodig.
Schrijf de code om een PDO-verbinding te maken met een MySQL-database. Gebruik host "localhost", databasenaam "school", gebruiker "root", wachtwoord "". Stel de error mode in op ERRMODE_EXCEPTION. Toon daarna "Verbinding geslaagd". Vang fouten op met try-catch en toon het foutbericht.
Schrijf een functie maakVerbinding($host, $dbNaam, $gebruiker, $wachtwoord) die een PDO-object teruggeeft met ERRMODE_EXCEPTION en charset=utf8mb4. Bij een fout, return null. Toon "Functie geschreven".
Om data op te halen gebruik je query() voor eenvoudige queries of prepare() met execute() voor queries met parameters. Het resultaat haal je op met fetch() (één rij) of fetchAll() (alle rijen).
<?php
// Alle leerlingen ophalen
$stmt = $pdo->query("SELECT * FROM leerlingen");
$leerlingen = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($leerlingen as $leerling) {
echo $leerling['naam'] . "<br>";
}
?>
PDO::FETCH_ASSOC zorgt ervoor dat je een associatieve array krijgt met kolomnamen als sleutels.
Gebruik fetchAll(PDO::FETCH_ASSOC) om alle rijen als associatieve arrays op te halen. Gebruik fetch(PDO::FETCH_ASSOC) voor één rij.
Schrijf de code om alle rijen op te halen uit een tabel producten met $pdo->query() en fetchAll(PDO::FETCH_ASSOC). Sla het resultaat op in $producten. Toon "Query geschreven". (Er is geen echte database, de code hoeft niet te draaien.)
Schrijf de code om één leerling op te halen op basis van een id. Gebruik $pdo->prepare() met een placeholder ? en execute() met een array [3]. Haal de rij op met fetch(PDO::FETCH_ASSOC). Toon "Prepared statement geschreven".
Schrijf de code om leerlingen op te halen met een minimumcijfer. Gebruik een named placeholder :cijfer in de query. Gebruik execute() met een associatieve array [':cijfer' => 7]. Toon "Named placeholder geschreven".
Schrijf een functie haalProducten($pdo) die alle producten ophaalt en teruggeeft als array. Schrijf een functie zoekProduct($pdo, $naam) die een product zoekt op naam met een prepared statement en LIKE. Toon "Zoekfuncties geschreven".
Voor INSERT, UPDATE en DELETE gebruik je altijd prepare() en execute(). Gebruik NOOIT variabelen direct in de query — dat leidt tot SQL-injectie (zie volgend hoofdstuk).
<?php
// INSERT
$stmt = $pdo->prepare("INSERT INTO leerlingen (naam, cijfer) VALUES (:naam, :cijfer)");
$stmt->execute([':naam' => 'Jan', ':cijfer' => 8]);
// UPDATE
$stmt = $pdo->prepare("UPDATE leerlingen SET cijfer = :cijfer WHERE id = :id");
$stmt->execute([':cijfer' => 9, ':id' => 1]);
// DELETE
$stmt = $pdo->prepare("DELETE FROM leerlingen WHERE id = :id");
$stmt->execute([':id' => 1]);
// Aantal beïnvloede rijen
echo $stmt->rowCount();
?>
Schrijf een INSERT-query met prepare() en execute() om een nieuw product toe te voegen aan de tabel producten met kolommen naam en prijs. Gebruik named placeholders. Voeg "Laptop" met prijs 999.99 toe. Toon "Product toegevoegd".
Schrijf een UPDATE-query om de prijs van het product met id 5 te wijzigen naar 749.99. Gebruik prepare() met named placeholders. Toon "Prijs bijgewerkt".
Schrijf een DELETE-query om het product met id 3 te verwijderen. Gebruik prepare() met een named placeholder. Toon "Product verwijderd".
Schrijf een functie voegProductToe($pdo, $naam, $prijs) die een product toevoegt en het nieuwe id teruggeeft met $pdo->lastInsertId(). Schrijf een functie verwijderProduct($pdo, $id) die een product verwijdert en het aantal verwijderde rijen teruggeeft met $stmt->rowCount(). Toon "CRUD-functies geschreven".
new PDO($dsn, $gebruiker, $wachtwoord)PDO::ERRMODE_EXCEPTION in voor foutafhandelingquery() voor eenvoudige SELECT-queries zonder parametersprepare() en execute() voor queries met parametersfetchAll(PDO::FETCH_ASSOC) haalt alle rijen op als associatieve arraysfetch(PDO::FETCH_ASSOC) haalt één rij op:naam) of positionele placeholders (?)lastInsertId() geeft het id van de laatst ingevoegde rijrowCount() geeft het aantal beïnvloede rijen bij INSERT/UPDATE/DELETE