Signatur
Beschreibung
db2_exec() sendet eine SQL-Anweisung direkt an den Datenbankserver und führt sie sofort aus, ohne sie vorher vorzubereiten. Dies ist besonders praktisch für einmalig ausgeführte Abfragen oder DDL-Befehle (z. B. CREATE TABLE, DROP INDEX), bei denen der Overhead einer separaten Prepare-Phase nicht sinnvoll ist.
Im Gegensatz zu db2_prepare() + db2_execute() erlaubt db2_exec() keine Verwendung von Platzhaltern (Parametern). Sollen Benutzereingaben in die Abfrage eingebunden werden, müssen diese zuvor korrekt escaped werden – andernfalls entsteht ein ernsthaftes SQL-Injection-Risiko. Für parametrisierte Eingaben sollte daher stets db2_prepare() + db2_execute() bevorzugt werden.
Das zurückgegebene Statement-Handle kann anschließend mit Funktionen wie db2_fetch_assoc(), db2_fetch_array() oder db2_num_rows() weiterverarbeitet werden. Nach der Verarbeitung sollte das Handle mit db2_free_result() freigegeben werden.
Über den optionalen Parameter $options lassen sich Cursor-Typen und weitere Abfrageoptionen steuern, etwa DB2_FORWARD_ONLY oder DB2_SCROLLABLE für scrollbare Ergebnismengen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection Pflicht | resource | Eine aktive DB2-Verbindungsressource, wie sie von db2_connect() oder db2_pconnect() zurückgegeben wird. |
|
| $statement Pflicht | string | Die auszuführende SQL-Anweisung als Zeichenkette. Darf keine Platzhalter (?) enthalten. Benutzereingaben müssen vorher sicher escaped werden. |
|
| $options | array | [] | Assoziatives Array mit Abfrageoptionen. Mögliche Schlüssel sind z. B. cursor (Wert: DB2_FORWARD_ONLY oder DB2_SCROLLABLE) zur Steuerung des Cursor-Verhaltens. |
Rückgabewert
false zurückgegeben. Fehlerdetails können dann mit db2_stmt_errormsg() abgerufen werden.Beispiele
Einfache SELECT-Abfrage ausführen
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheim');
if ($conn) {
$sql = "SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE WHERE WORKDEPT = 'A00'";
$stmt = db2_exec($conn, $sql);
if ($stmt) {
while ($row = db2_fetch_assoc($stmt)) {
echo $row['FIRSTNAME'] . ' ' . $row['LASTNAME'] . PHP_EOL;
}
db2_free_result($stmt);
} else {
echo 'Fehler: ' . db2_stmt_errormsg();
}
db2_close($conn);
} else {
echo 'Verbindung fehlgeschlagen: ' . db2_conn_errormsg();
}
DDL-Anweisung: Tabelle erstellen
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheim');
if ($conn) {
$ddl = "CREATE TABLE produkte (
id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
name VARCHAR(100) NOT NULL,
preis DECIMAL(10,2),
PRIMARY KEY (id)
)";
$stmt = db2_exec($conn, $ddl);
if ($stmt !== false) {
echo 'Tabelle erfolgreich erstellt.';
db2_free_result($stmt);
} else {
echo 'Fehler beim Erstellen: ' . db2_stmt_errormsg();
}
db2_close($conn);
}
Scrollbarer Cursor für wahlfreien Zugriff
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheim');
if ($conn) {
$options = ['cursor' => DB2_SCROLLABLE];
$stmt = db2_exec($conn, 'SELECT * FROM EMPLOYEE', $options);
if ($stmt) {
// Direkt auf Zeile 3 zugreifen
$row = db2_fetch_assoc($stmt, 3);
if ($row) {
echo 'Zeile 3: ' . $row['FIRSTNAME'] . ' ' . $row['LASTNAME'];
}
db2_free_result($stmt);
}
db2_close($conn);
}
// Wichtig · Fallstricke
SQL-Injection-Gefahr: Da db2_exec() keine parametrisierten Abfragen unterstützt, dürfen Benutzereingaben niemals direkt in die SQL-Zeichenkette eingebettet werden. Für solche Fälle immer db2_prepare() in Kombination mit db2_execute() verwenden, da diese Parameterersetzung serverseitig und sicher durchführen.
Wenn dieselbe SQL-Anweisung mehrfach mit unterschiedlichen Werten ausgeführt wird, ist db2_prepare() + db2_execute() auch aus Leistungsgründen vorzuziehen, da die Datenbank den Ausführungsplan nur einmal kompilieren muss.
Diese Funktion ist Teil der IBM DB2, Cloudscape und Apache Derby-Erweiterung (ibm_db2). Sie steht nur zur Verfügung, wenn die Erweiterung installiert und aktiviert ist.