PDO

1 Verbinden met een database

🎯 Leerdoelen

💡 Uitleg

PDO (PHP Data Objects) is een moderne manier om met databases te werken in PHP. Het ondersteunt meerdere soorten databases zoals MySQL, SQLite en PostgreSQL, maar in deze lessen gebruiken we alleen MySQL.

image.png

Je maakt verbinding met een database via een zogeheten DSN (Data Source Name) en slaat de connectie op in een variabele. Om herhaling te voorkomen, zet je dit in een apart bestand zoals connection.php. Dit maakt het ook makkelijk om de instellingen aan te passen wanneer je de website van je localhost naar een liveserver verplaatst.

connection.php 

Het bestand connection.php bevat de code om verbinding te maken met de database. In plaats van in elk PHP-bestand opnieuw een connectie te moeten schrijven, zet je die één keer netjes in dit aparte bestand. Zo houd je je code overzichtelijk en voorkom je fouten.

Door connection.php te gebruiken, hoef je later bij het online zetten van je site alleen in dat ene bestand de instellingen aan te passen (zoals wachtwoord of host), in plaats van in alle bestanden waar je met de database werkt.

<?php
$dsn = 'mysql:host=localhost;dbname=database_name;charset=utf8mb4';
$user = 'root';
$pass = '';

try {
  $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
  echo "Verbinding mislukt: " . $e->getMessage();
}

In het connection.php bestand wordt de database naam, en het user id en password ingesteld. Op een XAMPP ontwikkel server is standaard de user root en heeft geen password. Op een productieserver is dat natuurlijk ander!

🚰 Opdracht

  1. Maak een database voorbeeld aan met één tabel dieren met de kolommen id (INT, AUTO_INCREMENT, PRIMARY KEY), naam (VARCHAR), en soort (VARCHAR).
  2. Maak een bestand connection.php dat de connectie maakt zoals hierboven.
  3. Maak een tweede bestand testverbinding.php waarin je require 'connection.php'; gebruikt om verbinding te maken.
  4. Laat met echo zien of de verbinding is gelukt (bijv. "Verbinding gelukt!").

🧠 Reflectie

📄 Inleveren

2 Gegevens uitlezen met - SELECT

🎯 Leerdoelen

💡 Uitleg

In deze opdracht gebruik je een bestaande database met studentgegevens. Je voert met behulp van PDO een SELECT-query uit en toont de resultaten in een HTML-tabel.

Database

Je gebruikt een SQL-bestand student.sql om snel een database en tabel aan te maken met voorbeeldgegevens:

  1. Open phpMyAdmin (via XAMPP of MAMP).
  2. Klik op "Importeren".
  3. Selecteer het bestand student.sql dat je van je docent krijgt of downloadt.
  4. Klik op "Start" om het script uit te voeren. Je krijgt nu een database met de tabel studenten.

read.php

Maak read.php en zet daar deze code in:

<?php
require 'connection.php';

$sql = "SELECT id, voornaam, achternaam, woonplaats FROM studenten";
$stmt = $pdo->query($sql);
$studenten = $stmt->fetchAll();
?>
<table border="1">
  <tr>
    <th>ID</th>
    <th>Naam</th>
    <th>Woonplaats</th>
  </tr>
  <?php foreach ($studenten as $student): ?>
  <tr>
    <td><?= $student['id'] ?></td>
    <td><?= $student['voornaam'] . ' ' . $student['achternaam'] ?></td>
    <td><?= $student['woonplaats'] ?></td>
  </tr>
  <?php endforeach; ?>
</table>

🛠️ Opdracht – studentenlijst weergeven

  1. Importeer student.sql in phpMyAdmin om de database en tabel aan te maken.
  2. Maak een bestand read.php.
  3. Maak een connection.php bestand zoals dat in de vorige les is uitgelegd.
  4. Gebruik de gegeven code en test of de lijst met studenten goed wordt weergegeven.
  5. Extra (otionele) opdracht: Voeg de kolom email toe aan je SELECT-query en aan de HTML-tabel. Zorg ervoor dat het e-mailadres klikbaar is via een mailto: link.

