Signatur
Beschreibung
oci_fetch_array() liest die nächste Zeile aus einem ausgeführten Oracle-Statement und gibt sie als Array zurück. Über den Parameter $mode wird gesteuert, ob das Array assoziative Schlüssel (Spaltennamen), numerische Indizes oder beides enthält. Die Funktion ist das Pendant zu oci_fetch_assoc() und oci_fetch_row(), bietet aber mehr Flexibilität durch den Mode-Parameter.
Typischerweise wird oci_fetch_array() in einer while-Schleife verwendet, die so lange durchläuft, bis kein weiterer Datensatz mehr vorhanden ist und false zurückgegeben wird. Standardmäßig werden NULL-Werte als PHP-null zurückgegeben, wenn OCI_RETURN_NULLS gesetzt ist.
Die Konstanten für $mode können mit dem bitweisen ODER-Operator kombiniert werden: OCI_ASSOC liefert ein assoziatives Array mit Spaltennamen als Schlüssel, OCI_NUM ein numerisch indiziertes Array, und OCI_BOTH (Standard) liefert beide Formen gleichzeitig. OCI_RETURN_LOBS sorgt dafür, dass LOB-Werte direkt als Zeichenkette statt als LOB-Deskriptor zurückgegeben werden.
Spaltennamen im assoziativen Modus sind standardmäßig in Großbuchstaben, da Oracle intern Bezeichner groß schreibt. Werden in der SQL-Abfrage Spalten-Aliase mit Anführungszeichen in Kleinschreibung definiert, spiegeln sich diese im Ergebnis wider.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | resource | Ein gültiges OCI8-Statement-Handle, das zuvor mit oci_parse() erzeugt und mit oci_execute() ausgeführt wurde. |
|
| $mode | int | OCI_BOTH | OCI_RETURN_NULLS | Kombinierbare Flags, die das Rückgabeformat steuern. Mögliche Werte: OCI_ASSOC (assoziativ), OCI_NUM (numerisch), OCI_BOTH (beides), OCI_RETURN_NULLS (NULL-Werte als PHP-null), OCI_RETURN_LOBS (LOBs als String statt Deskriptor). |
Rückgabewert
$mode-Parameter ab. Sind keine weiteren Zeilen vorhanden, wird false zurückgegeben. Im Fehlerfall wird ebenfalls false zurückgegeben.Beispiele
Alle Zeilen einer Abfrage mit assoziativem Array auslesen
<?php
$conn = oci_connect('hr', 'geheim', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$sql = 'SELECT employee_id, last_name, salary FROM employees WHERE rownum <= 5';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);
while ($row = oci_fetch_array($stmt, OCI_ASSOC | OCI_RETURN_NULLS)) {
echo $row['EMPLOYEE_ID'] . ': ' . $row['LAST_NAME'] . ' (' . $row['SALARY'] . ')' . PHP_EOL;
}
oci_free_statement($stmt);
oci_close($conn);
LOB-Inhalte direkt als String lesen
<?php
$conn = oci_connect('hr', 'geheim', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$sql = 'SELECT dokument_id, inhalt FROM dokumente WHERE dokument_id = :id';
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':id', $id);
$id = 42;
oci_execute($stmt);
// OCI_RETURN_LOBS gibt den LOB-Inhalt direkt als String zurück
if ($row = oci_fetch_array($stmt, OCI_ASSOC | OCI_RETURN_LOBS)) {
echo 'Dokument-ID: ' . $row['DOKUMENT_ID'] . PHP_EOL;
echo 'Inhalt (erste 100 Zeichen): ' . substr($row['INHALT'], 0, 100) . PHP_EOL;
} else {
echo 'Kein Datensatz gefunden.' . PHP_EOL;
}
oci_free_statement($stmt);
oci_close($conn);
Numerisches Array für Index-basierten Zugriff
<?php
$conn = oci_connect('hr', 'geheim', 'localhost/XE');
$stmt = oci_parse($conn, 'SELECT department_id, department_name FROM departments WHERE rownum <= 3');
oci_execute($stmt);
while ($row = oci_fetch_array($stmt, OCI_NUM)) {
// Zugriff über numerischen Index
printf("ID: %d, Name: %s\n", $row[0], $row[1]);
}
oci_free_statement($stmt);
oci_close($conn);
// Wichtig · Fallstricke
Spaltennamen in Großbuchstaben: Im assoziativen Modus werden Schlüssel standardmäßig in Großbuchstaben zurückgegeben, da Oracle Bezeichner intern groß schreibt. Der Zugriff auf $row['last_name'] schlägt fehl — korrekt ist $row['LAST_NAME'].
SQL-Injection: Verwende niemals direkt verkettete Benutzereingaben in SQL-Abfragen. Nutze stets oci_bind_by_name() für parametrisierte Abfragen, um SQL-Injection-Angriffe zu verhindern.
LOB-Behandlung: Ohne OCI_RETURN_LOBS werden CLOB/BLOB-Spalten als LOB-Deskriptor-Objekte zurückgegeben, nicht als Zeichenketten. Bei großen LOBs kann OCI_RETURN_LOBS zu hohem Speicherverbrauch führen — in solchen Fällen ist das manuelle Lesen über den Deskriptor effizienter.
Performance: OCI_BOTH (der Standard) speichert jeden Wert doppelt (assoziativ und numerisch) und verbraucht dadurch mehr Speicher. Für produktiven Einsatz empfiehlt sich daher explizit OCI_ASSOC oder OCI_NUM anzugeben.