Start · Sprachen · PHP · Referenz · PDORow

PDORow

Klasse

Stellt eine einzelne Zeile einer Ergebnismenge dar, die von <code>PDOStatement::fetch()</code> im Abrufmodus <code>PDO::FETCH_LAZY</code> zurückgegeben wurde.

seit PHP 5.1.0 Kategorie: db

Signatur

class PDORow

Beschreibung

PDORow ist eine interne PHP-Klasse, die automatisch von PDO erzeugt wird, wenn PDOStatement::fetch() mit dem Abrufmodus PDO::FETCH_LAZY aufgerufen wird. Sie repräsentiert eine einzelne Datenbankzeile und erlaubt den Zugriff auf deren Spalten sowohl als Objekteigenschaften als auch über Array-Zugriff.

Der besondere Vorteil von PDO::FETCH_LAZY (und damit von PDORow) ist, dass die Spaltenwerte erst beim tatsächlichen Zugriff aus dem Ergebnis-Puffer gelesen werden (lazy evaluation). Das bedeutet, Spalten werden nicht sofort in den Speicher übertragen, was bei sehr breiten Ergebnismengen Speicher sparen kann.

PDORow-Objekte können nicht serialisiert werden und sollten nicht außerhalb der Schleife gespeichert werden, in der sie erzeugt wurden, da sie intern an das zugehörige PDOStatement-Objekt gebunden sind. Der Versuch, ein PDORow-Objekt zu serialisieren, führt zu einem Fehler.

Da es sich um eine interne Klasse handelt, kann sie nicht direkt instanziiert oder abgeleitet werden. Der Zugriff auf Spalten erfolgt über den Eigenschafts-Namen (z. B. $row->spaltenname) oder via $row->queryString, das die ursprüngliche SQL-Abfrage enthält.

Beispiele

Zeilenweise Verarbeitung mit PDO::FETCH_LAZY

<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER, name TEXT, email TEXT)');
$pdo->exec("INSERT INTO users VALUES (1, 'Alice', 'alice@example.com')");
$pdo->exec("INSERT INTO users VALUES (2, 'Bob', 'bob@example.com')");

$stmt = $pdo->query('SELECT id, name, email FROM users');

while ($row = $stmt->fetch(PDO::FETCH_LAZY)) {
    // $row ist ein PDORow-Objekt
    echo get_class($row) . "\n"; // PDORow
    echo $row->id . ' - ' . $row->name . ' - ' . $row->email . "\n";
}
PDORow 1 - Alice - alice@example.com PDORow 2 - Bob - bob@example.com

Zugriff auf queryString über PDORow

<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE products (id INTEGER, title TEXT)');
$pdo->exec("INSERT INTO products VALUES (1, 'Widget')");

$sql = 'SELECT id, title FROM products WHERE id = 1';
$stmt = $pdo->query($sql);

$row = $stmt->fetch(PDO::FETCH_LAZY);

if ($row !== false) {
    echo 'Titel: ' . $row->title . "\n";
    // PDORow stellt die Original-SQL über ->queryString bereit
    echo 'Abfrage: ' . $row->queryString . "\n";
}
Titel: Widget Abfrage: SELECT id, title FROM products WHERE id = 1

// Wichtig · Fallstricke

Nicht serialisierbar: PDORow-Objekte können nicht mit serialize() gespeichert werden. Ein entsprechender Versuch wirft eine Exception oder einen fatalen Fehler.

Bindung an das Statement: Ein PDORow-Objekt ist intern an sein PDOStatement gebunden. Wird das Statement freigegeben oder erneut ausgeführt, wird das PDORow-Objekt ungültig. Daher sollten Daten, die über mehrere Iterationen hinaus benötigt werden, explizit in reguläre Variablen oder Arrays kopiert werden.

Nicht direkt instanziierbar: PDORow ist eine interne Klasse und kann weder mit new PDORow() erzeugt noch durch eigene Klassen erweitert werden.

Einsatzempfehlung: PDO::FETCH_LAZY eignet sich vor allem dann, wenn nicht alle Spalten einer Zeile zwingend benötigt werden und eine möglichst speicherschonende Verarbeitung gewünscht ist. Für allgemeine Anwendungsfälle sind PDO::FETCH_ASSOC oder PDO::FETCH_OBJ oft einfacher handhabbar.