Hoofdstuk 23: Database Koppeling met PDO

← Terug naar overzicht

Verbinden met een database

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.

Oefening 1

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.

Jouw code:

Oefening 2

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".

Jouw code:

Data ophalen met SELECT

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.

Oefening 1

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.)

Jouw code:

Oefening 2

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".

Jouw code:

Oefening 3

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".

Jouw code:

Oefening 4

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".

Jouw code:

Data toevoegen, wijzigen en verwijderen

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();
?>

Oefening 1

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".

Jouw code:

Oefening 2

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".

Jouw code:

Oefening 3

Schrijf een DELETE-query om het product met id 3 te verwijderen. Gebruik prepare() met een named placeholder. Toon "Product verwijderd".

Jouw code:

Oefening 4

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".

Jouw code:

Samenvatting