Signatur
Beschreibung
odbc_prepare() sendet eine SQL-Anweisung zur Vorbereitung an den ODBC-Treiber, ohne sie sofort auszuführen. Der Datenbankserver analysiert und optimiert die Anweisung, sodass sie anschließend mit odbc_execute() ein- oder mehrfach effizient ausgeführt werden kann.
Besonders nützlich ist die Funktion, wenn dieselbe SQL-Anweisung mit unterschiedlichen Parameterwerten wiederholt ausgeführt werden soll. Durch die einmalige Vorbereitung spart man Analyse-Overhead und verbessert die Performance. Parameter-Platzhalter werden als ? in der SQL-Zeichenkette angegeben und erst beim Aufruf von odbc_execute() gebunden.
Neben der Performance bietet odbc_prepare() auch einen Sicherheitsvorteil: Durch die Trennung von SQL-Code und Parameterwerten wird SQL-Injection wirkungsvoll verhindert, sofern Benutzereingaben ausschließlich als Parameter übergeben werden.
Das zurückgegebene Statement-Handle kann wie eine reguläre ODBC-Ergebnis-Ressource behandelt und mit Funktionen wie odbc_fetch_array() oder odbc_num_rows() ausgewertet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $odbc Pflicht | resource | Eine aktive ODBC-Verbindungsressource, die mit odbc_connect() oder odbc_pconnect() erzeugt wurde. |
|
| $query Pflicht | string | Die SQL-Anweisung, die vorbereitet werden soll. Parameter-Platzhalter werden als ? angegeben, z. B. SELECT * FROM users WHERE id = ?. |
Rückgabewert
odbc_execute() ausgeführt werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfaches Prepared Statement mit einem Parameter
<?php
$conn = odbc_connect('myDSN', 'dbuser', 'secret');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
$stmt = odbc_prepare($conn, 'SELECT name, email FROM users WHERE id = ?');
if (!$stmt) {
die('Vorbereitung fehlgeschlagen: ' . odbc_errormsg($conn));
}
$params = [42];
if (odbc_execute($stmt, $params)) {
while ($row = odbc_fetch_array($stmt)) {
echo $row['name'] . ' – ' . $row['email'] . PHP_EOL;
}
} else {
echo 'Ausführung fehlgeschlagen: ' . odbc_errormsg($conn);
}
odbc_close($conn);
Wiederholte Ausführung mit verschiedenen Parametern (INSERT)
<?php
$conn = odbc_connect('myDSN', 'dbuser', 'secret');
$stmt = odbc_prepare($conn, 'INSERT INTO products (name, price) VALUES (?, ?)');
if (!$stmt) {
die('Vorbereitung fehlgeschlagen');
}
$products = [
['Apfel', 0.49],
['Banane', 0.89],
['Kirsche', 1.29],
];
foreach ($products as $product) {
if (!odbc_execute($stmt, $product)) {
echo 'Fehler beim Einfügen von ' . $product[0] . PHP_EOL;
} else {
echo $product[0] . ' erfolgreich eingefügt.' . PHP_EOL;
}
}
odbc_close($conn);
// Wichtig · Fallstricke
Sicherheit: Übergeben Sie Benutzereingaben immer als Parameter über odbc_execute() und niemals durch direkte Einbettung in den SQL-String. Nur so ist der Schutz vor SQL-Injection gewährleistet.
Treiber-Unterstützung: Nicht alle ODBC-Treiber unterstützen Prepared Statements vollständig. Bei fehlender Unterstützung kann odbc_prepare() false zurückliefern oder das Verhalten abweichen. Prüfen Sie stets den Rückgabewert.
Ressourcen freigeben: Statement-Handles werden automatisch am Ende des Skripts freigegeben, können aber auch explizit mit odbc_free_result() geschlossen werden, um Speicher zu sparen.
String-Parameter: odbc_execute() erwartet Strings, die Hochkommas enthalten, in spezieller Escaping-Form. Für binäre Daten oder Sonderzeichen sollte auf die jeweilige Treiberdokumentation geachtet werden.