Start · Sprachen · PHP · Referenz · sqlsrv_num_fields

sqlsrv_num_fields

Funktion

Gibt die Anzahl der Felder (Spalten) zurück, die ein ausgeführtes <code>sqlsrv</code>-Statement liefert.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_num_fields(resource $stmt): int|false

Beschreibung

sqlsrv_num_fields() ermittelt die Spaltenanzahl des Ergebnissets eines mit sqlsrv_query() oder sqlsrv_execute() ausgeführten Statements. Die Funktion ist besonders nützlich, wenn Abfragen dynamisch aufgebaut werden und die Struktur des Ergebnisses zur Laufzeit nicht bekannt ist – etwa beim Iterieren über alle Spalten eines Datensatzes ohne explizite Spaltennamen.

Die Funktion kann sowohl vor als auch nach dem ersten Aufruf von sqlsrv_fetch() verwendet werden, da die Spaltenmetadaten bereits nach der Ausführung des Statements verfügbar sind. Beachten Sie jedoch, dass das Statement zuvor tatsächlich ausgeführt worden sein muss – ein lediglich vorbereitetes Statement reicht nicht aus.

Im Zusammenspiel mit sqlsrv_field_metadata() lässt sich damit eine vollständige dynamische Verarbeitung von SQL-Ergebnissen realisieren, bei der weder Spaltennamen noch Anzahl vorab feststehen müssen.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Eine gültige Statement-Ressource, die mit sqlsrv_query() oder sqlsrv_execute() erzeugt und ausgeführt wurde.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der Felder (Spalten) im Ergebnisset als int zurück. Bei einem Fehler – z. B. wenn das Statement ungültig ist oder noch nicht ausgeführt wurde – wird false zurückgegeben.

Beispiele

Spaltenanzahl eines SELECT-Ergebnisses ausgeben

<?php
$serverName = 'localhost';
$connectionInfo = [
    'Database' => 'TestDB',
    'UID'      => 'sa',
    'PWD'      => 'geheim',
];

$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

$sql  = 'SELECT KundeID, Vorname, Nachname, Email FROM Kunden';
$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

$anzahl = sqlsrv_num_fields($stmt);
echo 'Anzahl der Spalten: ' . $anzahl . PHP_EOL;

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
Anzahl der Spalten: 4

Alle Spalten dynamisch ausgeben

<?php
$serverName = 'localhost';
$connectionInfo = [
    'Database' => 'TestDB',
    'UID'      => 'sa',
    'PWD'      => 'geheim',
];

$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

$sql  = 'SELECT * FROM Produkte';
$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

$anzahl = sqlsrv_num_fields($stmt);
$meta   = sqlsrv_field_metadata($stmt);

echo 'Dieses Statement liefert ' . $anzahl . ' Spalte(n):' . PHP_EOL;
foreach ($meta as $index => $feld) {
    echo '  [' . $index . '] ' . $feld['Name'] . ' (' . $feld['Type'] . ')' . PHP_EOL;
}

while ($zeile = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_NUMERIC)) {
    for ($i = 0; $i < $anzahl; $i++) {
        echo $zeile[$i] . "\t";
    }
    echo PHP_EOL;
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
Dieses Statement liefert 5 Spalte(n): [0] ProduktID (4) [1] Name (12) [2] Preis (8) [3] Lagerbestand (4) [4] Kategorie (12) 1 Apfel 0.49 200 Obst 2 Banane 0.89 150 Obst

// Wichtig · Fallstricke

Nur für SELECT-Statements: Bei DML-Statements wie INSERT, UPDATE oder DELETE gibt die Funktion 0 zurück, da kein Ergebnisset mit Spalten erzeugt wird. Verwenden Sie in diesen Fällen sqlsrv_rows_affected(), um die Anzahl betroffener Zeilen zu ermitteln.

Statement muss ausgeführt sein: Die Funktion erwartet ein bereits ausgeführtes Statement. Ein mit sqlsrv_prepare() vorbereitetes, aber noch nicht mit sqlsrv_execute() ausgeführtes Statement führt zu false als Rückgabewert.

Die Funktion gehört zur SQLSRV-Erweiterung (Microsoft Treiber für PHP für SQL Server) und steht nur zur Verfügung, wenn diese Erweiterung installiert und aktiviert ist.