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