Start · Sprachen · PHP · Referenz · oci_new_connect

oci_new_connect

Funktion

Öffnet eine neue, eindeutige Verbindung zum Oracle-Server – im Gegensatz zu <code>oci_connect()</code> wird keine zwischengespeicherte Verbindung wiederverwendet.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_new_connect(string $username, string $password, string $connection_string = null, string $encoding = '', int $session_mode = OCI_DEFAULT): resource|false

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

Typ
resource|false
Beschreibung
Bei Erfolg eine OCI8-Verbindungsressource, die mit den OCI8-Funktionen verwendet werden kann. Im Fehlerfall wird 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);
Aktuelles Datum: 15-JAN-25

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);
Sichtbare Zeilen in Session B: 0 Sichtbare Zeilen nach Commit: 1

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