Signatur
Beschreibung
odbc_pconnect() funktioniert ähnlich wie odbc_connect(), jedoch bleibt die Verbindung nach dem Ende des Skripts bestehen und kann von nachfolgenden Skripten wiederverwendet werden. Dies reduziert den Overhead durch wiederholten Verbindungsaufbau erheblich, da bestehende Verbindungen aus einem Verbindungspool bezogen werden.
PHP sucht zunächst nach einer bereits offenen persistenten Verbindung mit denselben Parametern (dsn, user, password und cursor_type). Wird eine gefunden, wird deren Handle zurückgegeben, andernfalls wird eine neue Verbindung hergestellt und für spätere Verwendung im Pool gespeichert.
Der optionale Parameter cursor_type steuert, welchen Cursor-Typ ODBC verwendet. Mögliche Werte sind die Konstanten SQL_CUR_USE_IF_NEEDED, SQL_CUR_USE_ODBC und SQL_CUR_USE_DRIVER. Standardmäßig wird SQL_CUR_USE_DRIVER verwendet, was dem ODBC-Treiber die Wahl des Cursors überlässt.
Persistente Verbindungen sind besonders in Umgebungen mit hohem Anfragevolumen sinnvoll, sollten aber mit Bedacht eingesetzt werden, da sie Datenbankressourcen dauerhaft belegen und Verbindungslimits des Datenbankservers schneller erreicht werden können.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $dsn Pflicht | string | Der ODBC-Datenquellenname (Data Source Name), z. B. "mydb", oder ein vollständiger ODBC-Verbindungsstring wie "Driver={SQL Server};Server=myserver;Database=mydb;". |
|
| $user Pflicht | string | Der Benutzername für die Datenbankverbindung. | |
| $password Pflicht | string | Das Passwort des Datenbankbenutzers. | |
| $cursor_type | int | SQL_CUR_USE_DRIVER | Bestimmt den zu verwendenden Cursor-Typ. Mögliche Werte: SQL_CUR_USE_IF_NEEDED, SQL_CUR_USE_ODBC, SQL_CUR_USE_DRIVER. |
Rückgabewert
false zurückgegeben.Beispiele
Persistente ODBC-Verbindung herstellen und Abfrage ausführen
<?php
$dsn = 'myDatabase';
$user = 'db_user';
$password = 'geheimes_passwort';
$conn = odbc_pconnect($dsn, $user, $password);
if ($conn === false) {
die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}
$result = odbc_exec($conn, 'SELECT id, name FROM kunden LIMIT 5');
if ($result) {
while ($row = odbc_fetch_array($result)) {
echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . PHP_EOL;
}
odbc_free_result($result);
} else {
echo 'Abfrage fehlgeschlagen: ' . odbc_errormsg($conn);
}
// Verbindung explizit schließen (beendet NUR diese Referenz, Ressource bleibt im Pool)
odbc_close($conn);
Verbindung mit benutzerdefiniertem Cursor-Typ
<?php
// SQL_CUR_USE_ODBC erzwingt die Verwendung des ODBC-Cursor-Managers
$conn = odbc_pconnect(
'Driver={PostgreSQL};Server=localhost;Database=shop;',
'shop_user',
'sicheres_passwort',
SQL_CUR_USE_ODBC
);
if ($conn === false) {
die('Verbindungsfehler: ' . odbc_errormsg());
}
echo 'Verbindung erfolgreich hergestellt (persistent).' . PHP_EOL;
$result = odbc_exec($conn, "SELECT COUNT(*) AS anzahl FROM bestellungen");
if ($result && odbc_fetch_row($result)) {
echo 'Anzahl Bestellungen: ' . odbc_result($result, 'anzahl') . PHP_EOL;
}
odbc_free_result($result);
// Wichtig · Fallstricke
Ressourcenverwaltung: Persistente Verbindungen werden pro PHP-Prozess (bzw. Worker-Prozess bei FPM oder Apache) gespeichert. Bei vielen Worker-Prozessen kann die Gesamtzahl offener Datenbankverbindungen schnell ansteigen. Es empfiehlt sich, die maximale Prozessanzahl und das Verbindungslimit des Datenbankservers aufeinander abzustimmen.
Transaktionen: Falls ein Skript eine Transaktion startet und diese nicht ordnungsgemäß beendet (z. B. durch einen Absturz), kann die nächste Anfrage, die dieselbe persistente Verbindung erhält, eine unvollständige Transaktion vorfinden. Es ist daher ratsam, am Anfang jedes Skripts Transaktionen explizit zurückzusetzen oder sicherzustellen, dass autocommit aktiviert ist.
Sicherheit: Zugangsdaten wie Benutzername und Passwort sollten niemals hartcodiert im Quellcode stehen, sondern aus Umgebungsvariablen oder gesicherten Konfigurationsdateien gelesen werden.
Verbindung schließen: odbc_close() beendet bei persistenten Verbindungen lediglich die aktuelle Referenz; die zugrunde liegende Verbindung verbleibt im Pool. odbc_close_all() schließt alle offenen Verbindungen inklusive persistenter.