Start · Sprachen · PHP · Referenz · odbc_pconnect

odbc_pconnect

Funktion

Öffnet eine persistente ODBC-Datenbankverbindung, die zwischen Anfragen wiederverwendet wird.

seit PHP 4.0.0 Kategorie: db

Signatur

odbc_pconnect(string $dsn, string $user, string $password, int $cursor_type = SQL_CUR_USE_DRIVER): resource|false

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg eine ODBC-Verbindungsressource zurück, die für weitere ODBC-Funktionsaufrufe genutzt werden kann. Im Fehlerfall wird 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);
ID: 1, Name: Max Mustermann ID: 2, Name: Erika Musterfrau ...

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);
Verbindung erfolgreich hergestellt (persistent). Anzahl Bestellungen: 1042

// 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.