Signatur
Beschreibung
oci_new_connect() stellt eine vollständig neue, separate Datenbankverbindung zu einem Oracle-Server her. Im Unterschied zu oci_connect() und oci_pconnect() wird hierbei keine bereits bestehende oder gecachte Verbindung wiederverwendet – auch dann nicht, wenn dieselben Zugangsdaten und der gleiche Connection-String bereits für eine andere Verbindung genutzt wurden.
Diese Funktion ist besonders dann sinnvoll, wenn innerhalb eines Skripts mehrere unabhängige Transaktionen parallel verwaltet werden müssen, die sich gegenseitig nicht beeinflussen sollen. Da jede Verbindung eine eigene Oracle-Session erhält, sind Transaktionen, Sperren und Sitzungsvariablen vollständig isoliert.
Der Parameter session_mode erlaubt es, die Verbindung mit erhöhten Berechtigungen zu öffnen, z. B. mit OCI_SYSDBA oder OCI_SYSOPER, was für administrative Aufgaben notwendig ist. Der optionale encoding-Parameter legt den Client-seitigen Zeichensatz fest und sollte auf den Datenbankzeichensatz abgestimmt sein.
Für die meisten Webanwendungen, bei denen pro Request nur eine Oracle-Verbindung benötigt wird, ist oci_connect() performanter. oci_new_connect() kommt vor allem in CLI-Skripten oder komplexen Transaktionsszenarien zum Einsatz.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $username Pflicht | string | Oracle-Benutzername für die Authentifizierung. | |
| $password Pflicht | string | Passwort des Oracle-Benutzers. | |
| $connection_string | string | Oracle-Verbindungsstring, z. B. ein TNS-Name, ein Easy Connect-String (host/service_name) oder ein vollständiger Deskriptor. Wird er weggelassen, wird die Umgebungsvariable ORACLE_SID verwendet. |
|
| $encoding | string | Oracle-Zeichensatz für die Client-Session, z. B. AL32UTF8. Wird er nicht angegeben, verwendet Oracle den Zeichensatz aus der Umgebungsvariable NLS_LANG oder den Datenbankstandard. |
|
| $session_mode | int | OCI_DEFAULT | Verbindungsmodus. Mögliche Werte: OCI_DEFAULT, OCI_SYSDBA, OCI_SYSOPER, OCI_CRED_EXT. Für administrative Verbindungen wird OCI_SYSDBA oder OCI_SYSOPER benötigt. |
Rückgabewert
false zurückgegeben und ein Fehler ausgegeben, der mit oci_error() abgefragt werden kann.Beispiele
Einfache neue Oracle-Verbindung mit Easy Connect
<?php
$conn = oci_new_connect('hr', 'geheimesPasswort', 'localhost/XEPDB1', 'AL32UTF8');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT SYSDATE FROM dual');
oci_execute($stid);
while ($row = oci_fetch_assoc($stid)) {
echo 'Aktuelles Datum: ' . $row['SYSDATE'] . PHP_EOL;
}
oci_free_statement($stid);
oci_close($conn);
Zwei unabhängige Transaktionen mit separaten Verbindungen
<?php
// Erste Verbindung — Transaktion A
$conn1 = oci_connect('hr', 'passwort', 'localhost/XEPDB1');
// Zweite Verbindung — komplett neue, unabhängige Session für Transaktion B
$conn2 = oci_new_connect('hr', 'passwort', 'localhost/XEPDB1');
// Einfügen in Transaktion A (noch nicht committed)
$stid1 = oci_parse($conn1, "INSERT INTO orders (id, status) VALUES (1001, 'NEU')");
oci_execute($stid1, OCI_NO_AUTO_COMMIT);
// Transaktion B sieht das nicht-committete INSERT von A NICHT
$stid2 = oci_parse($conn2, "SELECT COUNT(*) AS cnt FROM orders WHERE id = 1001");
oci_execute($stid2);
$row = oci_fetch_assoc($stid2);
echo 'Sichtbare Zeilen in Session B: ' . $row['CNT'] . PHP_EOL; // 0
// Commit in Transaktion A
oci_commit($conn1);
// Jetzt ist der Datensatz für Session B sichtbar
oci_execute($stid2);
$row = oci_fetch_assoc($stid2);
echo 'Sichtbare Zeilen nach Commit: ' . $row['CNT'] . PHP_EOL; // 1
oci_free_statement($stid1);
oci_free_statement($stid2);
oci_close($conn1);
oci_close($conn2);
// Wichtig · Fallstricke
Performance: Da oci_new_connect() keine Verbindung aus dem internen Cache wiederverwendet, ist der Verbindungsaufbau teurer als bei oci_connect(). In typischen Web-Szenarien sollte daher bevorzugt oci_connect() oder für persistente Verbindungen oci_pconnect() eingesetzt werden.
Sicherheit: Zugangsdaten (Benutzername/Passwort) sollten niemals hart im Quellcode stehen, sondern aus Konfigurationsdateien außerhalb des Webroot oder aus Umgebungsvariablen gelesen werden. Bei der Nutzung von OCI_SYSDBA sind besondere Vorsichtsmaßnahmen geboten, da damit umfangreiche administrative Rechte verbunden sind.
Fehlerbehandlung: Im Fehlerfall liefert die Funktion false. Detaillierte Fehlerinformationen erhält man mit oci_error() ohne Argument (da die Verbindung selbst fehlgeschlagen ist).
Zeichensatz: Eine falsche Zeichensatz-Angabe kann zu Datenverlust oder -verfälschung führen. Der empfohlene Wert für Unicode-Datenbanken ist AL32UTF8.