Start · Sprachen · PHP · Referenz · db2_exec

db2_exec

Funktion

Führt eine SQL-Anweisung direkt auf einer IBM DB2-Verbindung aus und gibt ein Statement-Handle zurück.

seit PHP 5.1.0 Kategorie: db

Signatur

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

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg ein Statement-Handle (Ressource) zurück, das für nachfolgende Abruffunktionen verwendet werden kann. Im Fehlerfall (z. B. Syntaxfehler, Verbindungsproblem) wird 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();
}
CHRISTINE HAAS DOLORES QUINTANA

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);
}
Tabelle erfolgreich erstellt.

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);
}
Zeile 3: JAMES JEFFERSON

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