Signatur
Beschreibung
Odbc\Result ist eine opake Klasse, die seit PHP 8.4 den bisherigen Ressource-Typ (odbc result) für ODBC-Abfrageergebnisse ersetzt. Instanzen dieser Klasse werden ausschließlich von ODBC-Funktionen wie odbc_exec(), odbc_execute() oder odbc_query() zurückgegeben und können nicht manuell instanziiert werden.
Das Objekt kapselt intern den Verbindungs-Handle und ermöglicht den Zugriff auf Ergebniszeilen und -spalten über die zugehörigen ODBC-Funktionen wie odbc_fetch_row(), odbc_result(), odbc_num_rows() und odbc_num_fields(). Das Objekt selbst stellt keine öffentlichen Methoden oder Eigenschaften bereit – alle Operationen werden über die prozeduralen ODBC-Funktionen durchgeführt.
Durch die Umstellung von Ressourcen auf Objekte profitiert der Code von der automatischen Speicherbereinigung durch den PHP-Garbage-Collector: Sobald keine Referenz mehr auf ein Odbc\Result-Objekt existiert, werden die zugehörigen Ressourcen freigegeben, ohne dass odbc_free_result() explizit aufgerufen werden muss (es empfiehlt sich jedoch weiterhin, dies bei großen Ergebnismengen zu tun).
Der Typ Odbc\Result eignet sich zur Typ-Deklaration in eigenen Wrapper-Funktionen oder Klassen, um sicherzustellen, dass nur gültige ODBC-Ergebnisobjekte verarbeitet werden.
Beispiele
ODBC-Abfrage ausführen und Ergebnis als Odbc\Result verwenden
<?php
// Datenbankverbindung herstellen
$connection = odbc_connect('Driver={SQLite3};Database=/pfad/zur/db.sqlite', '', '');
if (!$connection) {
die('Verbindung fehlgeschlagen.');
}
// Abfrage ausführen – gibt ein Odbc\Result-Objekt zurück
$result = odbc_exec($connection, 'SELECT id, name FROM benutzer');
if (!$result) {
die('Abfrage fehlgeschlagen: ' . odbc_errormsg($connection));
}
// Typ prüfen (ab PHP 8.4)
var_dump($result instanceof Odbc\Result); // bool(true)
// Ergebniszeilen durchlaufen
while (odbc_fetch_row($result)) {
$id = odbc_result($result, 'id');
$name = odbc_result($result, 'name');
echo "ID: $id, Name: $name\n";
}
// Explizit freigeben (empfohlen bei großen Ergebnismengen)
odbc_free_result($result);
odbc_close($connection);
Odbc\Result als Typ-Deklaration in einer Hilfsfunktion
<?php
/**
* Liest alle Zeilen eines ODBC-Ergebnisses in ein Array ein.
*
* @param Odbc\Result $result Das ODBC-Ergebnisobjekt
* @return array<int, array<string, mixed>>
*/
function odbc_fetch_all(Odbc\Result $result): array
{
$rows = [];
$fieldCount = odbc_num_fields($result);
while (odbc_fetch_row($result)) {
$row = [];
for ($i = 1; $i <= $fieldCount; $i++) {
$fieldName = odbc_field_name($result, $i);
$row[$fieldName] = odbc_result($result, $i);
}
$rows[] = $row;
}
return $rows;
}
// Verwendung:
$connection = odbc_connect('Driver={SQLite3};Database=/pfad/zur/db.sqlite', '', '');
$result = odbc_exec($connection, 'SELECT id, name FROM benutzer');
$daten = odbc_fetch_all($result);
print_r($daten);
odbc_close($connection);
// Wichtig · Fallstricke
Kompatibilität: Odbc\Result wurde in PHP 8.4 eingeführt. In früheren PHP-Versionen lieferten ODBC-Funktionen einen Ressource-Typ zurück. Code, der den Typ explizit prüft (z. B. mit is_resource()), muss für PHP 8.4+ angepasst werden.
Sicherheit: Wie bei allen datenbankbezogenen Operationen sollten Benutzereingaben niemals direkt in SQL-Abfragen eingebettet werden. Verwende odbc_prepare() zusammen mit odbc_execute() für parametrisierte Abfragen, um SQL-Injection zu vermeiden.
Ressourcenverwaltung: Auch wenn PHP das Objekt automatisch bereinigt, empfiehlt es sich bei großen Ergebnismengen, odbc_free_result() explizit aufzurufen, um Arbeitsspeicher zeitnah freizugeben.