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