Start · Sprachen · PHP · Referenz · PDO_OCI DSN

PDO_OCI DSN

Funktion

Definiert den Data Source Name (DSN) für die Verbindung zu Oracle-Datenbanken über den PDO_OCI-Treiber.

seit PHP 5.1.0 Kategorie: db

Signatur

PDO_OCI DSN

Beschreibung

Der PDO_OCI-Treiber ermöglicht die Verbindung zu Oracle-Datenbanken über die PHP Data Objects (PDO)-Schnittstelle. Der Data Source Name (DSN) gibt dabei an, welche Datenbank verwendet wird und wie die Verbindung aufgebaut werden soll.

Der DSN für PDO_OCI hat folgendes Format: oci:dbname=verbindungsstring;charset=zeichensatz. Der Verbindungsstring kann entweder ein Easy Connect-String sein (z. B. //hostname:port/datenbankname), ein TNS-Name (aus der tnsnames.ora-Datei) oder ein vollständiger TNS-Deskriptor.

  • Easy Connect: oci:dbname=//localhost:1521/orcl
  • TNS-Name: oci:dbname=MYDB (der Name muss in der tnsnames.ora definiert sein)
  • Vollständiger TNS-Deskriptor: oci:dbname=(DESCRIPTION=(ADDRESS_LIST=...))

Der optionale Parameter charset legt den Zeichensatz für die Verbindung fest (z. B. AL32UTF8). PDO_OCI erfordert die Oracle-Clientbibliotheken (Instant Client oder vollständige Oracle-Installation) auf dem Server.

Parameter

Name Typ Default Beschreibung
$dbname Pflicht string Der Oracle-Verbindungsstring. Kann ein Easy Connect-String (//host:port/service), ein TNS-Aliasname oder ein vollständiger TNS-Deskriptor sein.
$charset string Der Oracle-Zeichensatz für die Verbindung, z. B. AL32UTF8 oder WE8ISO8859P1. Wenn nicht angegeben, wird der Standard-Zeichensatz des Oracle-Clients verwendet.

Rückgabewert

Typ

Beispiele

Verbindung per Easy Connect-String

<?php
try {
    $dsn = 'oci:dbname=//localhost:1521/ORCL;charset=AL32UTF8';
    $username = 'scott';
    $password = 'tiger';

    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query('SELECT SYSDATE FROM DUAL');
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    echo 'Aktuelles Datum: ' . $row['SYSDATE'] . PHP_EOL;
} catch (PDOException $e) {
    echo 'Verbindungsfehler: ' . $e->getMessage() . PHP_EOL;
}
Aktuelles Datum: 2024-06-15

Verbindung über TNS-Aliasname

<?php
// Voraussetzung: In der tnsnames.ora ist ein Eintrag 'MYDB' definiert
// Umgebungsvariable TNS_ADMIN muss auf das Verzeichnis mit tnsnames.ora zeigen
putenv('TNS_ADMIN=/etc/oracle/network/admin');

try {
    $dsn = 'oci:dbname=MYDB;charset=AL32UTF8';
    $pdo = new PDO($dsn, 'benutzer', 'passwort');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->prepare('SELECT name, email FROM users WHERE id = :id');
    $stmt->execute([':id' => 42]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user) {
        echo 'Name: ' . $user['NAME'] . ', E-Mail: ' . $user['EMAIL'] . PHP_EOL;
    }
} catch (PDOException $e) {
    echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
}
Name: Max Mustermann, E-Mail: max@example.com

Verbindung mit vollständigem TNS-Deskriptor

<?php
// Vollständiger TNS-Deskriptor direkt im DSN — kein tnsnames.ora nötig
$tns = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db.example.com)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))';
$dsn = 'oci:dbname=' . $tns . ';charset=AL32UTF8';

try {
    $pdo = new PDO($dsn, 'admin', 'geheim');
    echo 'Verbindung erfolgreich!' . PHP_EOL;
} catch (PDOException $e) {
    echo 'Verbindungsfehler: ' . $e->getMessage() . PHP_EOL;
}
Verbindung erfolgreich!

// Wichtig · Fallstricke

Sicherheitshinweis: Speichere Benutzername und Passwort niemals direkt im Quellcode. Verwende Umgebungsvariablen oder externe Konfigurationsdateien, die außerhalb des Webroot liegen.

Voraussetzungen: PDO_OCI benötigt die Oracle-Clientbibliotheken (Oracle Instant Client oder vollständige Oracle-Installation). Die Umgebungsvariablen ORACLE_HOME, LD_LIBRARY_PATH (Linux) bzw. PATH (Windows) müssen korrekt gesetzt sein. Auf Linux-Systemen kann es nötig sein, ldconfig nach der Instant-Client-Installation auszuführen.

Zeichensatz: Es wird dringend empfohlen, den Zeichensatz explizit auf AL32UTF8 zu setzen, um Kodierungsprobleme zu vermeiden.

Verfügbarkeit: Der PDO_OCI-Treiber ist in PHP standardmäßig nicht aktiviert und muss entweder beim Kompilieren eingebunden oder als PECL-Erweiterung installiert werden. In einigen Linux-Distributionen ist er als separates Paket (z. B. php-oci8) verfügbar.