Signatur
Beschreibung
oci_parse() analysiert eine SQL- oder PL/SQL-Anweisung und erstellt daraus ein Statement-Handle, das für spätere Ausführungen mit oci_execute() oder das Binden von Variablen mit oci_bind_by_name() verwendet werden kann. Die Funktion sendet die Anweisung dabei noch nicht an die Datenbank — es findet lediglich eine clientseitige Vorbereitung statt.
Typischerweise setzt man oci_parse() ein, wenn man parametrisierte Abfragen aufbauen möchte, indem man zunächst das Statement mit Platzhaltern (z. B. :id) parst, dann mit oci_bind_by_name() konkrete Werte daran bindet und schließlich mit oci_execute() ausführt. Dieses Muster verhindert SQL-Injection und ermöglicht effizientes Wiederausführen derselben Anweisung mit unterschiedlichen Parametern.
Das zurückgegebene Statement-Handle muss nach Abschluss aller Operationen mit oci_free_statement() freigegeben werden, um Ressourcen auf der Oracle-Seite nicht unnötig zu belegen. Wird dasselbe Statement mehrfach mit neuen Bindungen ausgeführt, genügt ein einmaliger Aufruf von oci_parse().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection Pflicht | resource | Eine aktive Oracle-Verbindungsressource, die zuvor mit oci_connect(), oci_pconnect() oder oci_new_connect() erstellt wurde. |
|
| $sql Pflicht | string | Die SQL- oder PL/SQL-Anweisung als Zeichenkette. Für Bindeparameter werden benannte Platzhalter in der Form :name verwendet. Semikolons am Ende von einzelnen SQL-Anweisungen werden weggelassen; PL/SQL-Blöcke enden hingegen mit einem Semikolon. |
Rückgabewert
false zurückgegeben.Beispiele
Einfaches SELECT mit Bind-Variable
<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XEPDB1');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
$sql = 'SELECT vorname, nachname FROM mitarbeiter WHERE abteilung_id = :abt_id';
$stmt = oci_parse($conn, $sql);
$abtId = 5;
oci_bind_by_name($stmt, ':abt_id', $abtId);
oci_execute($stmt);
while ($row = oci_fetch_assoc($stmt)) {
echo $row['VORNAME'] . ' ' . $row['NACHNAME'] . PHP_EOL;
}
oci_free_statement($stmt);
oci_close($conn);
Mehrfaches Ausführen derselben INSERT-Anweisung
<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XEPDB1');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
$sql = 'INSERT INTO protokoll (nachricht, erstellt_am) VALUES (:msg, SYSDATE)';
$stmt = oci_parse($conn, $sql);
$nachrichten = ['Login erfolgreich', 'Datei hochgeladen', 'Logout'];
foreach ($nachrichten as $msg) {
oci_bind_by_name($stmt, ':msg', $msg);
// OCI_NO_AUTO_COMMIT: Transaktion offen halten
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
}
oci_commit($conn);
oci_free_statement($stmt);
oci_close($conn);
echo 'Alle Einträge erfolgreich gespeichert.';
// Wichtig · Fallstricke
SQL-Injection: Verwende niemals direkte Stringkonkatenation mit Benutzereingaben in der SQL-Anweisung. Nutze stets Bind-Variablen via oci_bind_by_name(), um SQL-Injection zu verhindern.
PL/SQL-Blöcke: Anonyme PL/SQL-Blöcke (BEGIN ... END;) sowie gespeicherte Prozeduraufrufe werden ebenfalls mit oci_parse() vorbereitet. Hier ist das abschließende Semikolon innerhalb des Strings erforderlich.
Ressourcenverwaltung: Jede mit oci_parse() erzeugte Ressource belegt serverseitige Oracle-Cursor. Bei vielen Statements ohne oci_free_statement() kann das Limit offener Cursor (OPEN_CURSORS) in Oracle erreicht werden, was zu Fehlern führt.
Fehlerbehandlung: Im Fehlerfall liefert oci_parse() false. Detaillierte Fehlermeldungen sind über oci_error($connection) abrufbar.