Start · Sprachen · PHP · Referenz · sqlsrv_fetch_array

sqlsrv_fetch_array

Funktion

Liest die nächste (oder eine bestimmte) Zeile eines SQLSRV-Abfrageergebnisses und gibt sie als Array zurück.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_fetch_array(resource $stmt, int $fetchType = SQLSRV_FETCH_BOTH, int $row = SQLSRV_SCROLL_NEXT, int $offset = 0): array|null|false

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

Typ
array|null|false
Beschreibung
Gibt ein Array mit den Zeilendaten zurück, wenn erfolgreich. Gibt 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);
ALFKI – Alfreds Futterkiste (Berlin) ANATR – Ana Trujillo Emparedados (México D.F.) ...

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);
Artikel: Chef Antons Cajun Gewürzmischung, Preis: 22,00 EUR

// 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).