Start · Sprachen · PHP · Referenz · Odbc\Result

Odbc\Result

Klasse

Repräsentiert das Ergebnis einer ODBC-Abfrage und kapselt den internen Ergebnis-Handle als objektorientiertes Objekt.

seit PHP 8.4.0 Kategorie: db

Signatur

class Odbc\Result

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);
bool(true) ID: 1, Name: Alice ID: 2, Name: Bob

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);
Array ( [0] => Array ( [id] => 1 [name] => Alice ) [1] => Array ( [id] => 2 [name] => Bob ) )

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