Signatur
Beschreibung
Die Klasse SQLite3 bietet eine vollständige objektorientierte Schnittstelle zu SQLite3-Datenbanken. SQLite3 ist eine serverlose, dateibasierte relationale Datenbank-Engine, die sich besonders für eingebettete Anwendungen, Prototypen, lokale Datenspeicherung und Tests eignet. Da keine separate Server-Installation notwendig ist, kann SQLite3 in jedem PHP-Projekt ohne Konfigurationsaufwand eingesetzt werden.
Die Klasse unterstützt vorbereitete Anweisungen (Prepared Statements) über SQLite3Stmt, Ergebnismengen über SQLite3Result sowie benutzerdefinierte SQL-Funktionen und Aggregate, die in PHP implementiert werden können. Transaktionen, BLOB-Handling und Verschlüsselung (bei entsprechend kompilierter Bibliothek) werden ebenfalls unterstützt.
Typische Einsatzgebiete sind Desktop-Anwendungen, CLI-Tools, Unit-Tests mit Datenbank-Backend, Caching-Lösungen oder kleine Webanwendungen mit geringer Last. Für Produktionssysteme mit hohem gleichzeitigem Schreibzugriff sind Server-basierte Datenbanken wie MySQL oder PostgreSQL besser geeignet, da SQLite3 bei Schreibvorgängen eine Datei-Sperre verwendet.
Die Erweiterung ist seit PHP 5.3 standardmäßig gebündelt und muss lediglich mit --with-sqlite3 kompiliert werden. Ab PHP 7.4 ist sie standardmäßig aktiviert. Vorbereitete Anweisungen sollten stets bevorzugt werden, um SQL-Injection zu verhindern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Pfad zur SQLite3-Datenbankdatei. Mit ':memory:' wird eine flüchtige In-Memory-Datenbank erstellt, die nur für die Dauer der Session existiert. |
|
| $flags | int | SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE | Kombination aus SQLITE3_OPEN_READONLY, SQLITE3_OPEN_READWRITE und/oder SQLITE3_OPEN_CREATE, die den Zugriffsmodus bestimmt. |
| $encryptionKey | string | Optionaler Verschlüsselungsschlüssel für die Datenbank. Wird nur verwendet, wenn die SQLite3-Bibliothek mit Verschlüsselungsunterstützung kompiliert wurde. |
Beispiele
Datenbank erstellen, Tabelle anlegen und Daten einfügen
<?php
$db = new SQLite3('/tmp/meine_datenbank.db');
$db->exec('CREATE TABLE IF NOT EXISTS nutzer (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)');
$db->exec("INSERT INTO nutzer (name, age) VALUES ('Alice', 30)");
$db->exec("INSERT INTO nutzer (name, age) VALUES ('Bob', 25)");
$ergebnis = $db->query('SELECT id, name, age FROM nutzer ORDER BY age ASC');
while ($zeile = $ergebnis->fetchArray(SQLITE3_ASSOC)) {
echo "ID: {$zeile['id']}, Name: {$zeile['name']}, Alter: {$zeile['age']}\n";
}
$db->close();
Prepared Statement zur Vermeidung von SQL-Injection
<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE produkte (id INTEGER PRIMARY KEY, name TEXT, preis REAL)');
// Prepared Statement mit gebundenen Parametern
$stmt = $db->prepare('INSERT INTO produkte (name, preis) VALUES (:name, :preis)');
$stmt->bindValue(':name', 'Laptop', SQLITE3_TEXT);
$stmt->bindValue(':preis', 999.99, SQLITE3_FLOAT);
$stmt->execute();
$stmt->bindValue(':name', 'Maus', SQLITE3_TEXT);
$stmt->bindValue(':preis', 29.95, SQLITE3_FLOAT);
$stmt->execute();
$stmt->close();
// Sicheres Abfragen mit Parameter-Binding
$suchname = 'Laptop'; // könnte Benutzereingabe sein
$abfrage = $db->prepare('SELECT name, preis FROM produkte WHERE name = :name');
$abfrage->bindValue(':name', $suchname, SQLITE3_TEXT);
$result = $abfrage->execute();
if ($zeile = $result->fetchArray(SQLITE3_ASSOC)) {
echo "Produkt: {$zeile['name']}, Preis: {$zeile['preis']} EUR\n";
}
$db->close();
Benutzerdefinierte SQL-Funktion registrieren
<?php
$db = new SQLite3(':memory:');
// PHP-Funktion als SQL-Funktion registrieren
$db->createFunction('php_strtoupper', function (string $str): string {
return strtoupper($str);
}, 1);
$db->exec('CREATE TABLE woerter (wort TEXT)');
$db->exec("INSERT INTO woerter VALUES ('hallo'), ('welt'), ('php')");
$res = $db->query('SELECT php_strtoupper(wort) AS gross FROM woerter');
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
echo $row['gross'] . "\n";
}
$db->close();
// Wichtig · Fallstricke
Sicherheit: Verwende niemals unkontrollierte Benutzereingaben direkt in SQL-Strings. Setze stets SQLite3Stmt mit bindValue() oder bindParam() ein, um SQL-Injection zu verhindern. Als Notfalllösung kann SQLite3::escapeString() verwendet werden, Prepared Statements sind aber die sicherere Wahl.
Gleichzeitiger Zugriff: SQLite3 sperrt die gesamte Datenbankdatei beim Schreiben. Bei mehreren gleichzeitigen Schreibprozessen kann es zu SQLITE_BUSY-Fehlern kommen. Mit busyTimeout() kann eine Wartezeit konfiguriert werden.
Exceptions: Ab PHP 8.3 kann SQLite3 so konfiguriert werden, dass Ausnahmen ausgelöst werden. Vorher muss der Fehler-Modus explizit gesetzt werden. Prüfe Rückgabewerte von exec() und fange potenzielle Exception-Instanzen ab.
In-Memory-Datenbanken: Bei Verwendung von ':memory:' gehen alle Daten nach dem Schließen der Verbindung bzw. nach dem Script-Ende verloren. Für persistente Daten muss ein Dateipfad angegeben werden.