Signatur
Beschreibung
Odbc\Connection ist eine opake Klasse, die ab PHP 8.4 eine ODBC-Datenbankverbindung als typsicheres Objekt repräsentiert. Vor PHP 8.4 wurde eine solche Verbindung durch eine einfache Ressource (resource vom Typ odbc link) dargestellt. Die Umstellung auf Objekte ermöglicht es, Verbindungen mit strikter Typisierung zu verwenden und Typfehler frühzeitig zu erkennen.
Instanzen dieser Klasse werden nicht direkt über new erzeugt, sondern ausschließlich durch ODBC-Verbindungsfunktionen wie odbc_connect() oder odbc_pconnect() zurückgegeben. Das Objekt wird intern von allen ODBC-Funktionen akzeptiert, die einen Verbindungs-Handle erwarten – etwa odbc_exec(), odbc_prepare() oder odbc_close().
Die Klasse bietet selbst keine öffentlichen Methoden oder Eigenschaften; ihre Rolle ist rein als typsicherer Träger des internen ODBC-Verbindungs-Handles. Beim Zerstören des Objekts (z. B. wenn es den Gültigkeitsbereich verlässt) wird die Verbindung automatisch geschlossen, sofern es sich um keine persistente Verbindung handelt.
Der Einsatz ist überall dort sinnvoll, wo eine ODBC-Datenbank (z. B. Microsoft SQL Server über den ODBC-Treiber, MySQL ODBC, PostgreSQL ODBC) ohne datenbankspezifische PHP-Erweiterung angesprochen werden soll oder ein einheitliches Interface über verschiedene Datenbanken hinweg benötigt wird.
Beispiele
Verbindung herstellen und Abfrage ausführen
<?php
// Verbindung zur ODBC-Datenquelle herstellen
$connection = odbc_connect('MeineDSN', 'benutzername', 'passwort');
if (!$connection instanceof Odbc\Connection) {
die('Verbindung fehlgeschlagen.');
}
// Typsicherer Einsatz als Parameter
$result = odbc_exec($connection, 'SELECT id, name FROM kunden LIMIT 5');
if ($result instanceof Odbc\Result) {
while ($row = odbc_fetch_array($result)) {
echo $row['id'] . ': ' . $row['name'] . PHP_EOL;
}
}
// Verbindung explizit schließen
odbc_close($connection);
Persistente Verbindung und Typprüfung
<?php
function getOdbcConnection(string $dsn, string $user, string $pass): Odbc\Connection {
$conn = odbc_pconnect($dsn, $user, $pass);
if (!$conn instanceof Odbc\Connection) {
throw new RuntimeException('ODBC-Verbindung konnte nicht hergestellt werden.');
}
return $conn;
}
function fetchKunden(Odbc\Connection $conn): array {
$result = odbc_exec($conn, 'SELECT id, name FROM kunden');
$rows = [];
while ($row = odbc_fetch_array($result)) {
$rows[] = $row;
}
return $rows;
}
try {
$conn = getOdbcConnection('MeineDSN', 'user', 'geheim');
$kunden = fetchKunden($conn);
foreach ($kunden as $kunde) {
echo htmlspecialchars($kunde['name']) . PHP_EOL;
}
} catch (RuntimeException $e) {
echo 'Fehler: ' . $e->getMessage();
}
// Wichtig · Fallstricke
Migration von Ressourcen: Vor PHP 8.4 wurden ODBC-Verbindungen als resource zurückgegeben. Code, der auf den Typ resource prüft (z. B. is_resource($conn)), muss auf instanceof Odbc\Connection umgestellt werden.
Kein direktes Instanziieren: Die Klasse kann nicht direkt über new Odbc\Connection() instanziiert werden. Instanzen werden ausschließlich von ODBC-Verbindungsfunktionen erzeugt.
Sicherheit: Verbindungsparameter (DSN, Benutzername, Passwort) sollten niemals direkt aus Benutzereingaben übernommen werden. SQL-Abfragen müssen gegen SQL-Injection abgesichert werden – entweder durch odbc_prepare() mit odbc_execute() (Prepared Statements) oder durch sorgfältiges Escaping.
Persistente Verbindungen: Bei Nutzung von odbc_pconnect() wird die Verbindung nicht beim Zerstören des Objekts geschlossen, sondern im Verbindungspool gehalten. Dies kann die Performance verbessern, erfordert aber sorgfältiges Ressourcenmanagement.