Start · Sprachen · PHP · Referenz · odbc_prepare

odbc_prepare

Funktion

Bereitet eine SQL-Anweisung für die Ausführung über eine ODBC-Verbindung vor und gibt ein Statement-Handle zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

odbc_prepare(resource $odbc, string $query): resource|false

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

Typ
resource|false
Beschreibung
Bei Erfolg wird ein ODBC-Statement-Handle (Ressource) zurückgegeben, das mit 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);
Max Mustermann – max@example.com

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);
Apfel erfolgreich eingefügt. Banane erfolgreich eingefügt. Kirsche erfolgreich eingefügt.

// 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.