🧠 Reflectie

(zoals altijd: leg uit in eigen woorden!)

📤 Inleveren

3 Studentgegevens toevoegen - INSERT

🎯 Leerdoelen

💡 Uitleg

Als je gegevens naar de database wilt sturen (bijvoorbeeld via een formulier), gebruik je een INSERT-query. Bij PDO doe je dit veilig met prepare() en execute(). Zo voorkom je problemen zoals SQL-injectie. SQL-injectie kan worden gebruikt om te 'hacken' en wordt later in een ander module uitgelegd.

Je gebruikt prepare() om de query voor te bereiden met placeholders (:naam), en daarna geef je met execute() de daadwerkelijke waarden door.

Voorbeeld – voorbereiding op INSERT

Maak een bestand create.php met deze HTML en PHP-code:

<?php
require 'connection.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $sql = "INSERT INTO studenten (voornaam, achternaam, woonplaats, email)
          VALUES (:voornaam, :achternaam, :woonplaats, :email)";
  $stmt = $pdo->prepare($sql);
  // Vul hier de juiste execute() aan
}
?>

<form method="post">
  <label>Voornaam: <input type="text" name="voornaam"></label><br>
  <label>Achternaam: <input type="text" name="achternaam"></label><br>
  <label>Woonplaats: <input type="text" name="woonplaats"></label><br>
  <label>E-mail: <input type="email" name="email"></label><br>
  <button type="submit">Toevoegen</button>
</form>

🛠️ Opdracht – student toevoegen via formulier

  1. Maak het bestand create.php aan en zet de code hierboven erin.
  2. Test of het formulier zichtbaar is in je browser.
  3. Vul de ontbrekende code aan: zorg dat de execute() functie de juiste data gebruikt uit het formulier.
  4. Voeg een echo toe na het invoegen (bijv. “Student toegevoegd!”) zodat je weet dat het gelukt is.
  5. Controleer in phpMyAdmin of de student correct is toegevoegd aan de database.

🧠 Reflectie

(zoals altijd: leg uit in eigen woorden!)

📤 Inleveren

4 Studentgegevens bewerken - UPDATE

🎯 Leerdoelen

💡 Uitleg

Met een UPDATE-query kun je bestaande gegevens in de database aanpassen. Je gebruikt ook hier prepare() en execute() zodat de invoer veilig verwerkt wordt.

Vaak haal je eerst de huidige gegevens op, zodat de gebruiker weet wat hij gaat bewerken. Daarna verwerk je de aangepaste gegevens.

Voorbeeld – basisopzet update.php

Maak een bestand update.php en vul deze code in:

<?php
require 'connection.php';

$id = $_GET['id'] ?? null;

if (!$id) {
  echo "Geen ID opgegeven.";
  exit;
}

$stmt = $pdo->prepare("SELECT * FROM studenten WHERE id = ?");
$stmt->execute([$id]);
$student = $stmt->fetch();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $sql = "UPDATE studenten SET voornaam = :voornaam, achternaam = :achternaam, woonplaats = :woonplaats, email = :email WHERE id = :id";
  $stmt = $pdo->prepare($sql);
  // Vul hier de juiste execute() functie aan
}
?>

<form method="post">
  <label>Voornaam: <input type="text" name="voornaam" value="<?= $student['voornaam'] ?>"></label><br>
  <label>Achternaam: <input type="text" name="achternaam" value="<?= $student['achternaam'] ?>"></label><br>
  <label>Woonplaats: <input type="text" name="woonplaats" value="<?= $student['woonplaats'] ?>"></label><br>
  <label>E-mail: <input type="email" name="email" value="<?= $student['email'] ?>"></label><br>
  <button type="submit">Opslaan</button>
</form>

