Signatur
Beschreibung
SQLite3Stmt kapselt ein vorbereitetes SQL-Statement (Prepared Statement), das mit SQLite3::prepare() erzeugt wird. Vorbereitete Anweisungen trennen SQL-Logik von den Nutzdaten und verhindern so SQL-Injection-Angriffe zuverlässig, ohne dass manuelles Escaping nötig ist.
Parameter werden über benannte Platzhalter (z. B. :name) oder Fragezeichen-Platzhalter (?) eingebunden. Mit bindParam() wird eine Variable per Referenz gebunden (der Wert wird erst beim Ausführen gelesen), während bindValue() den aktuellen Wert sofort kopiert. Die Methode execute() führt das Statement aus und gibt ein SQLite3Result-Objekt zurück.
Durch die Wiederverwendung desselben SQLite3Stmt-Objekts mit reset() und neuen Bindungen kann die Performance bei wiederholten Datenbankoperationen deutlich gesteigert werden, da das Statement nur einmal kompiliert wird. Nach der Verwendung sollte close() aufgerufen werden, um Ressourcen freizugeben.
SQLite3Stmt kann nicht direkt instanziiert werden; Objekte dieser Klasse werden ausschließlich von SQLite3::prepare() zurückgegeben.
Beispiele
Datensatz sicher einfügen mit benannten Platzhaltern
<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)');
$stmt = $db->prepare('INSERT INTO users (name, age) VALUES (:name, :age)');
$stmt->bindValue(':name', 'Alice', SQLITE3_TEXT);
$stmt->bindValue(':age', 30, SQLITE3_INTEGER);
$stmt->execute();
$stmt->reset();
$stmt->bindValue(':name', 'Bob', SQLITE3_TEXT);
$stmt->bindValue(':age', 25, SQLITE3_INTEGER);
$stmt->execute();
$stmt->close();
$result = $db->query('SELECT * FROM users');
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
echo $row['name'] . ' ist ' . $row['age'] . ' Jahre alt.' . PHP_EOL;
}
$db->close();
Datensatz abfragen mit bindParam (Referenz-Binding)
<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price REAL)');
$db->exec("INSERT INTO products (name, price) VALUES ('Apfel', 0.99), ('Birne', 1.49), ('Banane', 0.79)");
$stmt = $db->prepare('SELECT name, price FROM products WHERE price < :maxprice');
$maxprice = 1.00;
$stmt->bindParam(':maxprice', $maxprice, SQLITE3_FLOAT);
$result = $stmt->execute();
echo "Produkte unter {$maxprice} Euro:" . PHP_EOL;
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
echo ' ' . $row['name'] . ': ' . $row['price'] . ' EUR' . PHP_EOL;
}
$result->finalize();
$stmt->close();
$db->close();
// Wichtig · Fallstricke
Sicherheit: Nutze stets Prepared Statements mit Parameterbinding, anstatt Nutzereingaben direkt in SQL-Zeichenketten einzufügen. Selbst SQLite3::escapeString() ist fehleranfälliger als Parameterbinding.
Ressourcenverwaltung: Rufe nach der letzten Verwendung eines Statements SQLite3Stmt::close() auf. Ein nicht geschlossenes Statement kann verhindern, dass die Datenbank korrekt geschlossen wird.
reset() vs. close(): reset() setzt das Statement in den Ausgangszustand zurück, damit es erneut ausgeführt werden kann, ohne es neu zu kompilieren. Bindungen bleiben dabei erhalten. close() gibt das Statement vollständig frei.
Fragezeichen-Platzhalter: Beim Einsatz von ? wird der Index bei bindValue() und bindParam() als Integer übergeben, beginnend bei 1, nicht bei 0.