Signatur
Beschreibung
ocibindbyname() ist ein veralteter Alias der Funktion oci_bind_by_name(). Beide Funktionen binden eine PHP-Variable an einen benannten Platzhalter (z. B. :varname) in einem vorbereiteten OCI8-Statement. Dies ist der empfohlene Weg, um Benutzerdaten sicher an Oracle-SQL-Abfragen zu übergeben, da die Bindung SQL-Injection effektiv verhindert.
Die Bindung erfolgt per Referenz, d. h. der Wert der PHP-Variable wird erst beim Ausführen des Statements mit oci_execute() ausgelesen. So kann dieselbe gebundene Variable für mehrere Ausführungen desselben Statements verwendet werden, ohne das Statement neu zu parsen.
Mit dem Parameter $max_length wird die maximale Datenlänge für OUT-Bindungen festgelegt. Für IN-Bindungen kann -1 übergeben werden, damit PHP die Länge automatisch bestimmt. Über den Parameter $type lässt sich der Oracle-Datentyp steuern, z. B. für LOB-, ROWID- oder CURSOR-Typen.
Hinweis: Da es sich um einen veralteten Alias handelt, sollte in neuem Code ausschließlich oci_bind_by_name() verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | resource | Ein gültiges OCI8-Statement-Handle, wie es von oci_parse() zurückgegeben wird. |
|
| $param_name Pflicht | string | Der Name des Platzhalters im SQL-Statement, einschließlich des führenden Doppelpunkts, z. B. ':name'. |
|
| $variable Pflicht | mixed | Die PHP-Variable, die an den Platzhalter gebunden wird. Wird per Referenz übergeben; ihr Wert wird erst beim Ausführen des Statements gelesen. | |
| $max_length | int | -1 | Die maximale Länge der zu bindenden Daten in Bytes. Bei -1 wird die aktuelle Länge von $variable verwendet. Für OUT-Parameter muss hier explizit eine Länge angegeben werden. |
| $type | int | SQLT_CHR | Der Oracle-Datentyp der Bindung. Mögliche Werte sind z. B. SQLT_CHR (Standard, Zeichenkette), SQLT_CLOB, SQLT_BLOB, SQLT_INT, SQLT_NUM oder OCI_B_CURSOR. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. ungültiges Statement-Handle oder unbekannter Platzhalter-Name).Beispiele
Einfache IN-Bindung für eine SELECT-Abfrage
<?php
$conn = oci_connect('user', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sql = 'SELECT first_name, last_name FROM employees WHERE department_id = :dept_id';
$stmt = oci_parse($conn, $sql);
$deptId = 10;
// Veralteter Alias – in neuem Code oci_bind_by_name() verwenden
ocibindbyname($stmt, ':dept_id', $deptId, -1, SQLT_INT);
oci_execute($stmt);
while ($row = oci_fetch_assoc($stmt)) {
echo $row['FIRST_NAME'] . ' ' . $row['LAST_NAME'] . PHP_EOL;
}
oci_free_statement($stmt);
oci_close($conn);
Mehrfaches Ausführen mit geändertem Bindungswert
<?php
$conn = oci_connect('user', 'password', 'localhost/XE');
$sql = 'INSERT INTO log_entries (log_message) VALUES (:msg)';
$stmt = oci_parse($conn, $sql);
$message = '';
ocibindbyname($stmt, ':msg', $message, 200);
$messages = ['Benutzer angemeldet', 'Datei hochgeladen', 'Benutzer abgemeldet'];
foreach ($messages as $msg) {
$message = $msg; // Variable per Referenz gebunden – kein erneutes Binden nötig
oci_execute($stmt);
}
echo count($messages) . ' Einträge eingefügt.';
oci_free_statement($stmt);
oci_close($conn);
// Wichtig · Fallstricke
Veraltet: ocibindbyname() ist ein Alias aus frühen PHP-Versionen und sollte in neuem Code nicht mehr verwendet werden. Nutze stattdessen oci_bind_by_name().
Sicherheit: Durch die Verwendung von Bind-Variablen werden SQL-Injection-Angriffe verhindert, da die übergebenen Werte niemals direkt in den SQL-Text eingebettet werden. Die Werte werden separat an Oracle übergeben und dort korrekt typisiert ausgewertet.
Performance: Oracle kann vorbereitete Statements mit Bind-Variablen im Shared Pool cachen (Soft Parse). Wenn dieselbe SQL-Struktur häufig ausgeführt wird, verbessert die Bindung die Performance erheblich im Vergleich zu dynamisch zusammengesetzten SQL-Strings.
OUT-Parameter: Für OUT- und IN/OUT-Parameter eines PL/SQL-Blocks muss $max_length immer explizit auf einen ausreichend großen Wert gesetzt werden, da PHP sonst nicht genug Speicher für den Rückgabewert reserviert.