🛠️ Opdracht – studentgegevens aanpassen

  1. Maak een bestand update.php.
  2. Gebruik de code hierboven. Let op: gebruik een bestaand ID uit je database in de URL (bijv. update.php?id=3).
  3. Test of de juiste gegevens zichtbaar zijn in het formulier.
  4. Vul zelf de execute() regel aan zodat de gegevens uit het formulier worden opgeslagen in de database.
  5. Voeg na het opslaan een echo toe met "Wijziging opgeslagen".
  6. Controleer of de database wordt aangepast.

🧠 Reflectie

📤 Inleveren

5 Student verwijderen

🎯 Leerdoelen

💡 Uitleg

Met een DELETE-query verwijder je een record uit de database. Omdat deze actie niet teruggedraaid kan worden, wil je dit altijd eerst bevestigen. Ook gebruik je een WHERE clausule om precies aan te geven welk record je bedoelt.

In deze opdracht toon je eerst de naam van de student die je gaat verwijderen, zodat je als gebruiker weet wat je doet. Daarna kun je pas bevestigen en verwijderen.

Voorbeeld – delete.php

<?php
require 'connection.php';

$id = $_GET['id'] ?? null;

if (!$id) {
  echo "Geen ID opgegeven.";
  exit;
}

// TO DO: Haal hier de student op via SELECT zodat je zijn/haar naam kunt tonen
// $student = ...

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $stmt = $pdo->prepare("DELETE FROM studenten WHERE id = :id");
  $stmt->execute(['id' => $id]);
  echo "Student verwijderd.";
  exit;
}
?>

<p>Weet je zeker dat je student <strong><?= '... hier de naam' ?></strong> wilt verwijderen?</p>

<form method="post">
  <button type="submit">Ja, verwijder</button>
</form>

<p><a href="read.php">Annuleer</a></p>

🛠️ Opdracht – student verwijderen met naam

  1. Maak een bestand delete.php.
  2. Gebruik de bovenstaande code.
  3. Vul zelf de SELECT-query aan zodat je de gegevens van de student ophaalt op basis van het ID.
  4. Laat de voornaam en achternaam van de student zien in de bevestigingsvraag.
  5. Test de pagina via de URL: delete.php?id=3 (of een ander bestaand ID).

🧠 Reflectie

📤 Inleveren

6 Studenten zoeken

🎯 Leerdoelen

💡 Uitleg

Met een WHERE-clausule kun je filteren welke rijen je uit de database haalt. Als je wilt zoeken op een deel van een naam, gebruik je LIKE met het procentteken %.

Bijvoorbeeld: SELECT * FROM studenten WHERE voornaam LIKE :zoek, en dan geef je %zoekwoord% mee aan de placeholder :zoek.

Voorbeeldopzet – zoek.php

Maak een bestand zoek.php met deze opzet:

<form method="get">
  <input type="text" name="zoek" placeholder="Zoek op voornaam">
  <button type="submit">Zoeken</button>
</form>

<?php
require 'connection.php';

$zoekwoord = $_GET['zoek'] ?? '';

if ($zoekwoord) {
  // TO DO: vul de juiste SELECT-query en fetchAll() hier aan
}
?>

🛠️ Opdracht – zoekfunctie bouwen

  1. Maak het bestand zoek.php.
  2. Gebruik de bovenstaande code als startpunt.
  3. Vul zelf de SELECT-query aan met een WHERE voornaam LIKE :zoek clausule.
  4. Voer de query uit met prepare() en execute() – gebruik % wildcards om ook op deelwoorden te zoeken.
  5. Toon de resultaten in een tabel met voornaam, achternaam, woonplaats en e-mail.

🧠 Reflectie

📤 Inleveren

7 Mini-project: CRUD applicatie

🎯 Leerdoelen

Wat is CRUD?

CRUD staat voor Create, Read, Update, Delete – dit zijn de vier basisbewerkingen die je met gegevens in een database kunt uitvoeren:

Een CRUD-applicatie is een programma dat deze vier functies ondersteunt. In webontwikkeling gebruik je vaak formulieren en SQL in combinatie met PHP of andere programmeertalen om deze acties uit te voeren.

💡 Uitleg

