Start · Sprachen · PHP · Referenz · db2_prepare

db2_prepare

Funktion

Bereitet eine SQL-Anweisung für die spätere Ausführung mit <code>db2_execute()</code> vor und gibt ein Statement-Handle zurück.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_prepare(resource $connection, string $statement, array $options = []): resource|false

Beschreibung

db2_prepare() kompiliert eine SQL-Anweisung auf dem Datenbankserver, ohne sie sofort auszuführen. Das Ergebnis ist ein Statement-Handle, das anschließend mit db2_execute() — ggf. mehrfach mit unterschiedlichen Parameterwerten — ausgeführt werden kann.

Prepared Statements sind besonders dann sinnvoll, wenn dieselbe Abfrage in einer Schleife mit verschiedenen Eingabewerten ausgeführt wird: Der Datenbank-Server parst und optimiert die Anweisung nur einmal, was die Performance erheblich steigert. Darüber hinaus bieten sie den wichtigsten Sicherheitsvorteil gegenüber direkten Abfragen: Parameterwerte werden niemals als SQL-Code interpretiert, wodurch SQL-Injection-Angriffe effektiv verhindert werden.

Parameter-Platzhalter werden in der SQL-Anweisung durch Fragezeichen (?) markiert. Die tatsächlichen Werte werden erst beim Aufruf von db2_execute() übergeben. Über db2_bind_param() lassen sich Parameter zusätzlich an PHP-Variablen binden, um etwa auch Ausgabeparameter von gespeicherten Prozeduren abzurufen.

Die Funktion gehört zur IBM DB2-, Cloudscape- und Apache Derby-Erweiterung (ibm_db2) und steht nur zur Verfügung, wenn diese Extension installiert und aktiviert ist.

Parameter

Name Typ Default Beschreibung
$connection Pflicht resource Eine aktive DB2-Datenbankverbindung, die mit db2_connect() oder db2_pconnect() erstellt wurde.
$statement Pflicht string Die zu präparierende SQL-Anweisung. Platzhalter für Parameter werden mit ? angegeben, z. B. SELECT * FROM users WHERE id = ?.
$options array [] Ein assoziatives Array mit Anweisungs-Optionen. Unterstützte Schlüssel sind u. a. cursor (z. B. DB2_FORWARD_ONLY oder DB2_SCROLLABLE) zur Festlegung des Cursor-Typs.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt bei Erfolg ein Statement-Handle zurück, das für db2_execute(), db2_bind_param() und Ergebnis-Funktionen verwendet werden kann. Im Fehlerfall wird false zurückgegeben; Fehlerdetails sind dann über db2_stmt_errormsg() abrufbar.

Beispiele

Einfache SELECT-Abfrage mit einem Parameter

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    $sql = 'SELECT firstname, lastname, salary FROM employees WHERE department = ?';
    $stmt = db2_prepare($conn, $sql);

    if ($stmt) {
        $department = 'VERKAUF';
        if (db2_execute($stmt, [$department])) {
            while ($row = db2_fetch_assoc($stmt)) {
                echo $row['FIRSTNAME'] . ' ' . $row['LASTNAME'] . ': ' . $row['SALARY'] . PHP_EOL;
            }
        } else {
            echo 'Ausführungsfehler: ' . db2_stmt_errormsg($stmt);
        }
    } else {
        echo 'Prepare-Fehler: ' . db2_stmt_errormsg();
    }

    db2_close($conn);
}
Max Mustermann: 52000 Anna Beispiel: 48500

Mehrfache Ausführung desselben Prepared Statements in einer Schleife

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    $sql = 'INSERT INTO products (name, price, stock) VALUES (?, ?, ?)';
    $stmt = db2_prepare($conn, $sql);

    if (!$stmt) {
        die('Prepare fehlgeschlagen: ' . db2_stmt_errormsg());
    }

    $products = [
        ['Laptop',   999.99, 10],
        ['Maus',      19.99, 50],
        ['Tastatur',  49.99, 30],
    ];

    foreach ($products as [$name, $price, $stock]) {
        if (!db2_execute($stmt, [$name, $price, $stock])) {
            echo 'Fehler beim Einfügen von "' . $name . '": ' . db2_stmt_errormsg($stmt) . PHP_EOL;
        } else {
            echo '"' . $name . '" erfolgreich eingefügt.' . PHP_EOL;
        }
    }

    db2_close($conn);
}
"Laptop" erfolgreich eingefügt. "Maus" erfolgreich eingefügt. "Tastatur" erfolgreich eingefügt.

// Wichtig · Fallstricke

Sicherheit: Niemals Benutzereingaben direkt in den SQL-String interpolieren. Immer ?-Platzhalter verwenden und Werte über db2_execute() oder db2_bind_param() übergeben — das ist der zuverlässige Schutz vor SQL-Injection.

Fehlerbehandlung: Bei einem Fehler gibt die Funktion false zurück. Fehlerdetails erhält man über db2_stmt_errormsg() (ohne Argument, wenn db2_prepare() selbst scheiterte) oder mit dem Statement-Handle als Argument nach einem fehlgeschlagenen db2_execute().

Ressourcen: Statement-Handles sollten nach der Verwendung mit db2_free_stmt() freigegeben werden, insbesondere in Schleifen oder lang laufenden Prozessen, um Datenbankressourcen nicht zu erschöpfen.

Erweiterung: Die Funktion erfordert die ibm_db2-Extension. Diese ist nicht standardmäßig in PHP enthalten und muss separat installiert werden.