Signatur
Beschreibung
Pdo\Dblib ist die spezialisierte PDO-Treiberklasse für den Zugriff auf Sybase ASE- und Microsoft SQL Server-Datenbanken über die FreeTDS-Bibliothek (DB-Lib). Sie erweitert PDO und stellt daher dieselbe objektorientierte Datenbankabstraktions-API bereit, ergänzt durch treiberspezifische Eigenschaften.
Der Treiber verwendet intern die FreeTDS-Bibliothek, die auf Unix/Linux-Systemen installiert sein muss. Die DSN-Zeichenkette beginnt mit dblib: und gibt Host, Datenbankname sowie optional Port an (z. B. dblib:host=localhost:1433;dbname=meineDB). Auf Windows-Systemen wird in der Regel der sqlsrv-Treiber bevorzugt.
Seit PHP 8.4 ist Pdo\Dblib als eigenständige, typisierte Klasse verfügbar und ersetzt die bisherige implizite Verwendung des pdo_dblib-Extensions über den generischen PDO-Konstruktor. Damit sind treiberspezifische Methoden und Attribute über die typsichere Klasse direkt zugreifbar.
Typische Einsatzgebiete sind Legacy-Migrationen von Sybase-Anwendungen, Integration mit Microsoft SQL Server auf Linux-Systemen sowie Szenarien, in denen kein nativer ODBC- oder sqlsrv-Treiber verfügbar ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $dsn Pflicht | string | Data Source Name im Format dblib:host=hostname[:port];dbname=datenbankname[;charset=zeichensatz]. Gibt den Datenbankserver und die Zieldatenbank an. |
|
| $username | string | Benutzername für die Datenbankverbindung. | |
| $password | string | Passwort des Datenbankbenutzers. | |
| $options | array | [] | Assoziatives Array mit treiberspezifischen PDO-Optionen, z. B. PDO::ATTR_ERRMODE oder PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER. |
Beispiele
Verbindung zu MS SQL Server über DB-Lib herstellen
<?php
try {
$pdo = new Pdo\Dblib(
dsn: 'dblib:host=192.168.1.10:1433;dbname=Northwind;charset=UTF-8',
username: 'sa',
password: 'geheimesPasswort',
options: [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$stmt = $pdo->prepare('SELECT TOP 5 CustomerID, CompanyName FROM Customers ORDER BY CompanyName');
$stmt->execute();
foreach ($stmt->fetchAll() as $row) {
echo $row['CustomerID'] . ' – ' . $row['CompanyName'] . PHP_EOL;
}
} catch (PDOException $e) {
echo 'Verbindungsfehler: ' . $e->getMessage();
}
Prepared Statement mit Parametern und Transaktion
<?php
$pdo = new Pdo\Dblib(
dsn: 'dblib:host=db-server;dbname=ShopDB',
username: 'appuser',
password: 's3cret'
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->beginTransaction();
$insert = $pdo->prepare(
'INSERT INTO Bestellungen (KundeID, Betrag, Datum) VALUES (:kundeId, :betrag, :datum)'
);
$insert->execute([
':kundeId' => 42,
':betrag' => 199.99,
':datum' => date('Y-m-d'),
]);
$neueId = $pdo->lastInsertId();
echo 'Neue Bestellungs-ID: ' . $neueId . PHP_EOL;
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollBack();
echo 'Fehler, Transaktion zurückgerollt: ' . $e->getMessage();
}
// Wichtig · Fallstricke
FreeTDS erforderlich: Der Treiber setzt eine korrekt installierte und konfigurierte FreeTDS-Bibliothek auf dem Server voraus. Die Datei freetds.conf bzw. die Umgebungsvariable FREETDS steuert Server-Versionseinstellungen. Falsche TDS-Versionsangaben führen zu Verbindungs- oder Zeichensatzproblemen.
Sicherheit: Verwende stets Prepared Statements mit Platzhaltern, um SQL-Injection zu verhindern. Baue niemals Benutzereingaben direkt in SQL-Zeichenketten ein.
Zeichensatz: Insbesondere bei Umlauten und Sonderzeichen ist der DSN-Parameter charset=UTF-8 zu setzen und mit der FreeTDS-Konfiguration abzustimmen, da Konvertierungsfehler sonst zu Datenverlust führen können.
Windows: Auf Windows-Systemen wird stattdessen der pdo_sqlsrv-Treiber von Microsoft empfohlen, der aktiv gepflegt wird und modernere SQL-Server-Features unterstützt.
Verfügbarkeit: Die typisierte Klasse Pdo\Dblib ist erst ab PHP 8.4 verfügbar. In älteren PHP-Versionen wird der Treiber über den generischen PDO-Konstruktor mit dem DSN-Präfix dblib: angesprochen.