PHP met PDO

PDO (PHP Data Objects) is de aanbevolen manier om met je database te werken in PHP. Het werkt met veel databases en ondersteunt veilige prepared statements.

Eerst online zetten
Maak je PHP-app aan onder Cloud → Apps (type PHP) en koppel een database — zie Je project online zetten en Databases bij EduInsights. Daarna staan de DB_* variabelen hieronder klaar.

Verbinding maken

Maak één bestand db-config.php dat de verbinding opzet vanuit de omgevingsvariabelen:

php
<?php
// db-config.php — gebruikt de automatisch ingestelde omgevingsvariabelen
$host = getenv('DB_HOST');
$port = getenv('DB_PORT');
$db   = getenv('DB_NAME');
$user = getenv('DB_USER');
$pass = getenv('DB_PASS');

function getDbConnection(): PDO {
    global $host, $port, $db, $user, $pass;
    $dsn = "mysql:host=$host;port=$port;dbname=$db;charset=utf8mb4";
    return new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
}

Gebruik het daarna in je andere bestanden:

php
<?php
require_once 'db-config.php';
$pdo = getDbConnection();
Lokaal ontwikkelen
Op EduInsights staan de DB_* variabelen automatisch klaar; getenv() leest ze direct uit. Werk je lokaal, dan leest PHP niet vanzelf een .env-bestand — zet de variabelen in je eigen omgeving of gebruik een pakket als vlucas/phpdotenv. Voor een lokale MySQL/XAMPP gebruik je DB_HOST=localhost; voor de database op EduInsights DB_HOST=db.eduinsights.nl. Zet een .env nooit in GitHub:
text
.env

Data ophalen

php
<?php
require_once 'db-config.php';
$pdo = getDbConnection();

$stmt = $pdo->query('SELECT id, naam, prijs FROM producten');
$producten = $stmt->fetchAll();

foreach ($producten as $product) {
    echo $product['naam'] . ' — €' . $product['prijs'] . "\n";
}

Data invoegen met een prepared statement

Plak gebruikersinvoer nooit direct in je query. Gebruik placeholders (? of :naam):

php
<?php
require_once 'db-config.php';
$pdo = getDbConnection();

$stmt = $pdo->prepare(
    'INSERT INTO producten (naam, prijs) VALUES (:naam, :prijs)'
);
$stmt->execute([
    ':naam'  => $_POST['naam'],
    ':prijs' => $_POST['prijs'],
]);

$nieuwId = $pdo->lastInsertId();

Eén rij ophalen met een filter

php
<?php
$stmt = $pdo->prepare('SELECT * FROM producten WHERE id = ?');
$stmt->execute([$_GET['id']]);
$product = $stmt->fetch();

if ($product === false) {
    http_response_code(404);
    echo 'Niet gevonden';
}
Foutmeldingen
Met PDO::ERRMODE_EXCEPTION gooit PDO een PDOException bij fouten. Vang ze op met try { … } catch (PDOException $e) { … } en toon nooit de ruwe foutmelding aan bezoekers.
Veilig blijven
Gebruik altijd prepared statements bij data van buiten (formulieren, URL-parameters). Zie Veiligheid.

Meer in PHP