Je hebt nu alle onderdelen geleerd om een volledige webapplicatie te maken die met een database werkt. In dit project bouw je een kleine CRUD-app voor studenten waarin je:

🛠️ Opdracht – CRUD-app bouwen

  1. Maak een eigen map of project met minimaal de volgende bestanden:
    • read.php – toont de lijst van studenten
    • create.php – formulier om nieuwe studenten toe te voegen
    • update.php – formulier om bestaande studenten te bewerken
    • delete.php – bevestiging en verwijdering van een student
    • zoek.php – zoekfunctie op voornaam
    • connection.php – je databaseverbinding
  2. Zorg dat je hiervan één web applicatie van en zorg dat je via een menu bar kan navigeren.
  3. Voeg bovenaan read.php een navigatie toe zodat je snel naar de andere pagina’s kunt.
  4. Controleer of je code werkt voor verschillende studenten en test het met minstens 3 zelf ingevoerde records.
  5. Je mag de opmaak aanpassen met CSS als je wilt, maar dat is optioneel.

🧠 Reflectie

📤 Inleveren

8 Toetsvragen: PDO en CRUD

🎯 Leerdoelen

🛠️ Toetsvragen

  1. Wat betekent PDO?
    Antwoord: PHP Data Objects.
    Uitleg: PDO is een uitbreiding van PHP die toegang biedt tot meerdere soorten databases op een uniforme manier.
  2. Waarom gebruik je prepare() in plaats van direct query()?
    Antwoord: Omdat prepare() veiliger is en SQL-injectie voorkomt.
    Uitleg: Met prepared statements worden gebruikersgegevens apart gehouden van de SQL-structuur.
  3. Wat is het doel van een connection.php bestand?
    Antwoord: Om de connectie met de database op één centrale plek te beheren.
    Uitleg: Dit maakt onderhoud makkelijker, vooral bij verhuizing van je project.
  4. Wat doet deze regel code?
    $stmt = $pdo->prepare("DELETE FROM studenten WHERE id = :id");
    Antwoord: Bereidt een DELETE-query voor om één student op basis van ID te verwijderen.
    Uitleg: De :id is een placeholder die je later vult met execute().
  5. Welke fetch-methode gebruik je als je meerdere rijen tegelijk wilt ophalen?
    Antwoord: fetchAll().
    Uitleg: fetchAll() geeft een array van arrays of objecten terug met alle resultaten.
  6. Wat is het verschil tussen $_GET en $_POST?
    Antwoord: $_GET haalt gegevens op uit de URL, $_POST uit een formulier.
    Uitleg: POST gebruik je voor acties die gegevens veranderen, zoals INSERT of UPDATE.
  7. Wat doet deze LIKE-query?
    SELECT * FROM studenten WHERE voornaam LIKE '%em%'
    Antwoord: Zoekt naar studenten waarvan de voornaam ‘em’ bevat, zoals “Emma” of “Emir”.
    Uitleg: Het percentage-teken (%) betekent "maakt niet uit wat ervoor of erna staat".
  8. Waarom is het gevaarlijk om directe invoer van gebruikers in je SQL-query te zetten?
    Antwoord: Dat maakt je kwetsbaar voor SQL-injectie.
    Uitleg: Kwaadwillenden kunnen via invoervelden je database beïnvloeden of uitlezen.
  9. Wat betekent CRUD precies?
    Antwoord: Create, Read, Update, Delete.
    Uitleg: Dit zijn de vier basishandelingen bij dataverwerking in een applicatie.
  10. Wat doet deze regel?
    require 'connection.php';
    Antwoord: Voegt het bestand connection.php in en maakt de databaseconnectie beschikbaar.
    Uitleg: Hierdoor hoef je niet in elk bestand opnieuw de connectie te schrijven.

📤 Inleveren

Gebruik deze vragen om jezelf te testen of als voorbereiding op de kennis-check.

Maak één zelf bedachte vraag over PDO gaat en die hier boven niet staat.


Revision #6
Created 13 June 2025 19:04:30 by Max
Updated 13 June 2025 20:17:26 by Max