Start · Sprachen · PHP · Referenz · SQLite3Stmt

SQLite3Stmt

Klasse

Repräsentiert ein vorbereitetes SQL-Statement für die <code>SQLite3</code>-Erweiterung und ermöglicht sicheres Parameterbinding sowie wiederholte Ausführung.

seit PHP 5.3.0 Kategorie: db

Signatur

class SQLite3Stmt

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();
Alice ist 30 Jahre alt. Bob ist 25 Jahre alt.

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();
Produkte unter 1 Euro: Apfel: 0.99 EUR Banane: 0.79 EUR

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