Signatur
Beschreibung
Pdo\Sqlite ist eine seit PHP 8.4 verfügbare, dedizierte Unterklasse von PDO, die speziell für die Arbeit mit SQLite-Datenbanken ausgelegt ist. Sie bietet gegenüber der generischen PDO-Klasse einen eigenen SQL-Parser, der den SQLite-Dialekt vollständig versteht, sowie zusätzliche, SQLite-spezifische Methoden, die über die generische PDO-Schnittstelle nicht erreichbar sind.
Mit Pdo\Sqlite lassen sich benutzerdefinierte SQL-Funktionen, Aggregate und Kollationen direkt in PHP registrieren. Dadurch können komplexe Berechnungen oder Textverarbeitungen in vertrautem PHP-Code implementiert und nahtlos in SQLite-Abfragen verwendet werden. Dies ist besonders nützlich, wenn SQLite als eingebettete Datenbank in Desktop-Anwendungen, Testsystemen oder kleinen Webanwendungen eingesetzt wird.
Die Klasse unterstützt außerdem SQLite-spezifische Features wie das Öffnen von In-Memory-Datenbanken (:memory:), das Laden externer SQLite-Erweiterungen sowie das Erstellen eigener skalarer und aggregierter Funktionen über Methoden wie createFunction(), createAggregate() und createCollation().
Da Pdo\Sqlite von PDO erbt, ist sie vollständig kompatibel mit bestehendem PDO-Code und erlaubt einen einfachen Umstieg ohne größere Refaktorierungen. Sie sollte immer dann bevorzugt werden, wenn sqlite als PDO-Treiber genutzt wird und SQLite-spezifische Funktionalität benötigt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $dsn Pflicht | string | Der Data Source Name für die SQLite-Verbindung, z. B. sqlite:/pfad/zur/datei.db oder sqlite::memory: für eine In-Memory-Datenbank. |
|
| $username | string|null | null | Für SQLite nicht relevant; wird ignoriert. Kann leer gelassen oder auf null gesetzt werden. |
| $password | string|null | null | Für SQLite nicht relevant; wird ignoriert. Kann leer gelassen oder auf null gesetzt werden. |
| $options | array|null | null | Assoziatives Array mit PDO-Treiber-Optionen, z. B. PDO::ATTR_ERRMODE oder SQLite-spezifische Optionen wie PDO::SQLITE_ATTR_OPEN_FLAGS. |
Beispiele
Verbindung zu einer SQLite-Datei und einfache Abfrage
<?php
use Pdo\Sqlite;
$db = new Sqlite('sqlite:/tmp/beispiel.db');
$db->exec('CREATE TABLE IF NOT EXISTS nutzer (id INTEGER PRIMARY KEY, name TEXT)');
$db->exec("INSERT INTO nutzer (name) VALUES ('Alice'), ('Bob')");
$stmt = $db->query('SELECT id, name FROM nutzer ORDER BY id');
foreach ($stmt as $row) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
Benutzerdefinierte PHP-Funktion in SQLite registrieren
<?php
use Pdo\Sqlite;
$db = new Sqlite('sqlite::memory:');
// Eigene SQL-Funktion registrieren, die Strings in Großbuchstaben umwandelt
$db->createFunction('php_upper', fn(string $s): string => strtoupper($s), 1);
$db->exec('CREATE TABLE worte (wort TEXT)');
$db->exec("INSERT INTO worte VALUES ('hallo'), ('welt')");
$stmt = $db->query('SELECT php_upper(wort) AS gross FROM worte');
foreach ($stmt as $row) {
echo $row['gross'] . PHP_EOL;
}
In-Memory-Datenbank mit Fehlerbehandlung
<?php
use Pdo\Sqlite;
try {
$db = new Sqlite(
dsn: 'sqlite::memory:',
options: [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$db->exec('CREATE TABLE produkte (id INTEGER PRIMARY KEY, preis REAL)');
$db->exec('INSERT INTO produkte (preis) VALUES (9.99), (4.49), (19.95)');
$stmt = $db->query('SELECT AVG(preis) AS durchschnitt FROM produkte');
$result = $stmt->fetch();
echo 'Durchschnittspreis: ' . number_format($result['durchschnitt'], 2, ',', '.') . ' €';
} catch (\PDOException $e) {
echo 'Datenbankfehler: ' . $e->getMessage();
}
// Wichtig · Fallstricke
Verfügbarkeit: Pdo\Sqlite ist erst ab PHP 8.4 verfügbar. In älteren PHP-Versionen muss weiterhin die generische PDO-Klasse mit dem sqlite:-DSN verwendet werden. Methoden wie createFunction() und createAggregate() standen dort über die veraltete SQLite3-Klasse oder als PDO-spezifische Erweiterungen zur Verfügung.
Sicherheit: SQLite-Datenbankdateien sollten außerhalb des öffentlich zugänglichen Web-Roots gespeichert werden, damit sie nicht direkt heruntergeladen werden können. Benutzereingaben sind stets über vorbereitete Statements (prepare()/execute()) zu verarbeiten, um SQL-Injection zu vermeiden.
Parallelzugriff: SQLite ist für Szenarien mit vielen gleichzeitigen Schreibzugriffen nicht geeignet. Bei hoher Last sollte auf eine vollwertige Datenbank wie MySQL oder PostgreSQL gewechselt werden.