Start · Sprachen · PHP · Referenz · sqlsrv_has_rows

sqlsrv_has_rows

Funktion

Gibt zurück, ob das ausgeführte SQLSRV-Statement mindestens eine Zeile im Ergebnis enthält.

seit PHP 1.1.0 Kategorie: db

Signatur

sqlsrv_has_rows(resource $stmt): bool

Beschreibung

sqlsrv_has_rows() prüft, ob ein über sqlsrv_query() oder sqlsrv_execute() ausgeführtes Statement Ergebniszeilen enthält. Die Funktion gibt true zurück, wenn mindestens eine Zeile vorhanden ist, andernfalls false. Sie ist besonders nützlich, wenn man vor dem eigentlichen Abruf der Daten wissen möchte, ob ein Ergebnis vorliegt – etwa um eine leere Ergebnismenge frühzeitig zu behandeln.

Im Gegensatz zu sqlsrv_num_rows() benötigt sqlsrv_has_rows() keinen scrollbaren Cursor, da sie lediglich eine boolesche Aussage trifft. Sie funktioniert sowohl mit vorwärts- als auch mit scrollbaren Cursorn und ist damit flexibler einsetzbar.

Ein typischer Anwendungsfall ist die Existenzprüfung eines Datensatzes in der Datenbank, bevor weitere Verarbeitungsschritte eingeleitet werden. Das vermeidet unnötige Schleifen oder sqlsrv_fetch_array()-Aufrufe auf leeren Ergebnismengen.

Beachte, dass die Funktion nur auf ausgeführten Statements funktioniert. Wird sie auf einem nicht ausgeführten Statement aufgerufen, schlägt sie fehl. Außerdem wird der interne Zeigerstand des Resultsets durch den Aufruf nicht verändert.

Parameter

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

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Statement mindestens eine Ergebniszeile enthält, false wenn keine Zeilen vorhanden sind. Im Fehlerfall wird ebenfalls false zurückgegeben – Fehlerdetails können über sqlsrv_errors() abgerufen werden.

Beispiele

Existenzprüfung eines Datensatzes vor dem Abruf

<?php
$serverName = "localhost";
$connectionInfo = [
    "Database" => "MeineDB",
    "UID"      => "sa",
    "PWD"      => "geheimesPasswort"
];

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    die("Verbindung fehlgeschlagen: " . print_r(sqlsrv_errors(), true));
}

$sql  = "SELECT BenutzerID, Name FROM Benutzer WHERE BenutzerID = ?";
$params = [42];
$stmt = sqlsrv_query($conn, $sql, $params);

if ($stmt === false) {
    die("Abfragefehler: " . print_r(sqlsrv_errors(), true));
}

if (sqlsrv_has_rows($stmt)) {
    // Mindestens eine Zeile vorhanden – Daten abrufen
    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    echo "Benutzer gefunden: " . htmlspecialchars($row['Name']);
} else {
    echo "Kein Benutzer mit ID 42 gefunden.";
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Benutzer gefunden: Max Mustermann

Prüfung nach einer UPDATE-Abfrage mit WHERE-Bedingung

<?php
$serverName = "localhost";
$connectionInfo = [
    "Database" => "MeineDB",
    "UID"      => "sa",
    "PWD"      => "geheimesPasswort"
];

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

// Prüfen, ob ein Produkt in der Datenbank existiert, bevor es aktualisiert wird
$checkSql    = "SELECT ProduktID FROM Produkte WHERE ProduktID = ? AND Aktiv = 1";
$checkParams = [99];
$checkStmt   = sqlsrv_query($conn, $checkSql, $checkParams);

if (sqlsrv_has_rows($checkStmt)) {
    $updateSql    = "UPDATE Produkte SET Preis = ? WHERE ProduktID = ?";
    $updateParams = [19.99, 99];
    $updateStmt   = sqlsrv_query($conn, $updateSql, $updateParams);

    if ($updateStmt !== false) {
        echo "Preis erfolgreich aktualisiert.";
        sqlsrv_free_stmt($updateStmt);
    } else {
        echo "Fehler beim Update: " . print_r(sqlsrv_errors(), true);
    }
} else {
    echo "Produkt nicht gefunden oder inaktiv – kein Update durchgeführt.";
}

sqlsrv_free_stmt($checkStmt);
sqlsrv_close($conn);
?>
Preis erfolgreich aktualisiert.

// Wichtig · Fallstricke

Cursor-Kompatibilität: Anders als sqlsrv_num_rows(), die einen scrollbaren Cursor voraussetzt, funktioniert sqlsrv_has_rows() auch mit dem Standard-Vorwärtscursor (SQLSRV_CURSOR_FORWARD). Für die meisten Existenzprüfungen ist sie daher die bevorzugte Wahl.

Zeigerposition: Der Aufruf von sqlsrv_has_rows() verändert die aktuelle Zeigerposition im Resultset nicht, sodass nach dem Aufruf ganz normal mit sqlsrv_fetch_array() oder ähnlichen Funktionen iteriert werden kann.

Fehlerfall: Im Fehlerfall – etwa wenn das Statement nicht korrekt ausgeführt wurde – gibt die Funktion false zurück, was nicht von einer leeren Ergebnismenge unterschieden werden kann. Es empfiehlt sich daher, das Statement vorher auf Fehler zu prüfen.