Signatur
Beschreibung
sqlsrv_fetch_array() gehört zum Microsoft SQLSRV-Treiber für PHP und ermöglicht das zeilenweise Auslesen von Abfrageergebnissen aus einem SQL-Server-Statement. Die Funktion ist das SQLSRV-Äquivalent zu mysqli_fetch_array() und liefert je nach gewähltem Fetch-Typ ein numerisch indiziertes Array, ein assoziatives Array oder beides.
Der Parameter fetchType steuert, wie die Spalten adressiert werden: SQLSRV_FETCH_NUMERIC liefert einen numerisch indizierten Array, SQLSRV_FETCH_ASSOC einen assoziativen Array mit Spaltennamen als Schlüssel, und SQLSRV_FETCH_BOTH (Standard) kombiniert beide Varianten – identisch zum Verhalten von PDO::FETCH_BOTH.
Für scrollbare Cursor (z. B. wenn das Statement mit array('Scrollable' => 'static') oder 'keyset' vorbereitet wurde) lässt sich über die Parameter row und offset gezielt auf bestimmte Zeilen zugreifen, z. B. mit SQLSRV_SCROLL_ABSOLUTE oder SQLSRV_SCROLL_RELATIVE.
Typische Einsatzbereiche sind einfache Datenbankabfragen gegen Microsoft SQL Server oder Azure SQL in Webanwendungen, bei denen keine vollständige ORM-Schicht benötigt wird und ein direkter, leichtgewichtiger Datenzugriff gewünscht ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stmt Pflicht | resource | Eine gültige Statement-Ressource, die von sqlsrv_query() oder sqlsrv_execute() zurückgegeben wurde. |
|
| $fetchType | int | SQLSRV_FETCH_BOTH | Bestimmt den Typ des zurückgegebenen Arrays. Mögliche Werte: SQLSRV_FETCH_ASSOC (assoziativ), SQLSRV_FETCH_NUMERIC (numerisch) oder SQLSRV_FETCH_BOTH (beides). |
| $row | int | SQLSRV_SCROLL_NEXT | Gibt an, welche Zeile bei einem scrollbaren Cursor abgerufen werden soll. Nur relevant, wenn das Statement mit einem scrollbaren Cursor geöffnet wurde. Mögliche Werte: SQLSRV_SCROLL_NEXT, SQLSRV_SCROLL_PRIOR, SQLSRV_SCROLL_FIRST, SQLSRV_SCROLL_LAST, SQLSRV_SCROLL_ABSOLUTE, SQLSRV_SCROLL_RELATIVE. |
| $offset | int | 0 | Zeilenversatz bei Verwendung von SQLSRV_SCROLL_ABSOLUTE oder SQLSRV_SCROLL_RELATIVE. Wird ignoriert, wenn row einen anderen Wert hat. |
Rückgabewert
null zurück, wenn keine weiteren Zeilen verfügbar sind (Ende des Ergebnisses). Gibt false zurück, wenn ein Fehler aufgetreten ist. Mit sqlsrv_errors() lassen sich Fehlerdetails abrufen.Beispiele
Alle Zeilen als assoziatives Array ausgeben
<?php
$serverName = 'localhost';
$connectionInfo = [
'Database' => 'Northwind',
'UID' => 'sa',
'PWD' => 'geheim',
];
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
$sql = 'SELECT KundenID, Firma, Stadt FROM Kunden ORDER BY Firma';
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['KundenID'] . ' – ' . $row['Firma'] . ' (' . $row['Stadt'] . ')' . PHP_EOL;
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
Gezielter Zugriff per scrollbarem Cursor
<?php
$serverName = 'localhost';
$connectionInfo = [
'Database' => 'Northwind',
'UID' => 'sa',
'PWD' => 'geheim',
];
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
$sql = 'SELECT ArtikelID, Bezeichnung, Preis FROM Artikel ORDER BY ArtikelID';
$options = ['Scrollable' => SQLSRV_CURSOR_STATIC];
$stmt = sqlsrv_query($conn, $sql, [], $options);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
// Direkt die 5. Zeile (0-basierter Offset) abrufen
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, 4);
if ($row) {
echo 'Artikel: ' . $row['Bezeichnung'] . ', Preis: ' . number_format($row['Preis'], 2) . ' EUR' . PHP_EOL;
} else {
echo 'Keine Zeile gefunden oder Fehler aufgetreten.';
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
// Wichtig · Fallstricke
Sicherheit: Niemals Benutzereingaben direkt in SQL-Zeichenketten einbetten. Stets parametrisierte Abfragen über sqlsrv_query() oder vorbereitete Statements (sqlsrv_prepare() + sqlsrv_execute()) verwenden, um SQL-Injection zu verhindern.
Fetch-Typ SQLSRV_FETCH_BOTH: Dieser Standardtyp verdoppelt den Speicherbedarf, da jede Spalte sowohl numerisch als auch assoziativ gespeichert wird. Bei großen Ergebnismengen empfiehlt sich die explizite Angabe von SQLSRV_FETCH_ASSOC oder SQLSRV_FETCH_NUMERIC.
Scrollbare Cursor (Parameter row und offset) setzen voraus, dass das Statement mit einer entsprechenden Cursor-Option geöffnet wurde (SQLSRV_CURSOR_STATIC, SQLSRV_CURSOR_KEYSET oder SQLSRV_CURSOR_DYNAMIC). Bei einem Vorwärts-Cursor (SQLSRV_CURSOR_FORWARD, Standard) werden diese Parameter ignoriert.
Der SQLSRV-Treiber ist nur unter Windows oder mit dem offiziellen Microsoft-Treiber für Linux/macOS verfügbar und muss als PHP-Erweiterung geladen sein (extension=sqlsrv).