Signatur
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
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);
}
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);
}
// 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.