Start · Sprachen · PHP · Referenz · PDO_ODBC DSN

PDO_ODBC DSN

Funktion

Definiert den Data Source Name (DSN) für PDO_ODBC, um Verbindungen zu ODBC- oder IBM DB2-Datenbanken herzustellen.

seit PHP 5.1.0 Kategorie: db

Signatur

PDO_ODBC DSN

Beschreibung

Der PDO_ODBC DSN ist die Zeichenkette, die beim Erstellen einer PDO-Instanz als erstes Argument übergeben wird und die Verbindungsparameter für ODBC- oder DB2-Datenquellen festlegt. PDO_ODBC unterstützt drei verschiedene Treibervarianten: odbc (für ODBC-konforme Datenbanken), ibm (IBM DB2 über den IBM DB2 Universal Database Client) und unixODBC (über den unixODBC-Treibermanager).

Die grundlegende DSN-Form lautet odbc:DSN=meineDatenquelle;UID=benutzer;PWD=passwort. Alternativ kann ein vollständiger ODBC-Verbindungsstring angegeben werden, wie z. B. odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=localhost;PORT=50000;DATABASE=meineDB;PROTOCOL=TCPIP;UID=benutzer;PWD=passwort. Damit ist keine separate ODBC-DSN-Definition in der odbc.ini erforderlich.

Welcher Treiber verwendet wird, hängt von der PHP-Kompilierung und den installierten ODBC-Bibliotheken ab. Auf Unix-Systemen wird typischerweise unixODBC eingesetzt, auf Windows steht der native Windows-ODBC-Manager zur Verfügung. Die Konfiguration der Systemdatenquellen erfolgt über den ODBC-Datenquellen-Administrator (Windows) oder die Dateien /etc/odbcinst.ini und ~/.odbc.ini (Unix).

PDO_ODBC bietet damit eine portable Abstraktion über viele Datenbanksysteme hinweg, solange ein passender ODBC-Treiber vorhanden ist – darunter Microsoft SQL Server, IBM DB2, Oracle, Sybase und viele weitere.

Parameter

Name Typ Default Beschreibung
$DSN string Name einer in der ODBC-Konfiguration definierten Datenquelle (Data Source Name), z. B. DSN=MeineDatenquelle.
$DRIVER string Name des ODBC-Treibers für Treiber-basierte Verbindungsstrings, z. B. DRIVER={IBM DB2 ODBC DRIVER}.
$HOSTNAME string Hostname oder IP-Adresse des Datenbankservers.
$PORT int TCP-Port des Datenbankservers, z. B. 50000 für IBM DB2.
$DATABASE string Name der Zieldatenbank auf dem Server.
$PROTOCOL string TCPIP Verbindungsprotokoll, bei IBM DB2 typischerweise TCPIP.
$UID string Benutzername für die Datenbankverbindung. Kann alternativ als zweites Argument an den PDO-Konstruktor übergeben werden.
$PWD string Passwort für die Datenbankverbindung. Kann alternativ als drittes Argument an den PDO-Konstruktor übergeben werden.

Rückgabewert

Typ

Beispiele

Verbindung über einen ODBC-DSN-Aliasnamen

<?php
// Voraussetzung: Eine ODBC-Datenquelle 'MeineDSN' ist systemweit konfiguriert
try {
    $pdo = new PDO(
        'odbc:DSN=MeineDSN',
        'datenbankbenutzer',
        'geheimesPasswort'
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query('SELECT * FROM kunden LIMIT 5');
    foreach ($stmt as $zeile) {
        echo $zeile['name'] . PHP_EOL;
    }
} catch (PDOException $e) {
    echo 'Verbindungsfehler: ' . $e->getMessage();
}

Verbindung zu IBM DB2 über vollständigen ODBC-Verbindungsstring

<?php
// Direkte Verbindung ohne vordefinierten DSN-Eintrag
$dsn = 'odbc:DRIVER={IBM DB2 ODBC DRIVER};'
     . 'HOSTNAME=db2.beispiel.de;'
     . 'PORT=50000;'
     . 'DATABASE=MEINEDB;'
     . 'PROTOCOL=TCPIP;'
     . 'UID=dbbenutzer;'
     . 'PWD=geheim';

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

    $stmt = $pdo->prepare('SELECT VORNAME, NACHNAME FROM MITARBEITER WHERE ABTEILUNG = ?');
    $stmt->execute(['IT']);

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        printf('%s %s%s', $row['VORNAME'], $row['NACHNAME'], PHP_EOL);
    }
} catch (PDOException $e) {
    echo 'Fehler: ' . $e->getMessage();
}

Verbindung zu Microsoft SQL Server über ODBC

<?php
$dsn = 'odbc:DRIVER={ODBC Driver 18 for SQL Server};'
     . 'SERVER=sqlserver.beispiel.de,1433;'
     . 'DATABASE=ShopDB;'
     . 'Encrypt=yes;'
     . 'TrustServerCertificate=no';

try {
    $pdo = new PDO($dsn, 'sa', 'MeinPasswort123!');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $count = $pdo->query('SELECT COUNT(*) FROM Bestellungen')->fetchColumn();
    echo 'Anzahl Bestellungen: ' . $count . PHP_EOL;
} catch (PDOException $e) {
    echo 'Verbindungsfehler: ' . $e->getMessage();
}

// Wichtig · Fallstricke

Sicherheitshinweis: Zugangsdaten (UID/PWD) sollten niemals direkt im Quellcode oder in versionierten Dateien hinterlegt werden. Verwende stattdessen Umgebungsvariablen oder gesicherte Konfigurationsdateien außerhalb des Webroot-Verzeichnisses.

Treiberverfügbarkeit: PDO_ODBC muss bei der PHP-Kompilierung mit der Option --with-pdo-odbc aktiviert werden. Auf vielen Linux-Distributionen ist das Paket php-odbc oder php8.x-odbc separat zu installieren. Der passende ODBC-Treiber für die Zieldatenbank muss ebenfalls installiert und registriert sein.

Encoding/Zeichensatz: Bei Umlauten oder Sonderzeichen kann es je nach ODBC-Treiber und Datenbanksystem zu Kodierungsproblemen kommen. Prüfe die Treibereinstellungen und ggf. die Option CharSet im Verbindungsstring.

Plattformunterschiede: Der vollständige DSN-String und die Treibernamen (DRIVER={...}) unterscheiden sich je nach Betriebssystem und installierten Treibern. Auf Windows wird oft der systemeigene ODBC-Manager verwendet, auf Linux unixODBC.