Signatur
Beschreibung
odbc_execute() führt eine zuvor mit odbc_prepare() vorbereitete SQL-Anweisung aus. Dieser zweistufige Ansatz (Vorbereiten + Ausführen) entspricht dem Prepared-Statement-Muster und ermöglicht es, dieselbe Anweisung mehrfach mit unterschiedlichen Parameterwerten effizient auszuführen.
Der optionale Parameter params ist ein Array von Werten, die den Platzhaltern (?) in der vorbereiteten Anweisung der Reihe nach zugeordnet werden. Ist ein Wert in einfache Hochkommata eingeschlossen (z. B. 'value'), wird er als IN/OUT- oder OUT-Parameter behandelt; andernfalls als gewöhnlicher IN-Parameter.
Die Funktion eignet sich besonders für wiederholte Ausführungen derselben Abfrage (z. B. Batch-Inserts) sowie für parametrische Abfragen, bei denen Benutzereingaben als Parameter übergeben werden sollen, um SQL-Injection zu vermeiden.
Bei Abfragen, die Ergebnismengen liefern (z. B. SELECT), kann nach dem Aufruf von odbc_execute() mit Funktionen wie odbc_fetch_row() oder odbc_result() auf die Daten zugegriffen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | resource | Ein ODBC-Ressource-Handle, das von odbc_prepare() zurückgegeben wurde. |
|
| $params | array | [] | Ein optionales Array von Werten, die den ?-Platzhaltern in der vorbereiteten Anweisung zugeordnet werden. Werte, die als IN/OUT- oder OUT-Parameter dienen sollen, müssen in einfache Hochkommata eingeschlossen sein. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. ungültige Parameter, Datenbankfehler).Beispiele
Einfacher INSERT mit Parametern
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'passwort');
if (!$conn) {
die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}
$stmt = odbc_prepare($conn, 'INSERT INTO kunden (name, email) VALUES (?, ?)');
if (!$stmt) {
die('Vorbereitung fehlgeschlagen: ' . odbc_errormsg($conn));
}
$params = ['Max Mustermann', 'max@example.com'];
if (odbc_execute($stmt, $params)) {
echo 'Datensatz erfolgreich eingefügt.';
} else {
echo 'Fehler beim Einfügen: ' . odbc_errormsg($conn);
}
odbc_close($conn);
Batch-Inserts mit mehrfacher Ausführung derselben vorbereiteten Anweisung
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'passwort');
if (!$conn) {
die('Verbindung fehlgeschlagen.');
}
$stmt = odbc_prepare($conn, 'INSERT INTO produkte (bezeichnung, preis) VALUES (?, ?)');
if (!$stmt) {
die('Vorbereitung fehlgeschlagen.');
}
$produkte = [
['Apfel', 0.99],
['Banane', 0.49],
['Kirsche', 1.29],
];
foreach ($produkte as $produkt) {
if (!odbc_execute($stmt, $produkt)) {
echo 'Fehler bei: ' . $produkt[0] . PHP_EOL;
} else {
echo $produkt[0] . ' erfolgreich eingefügt.' . PHP_EOL;
}
}
odbc_close($conn);
SELECT-Abfrage mit Parameter und Ergebnisausgabe
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'passwort');
if (!$conn) {
die('Verbindung fehlgeschlagen.');
}
$stmt = odbc_prepare($conn, 'SELECT name, email FROM kunden WHERE id = ?');
if (!$stmt) {
die('Vorbereitung fehlgeschlagen.');
}
if (odbc_execute($stmt, [42])) {
while (odbc_fetch_row($stmt)) {
$name = odbc_result($stmt, 'name');
$email = odbc_result($stmt, 'email');
echo "Name: $name, E-Mail: $email" . PHP_EOL;
}
} else {
echo 'Abfrage fehlgeschlagen: ' . odbc_errormsg($conn);
}
odbc_close($conn);
// Wichtig · Fallstricke
Sicherheit: Obwohl Prepared Statements grundsätzlich SQL-Injection verhindern, hängt das tatsächliche Escaping vom verwendeten ODBC-Treiber ab. Vertrauenswürdige Eingaben sollten dennoch immer validiert werden.
IN/OUT-Parameter: Werte, die in einfachen Hochkommata übergeben werden ('wert'), werden als IN/OUT- oder OUT-Parameter interpretiert. Dies ist treiberspezifisch und nicht bei allen ODBC-Datenbanken gleich implementiert.
Ressourcen-Verwaltung: Das Statement-Handle kann nach der Ausführung für weitere Aufrufe von odbc_execute() wiederverwendet werden, ohne odbc_prepare() erneut aufzurufen — das ist ein wesentlicher Leistungsvorteil bei Batch-Operationen.
Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Detaillierte Fehlerinformationen liefern odbc_error() und odbc_errormsg().