Start · Sprachen · PHP · Referenz · SQLite3

SQLite3

Klasse

Stellt eine objektorientierte Schnittstelle zu SQLite3-Datenbanken bereit und ermöglicht das Erstellen, Abfragen und Verwalten eingebetteter SQL-Datenbanken.

seit PHP 5.3.0 Kategorie: db

Signatur

class SQLite3

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();
ID: 2, Name: Bob, Alter: 25 ID: 1, Name: Alice, Alter: 30

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();
Produkt: Laptop, Preis: 999.99 EUR

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();
HALLO WELT PHP

// 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.