Start · Sprachen · PHP · Referenz · sqlsrv_execute

sqlsrv_execute

Funktion

Führt ein mit <code>sqlsrv_prepare()</code> vorbereitetes SQL-Statement aus und gibt <code>true</code> bei Erfolg oder <code>false</code> bei Fehler zurück.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_execute(resource $stmt): bool

Beschreibung

sqlsrv_execute() ist Teil des Microsoft SQL Server-Treibers für PHP (SQLSRV-Extension) und dient dazu, ein zuvor mit sqlsrv_prepare() vorbereitetes Statement auszuführen. Das Statement-Handle enthält dabei bereits alle Binding-Informationen für Parameter, sodass bei wiederholter Ausführung nur die gebundenen Variablen geändert werden müssen – ohne das Statement erneut zu kompilieren.

Dieses Vorgehen (Prepare-Execute-Muster) ist besonders effizient, wenn dasselbe Statement mehrfach mit unterschiedlichen Parameterwerten ausgeführt werden soll, da der SQL Server den Ausführungsplan nur einmal erstellt und beim nächsten Aufruf von sqlsrv_execute() wiederverwenden kann. Dadurch sinkt der Overhead im Vergleich zu sqlsrv_query(), das bei jedem Aufruf neu kompiliert.

Ein weiterer Vorteil des Prepare-Execute-Musters ist die Sicherheit: Durch parametrisierte Abfragen werden Benutzereingaben niemals direkt in den SQL-String eingefügt, was SQL-Injection-Angriffe wirksam verhindert.

Nach einem erfolgreichen Aufruf kann das Ergebnis mit Funktionen wie sqlsrv_fetch_array() oder sqlsrv_fetch_object() abgerufen werden. Im Fehlerfall liefert die Funktion false; Details sind über sqlsrv_errors() abfragbar.

Parameter

Name Typ Default Beschreibung
$stmt Pflicht resource Ein Statement-Handle, das zuvor mit sqlsrv_prepare() erstellt wurde. Das Handle enthält alle Binding-Informationen für gebundene Parameter.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Statement erfolgreich ausgeführt wurde. Bei einem Fehler wird false zurückgegeben; die genauen Fehlerinformationen können über sqlsrv_errors() abgerufen werden.

Beispiele

Mehrfache Ausführung eines vorbereiteten INSERT-Statements

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

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

$sql = 'INSERT INTO Produkte (Name, Preis) VALUES (?, ?)';
$name  = '';
$preis = 0.0;

$stmt = sqlsrv_prepare($conn, $sql, [&$name, &$preis]);
if ($stmt === false) {
    die('Prepare-Fehler: ' . print_r(sqlsrv_errors(), true));
}

$produkte = [
    ['Apfel',  0.99],
    ['Banane', 1.49],
    ['Kirsche', 2.99],
];

foreach ($produkte as [$n, $p]) {
    $name  = $n;
    $preis = $p;
    if (sqlsrv_execute($stmt) === false) {
        echo 'Fehler beim Einfügen von ' . $n . ': ';
        echo print_r(sqlsrv_errors(), true);
    } else {
        echo 'Produkt "' . $n . '" erfolgreich eingefügt.' . PHP_EOL;
    }
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Produkt "Apfel" erfolgreich eingefügt. Produkt "Banane" erfolgreich eingefügt. Produkt "Kirsche" erfolgreich eingefügt.

Vorbereitetes SELECT-Statement ausführen und Ergebnisse abrufen

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

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

$sql       = 'SELECT Name, Preis FROM Produkte WHERE Preis < ?';
$maxPreis  = 2.00;

$stmt = sqlsrv_prepare($conn, $sql, [&$maxPreis]);
if ($stmt === false) {
    die('Prepare-Fehler: ' . print_r(sqlsrv_errors(), true));
}

if (sqlsrv_execute($stmt) === false) {
    die('Execute-Fehler: ' . print_r(sqlsrv_errors(), true));
}

while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['Name'] . ' kostet ' . number_format($row['Preis'], 2) . ' EUR' . PHP_EOL;
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Apfel kostet 0.99 EUR Banane kostet 1.49 EUR

// Wichtig · Fallstricke

Sicherheit: Durch die Verwendung von sqlsrv_prepare() in Kombination mit sqlsrv_execute() werden Benutzereingaben stets als Parameterwerte behandelt und niemals in den SQL-String interpoliert. Dadurch ist das Prepare-Execute-Muster der direkten String-Konkatenation in SQL-Abfragen immer vorzuziehen, um SQL-Injection-Angriffe zu verhindern.

Gebundene Parameter per Referenz: Die an sqlsrv_prepare() übergebenen Parameter müssen als Referenzen (&$variable) gebunden werden. Erst wenn sqlsrv_execute() aufgerufen wird, werden die aktuellen Werte dieser Variablen gelesen. Eine Wertübergabe ohne Referenz führt dazu, dass immer der ursprüngliche Wert verwendet wird.

Ressourcen freigeben: Nach Abschluss der Verarbeitung sollten Statement-Handles mit sqlsrv_free_stmt() und Verbindungen mit sqlsrv_close() freigegeben werden, um Speicherlecks zu vermeiden.

Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Detaillierte Fehlerinformationen (Fehlernummer, Fehlermeldung, SQLSTATE) können über sqlsrv_errors() abgefragt werden.