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