PDO mit SQLite – sichere Abfragen per Prepared Statement
SQLite ist eine ganze Datenbank in einer Datei – perfekt für kleine Projekte. Mit PDO und Prepared Statements fragst du sie sicher ab, ganz ohne SQL-Injection.
Für kleine Websites und Tools nehme ich gern SQLite: Die ganze Datenbank ist eine einzige Datei, du brauchst keinen Datenbankserver. In PHP sprichst du sie über PDO an – und schreibst dabei jede Abfrage als Prepared Statement, damit Nutzereingaben niemals als SQL interpretiert werden.
Verbindung aufbauen
<?php
$db = new PDO('sqlite:' . __DIR__ . '/data/app.sqlite');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);Mit ERRMODE_EXCEPTION wirft PDO bei Fehlern eine Exception, statt sie stillschweigend zu schlucken – so bemerkst du Probleme sofort.
Sicher abfragen (SELECT)
Der Platzhalter ? wird von PDO getrennt vom SQL übergeben. Deshalb kann darin auch ein ' OR 1=1 -- stecken, ohne Schaden anzurichten.
<?php
$stmt = $db->prepare('SELECT id, title FROM posts WHERE author = ? ORDER BY id DESC');
$stmt->execute([$_GET['author']]);
foreach ($stmt as $row) {
echo htmlspecialchars($row['title']) . "\n";
}Sicher einfügen (INSERT)
<?php
$stmt = $db->prepare('INSERT INTO posts (title, author, created_at) VALUES (?, ?, ?)');
$stmt->execute(['Mein erster Beitrag', 'michael', time()]);
$newId = (int) $db->lastInsertId();Zwei Regeln, die ich immer einhalte: Erstens kommen Werte grundsätzlich als Platzhalter ins Statement, nie per String-Verkettung. Zweitens wird jede Ausgabe mit htmlspecialchars() escaped, bevor sie im HTML landet.
Nach genau diesem Muster ist auch mein eigenes CMS gebaut. Wenn du eine schlanke Website mit eigener kleiner Datenbank brauchst, meld dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
First-Class-Callable-Syntax in PHP: aus strlen(...) wird ein echter Wert
Funktionen als Zeichenketten weiterzureichen – 'strlen', [$objekt, 'methode'] – hat nie jemand gemocht: kein Tippfehlerschutz, keine Sprungmarke in der IDE. Seit PHP 8.1 schreibst du drei Punkte und bekommst ein Closure-Objekt.
array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
RETURNING in SQLite – die geschriebene Zeile sofort zurückbekommen
Nach einem INSERT oder UPDATE noch einmal SELECTen, um zu sehen, was drinsteht? Muss nicht sein. RETURNING liefert die betroffenen Zeilen direkt aus dem schreibenden Statement – ohne zweite Abfrage und ohne die Lücke dazwischen.