Start · Sprachen · PHP · Referenz · db2_fetch_both

db2_fetch_both

Funktion

Liest die nächste Zeile eines Abfrageergebnisses und gibt sie als Array zurück, das sowohl nach Spaltenname als auch nach Spaltenposition indiziert ist.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_fetch_both(resource $stmt, int $row_number = -1): array|false

Beschreibung

db2_fetch_both() holt die nächste verfügbare Zeile aus dem Ergebnis-Statement einer IBM DB2-, Cloudscape- oder Apache Derby-Datenbank und gibt sie als assoziatives und numerisch indiziertes Array zurück. Das bedeutet, jeder Spaltenwert ist doppelt vorhanden: einmal unter dem Spaltennamen (Groß-/Kleinschreibung wie in der Datenbank) und einmal unter seiner nullbasierten Position.

Diese Funktion ist praktisch, wenn Spalten sowohl über ihren Namen als auch über ihre Position angesprochen werden sollen, zum Beispiel in generischem Code, der die Spaltenstruktur nicht kennt. Für spezialisierte Anwendungsfälle, bei denen Speicher gespart werden soll, sind db2_fetch_assoc() oder db2_fetch_array() effizienter, da sie das Array nur einfach befüllen.

Mit dem optionalen Parameter row_number kann bei scrollbaren Cursorn eine bestimmte Zeilennummer direkt angesprungen werden. Bei vorwärtsorientierten (nicht scrollbaren) Cursorn muss dieser Parameter weggelassen oder auf -1 gesetzt werden.

Die Funktion gibt false zurück, wenn keine weiteren Zeilen verfügbar sind oder ein Fehler auftritt. Sie eignet sich gut in einer while-Schleife zum Iterieren aller Ergebniszeilen.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Eine gültige Statement-Ressource, die durch db2_exec() oder db2_execute() erzeugt wurde.
$row_number int -1 Gibt bei scrollbaren Cursorn die 1-basierte Zeilennummer an, die abgerufen werden soll. Bei -1 oder Weglassen wird die nächste Zeile sequenziell geholt.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array zurück, das die Spaltenwerte der aktuellen Zeile sowohl unter dem Spaltennamen (String-Schlüssel) als auch unter der nullbasierten Spaltenposition (Integer-Schlüssel) enthält. Gibt false zurück, wenn keine weiteren Zeilen vorhanden sind oder ein Fehler aufgetreten ist.

Beispiele

Alle Zeilen einer Tabelle iterieren

<?php
$conn = db2_connect('SAMPLE', 'db2inst1', 'geheimesPasswort');

if ($conn) {
    $sql = 'SELECT id, name, email FROM users';
    $stmt = db2_exec($conn, $sql);

    if ($stmt) {
        while ($row = db2_fetch_both($stmt)) {
            // Zugriff per Spaltenname
            echo 'Name: ' . $row['NAME'] . PHP_EOL;
            // Zugriff per Position (0-basiert)
            echo 'ID (pos 0): ' . $row[0] . PHP_EOL;
            echo 'Email (pos 2): ' . $row[2] . PHP_EOL;
            echo '---' . PHP_EOL;
        }
    }

    db2_close($conn);
}
Name: Max Mustermann ID (pos 0): 1 Email (pos 2): max@example.com --- Name: Erika Musterfrau ID (pos 0): 2 Email (pos 2): erika@example.com ---

Gezielter Zeilenabruf mit scrollbarem Cursor

<?php
$conn = db2_connect('SAMPLE', 'db2inst1', 'geheimesPasswort');

if ($conn) {
    $sql = 'SELECT id, artikel, preis FROM produkte';
    // Scrollbaren Cursor aktivieren
    $stmt = db2_exec($conn, $sql, [
        'cursor' => DB2_SCROLLABLE
    ]);

    if ($stmt) {
        // Direkt die dritte Zeile abrufen
        $row = db2_fetch_both($stmt, 3);

        if ($row !== false) {
            echo 'Artikel: ' . $row['ARTIKEL'] . PHP_EOL;
            echo 'Preis:   ' . $row['PREIS'] . PHP_EOL;
            echo 'ID via Index: ' . $row[0] . PHP_EOL;
        }
    }

    db2_close($conn);
}
Artikel: Tastatur Preis: 29.99 ID via Index: 3

// Wichtig · Fallstricke

Speicherverbrauch: Da jeder Spaltenwert doppelt im zurückgegebenen Array gespeichert wird (einmal per Name, einmal per Index), ist der Speicherbedarf doppelt so hoch wie bei db2_fetch_assoc() oder db2_fetch_array(). Bei sehr breiten Tabellen oder großen Ergebnismengen sollte daher eine der spezialisierten Funktionen bevorzugt werden.

Spaltennamen: Die Schlüssel im assoziativen Teil des Arrays entsprechen den Spaltennamen in Großbuchstaben, so wie sie die Datenbank zurückliefert. Bei Aliasnamen (z. B. SELECT name AS benutzername) wird der Alias-Name verwendet.

Rückgabe false: Sowohl das Ende der Ergebnismenge als auch ein Fehler führen zur Rückgabe von false. Mit db2_stmt_errormsg() kann nach dem Aufruf geprüft werden, ob ein Fehler vorliegt.