Signatur
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 dertnsnames.oradefiniert 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
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;
}
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;
}
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;
}
// 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.