Start · Sprachen · PHP · Referenz · SQLite3Result

SQLite3Result

Klasse

Repräsentiert eine Ergebnismenge einer SQLite3-Abfrage und ermöglicht den zeilenweisen Zugriff auf die zurückgegebenen Datensätze.

seit PHP 5.3.0 Kategorie: db

Signatur

class SQLite3Result

Beschreibung

SQLite3Result wird von SQLite3::query() und SQLite3Stmt::execute() zurückgegeben und enthält die Ergebnismenge einer SELECT-Abfrage. Die Klasse bietet Methoden, um Spalteninformationen abzufragen sowie Zeilen nacheinander oder einzeln auszulesen.

Mit fetchArray() können Zeilen als assoziatives Array, numerisches Array oder beides abgerufen werden. Die Methode gibt false zurück, wenn keine weiteren Zeilen vorhanden sind, was eine einfache Iteration in einer while-Schleife ermöglicht. Mit reset() lässt sich der Cursor an den Anfang zurücksetzen, um die Ergebnismenge erneut zu durchlaufen.

Spaltenanzahl und Spaltennamen können über numColumns() und columnName() ermittelt werden, der Datentyp einer Spalte über columnType(). Dies ist besonders nützlich, wenn die Struktur der Ergebnismenge zur Laufzeit nicht bekannt ist.

Nach der Verarbeitung sollte finalize() aufgerufen werden, um die mit der Abfrage verbundenen Ressourcen freizugeben. Dies ist insbesondere wichtig, bevor die zugrunde liegende Datenbankverbindung geschlossen wird.

Beispiele

Ergebnismenge einer SELECT-Abfrage iterieren

<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)');
$db->exec("INSERT INTO users (name, age) VALUES ('Alice', 30)");
$db->exec("INSERT INTO users (name, age) VALUES ('Bob', 25)");

$result = $db->query('SELECT * FROM users');

while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
    echo "ID: {$row['id']}, Name: {$row['name']}, Alter: {$row['age']}\n";
}

$result->finalize();
$db->close();
ID: 1, Name: Alice, Alter: 30 ID: 2, Name: Bob, Alter: 25

Spalteninformationen und Datentypen auslesen

<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE produkte (id INTEGER, bezeichnung TEXT, preis REAL)');
$db->exec("INSERT INTO produkte VALUES (1, 'Apfel', 0.99)");

$result = $db->query('SELECT * FROM produkte');

$anzahl = $result->numColumns();
echo "Anzahl Spalten: $anzahl\n";

for ($i = 0; $i < $anzahl; $i++) {
    $name = $result->columnName($i);
    $typ  = $result->columnType($i); // Gibt eine SQLITE3_*-Konstante zurück (nach fetchArray)
    echo "Spalte $i: $name\n";
}

// Erste Zeile lesen
$row = $result->fetchArray(SQLITE3_NUM);
print_r($row);

$result->finalize();
$db->close();
Anzahl Spalten: 3 Spalte 0: id Spalte 1: bezeichnung Spalte 2: preis Array ( [0] => 1 [1] => Apfel [2] => 0.99 )

Ergebnismenge mit reset() erneut durchlaufen

<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE zahlen (wert INTEGER)');
$db->exec('INSERT INTO zahlen VALUES (10)');
$db->exec('INSERT INTO zahlen VALUES (20)');

$result = $db->query('SELECT wert FROM zahlen');

echo "Erster Durchlauf:\n";
while ($row = $result->fetchArray(SQLITE3_NUM)) {
    echo $row[0] . "\n";
}

$result->reset();

echo "Zweiter Durchlauf:\n";
while ($row = $result->fetchArray(SQLITE3_NUM)) {
    echo $row[0] . "\n";
}

$result->finalize();
$db->close();
Erster Durchlauf: 10 20 Zweiter Durchlauf: 10 20

// Wichtig · Fallstricke

Ressourcen freigeben: finalize() sollte nach der Verarbeitung immer aufgerufen werden. Wird die Verbindung geschlossen, ohne das Ergebnis vorher abzuschließen, können Locking-Probleme oder Ressourcenlecks auftreten.

Kein direktes Instanziieren: SQLite3Result-Objekte werden nicht manuell erzeugt, sondern ausschließlich durch SQLite3::query() oder SQLite3Stmt::execute() zurückgegeben. Ein direkter Aufruf von new SQLite3Result() ist nicht vorgesehen.

columnType()-Verhalten: columnType() gibt den Typ der aktuell gelesenen Zeile zurück und liefert erst nach mindestens einem fetchArray()-Aufruf sinnvolle Werte. Vor dem ersten Fetch kann das Ergebnis undefiniert sein.

Nur-Lese-Ergebnismengen: Die Klasse erlaubt keinen wahlfreien Zugriff per Index; Zeilen können nur vorwärts iteriert werden (außer nach einem reset()).