Start · Sprachen · PHP · Referenz · dba_firstkey

dba_firstkey

Funktion

Setzt den internen Zeiger einer geöffneten DBA-Datenbank auf den ersten Eintrag zurück und liefert dessen Schlüssel.

seit PHP 4.0.0 Kategorie: db

Signatur

dba_firstkey(Dba\Connection $dba): string|false

Beschreibung

dba_firstkey() gehört zur DBA-Erweiterung (Database Abstraction Layer) und ermöglicht das Traversieren aller Schlüssel einer Datenbankdatei. Die Funktion setzt den internen Datenbankzeiger auf den allerersten Eintrag zurück und gibt dessen Schlüssel als String zurück. Sie wird typischerweise als Einstiegspunkt einer Schleife verwendet, in der anschließend dba_nextkey() wiederholt aufgerufen wird, um alle weiteren Schlüssel zu durchlaufen.

Das Traversieren per dba_firstkey() und dba_nextkey() ist die einzige Möglichkeit, alle Einträge einer DBA-Datenbank aufzulisten, da DBA-Datenbanken keine SQL-ähnlichen Abfragemöglichkeiten bieten. Die Reihenfolge, in der die Schlüssel zurückgegeben werden, ist abhängig vom verwendeten DBA-Treiber (z. B. gdbm, db4, lmdb) und nicht zwingend alphabetisch oder chronologisch.

Typische Anwendungsfälle sind das Exportieren aller Datenbankeinträge, die Suche über alle Schlüssel oder das Bereinigen von Einträgen anhand bestimmter Kriterien. Dabei sollte darauf geachtet werden, dass während des Traversierens keine Einträge hinzugefügt oder gelöscht werden, da dies zu undefiniertem Verhalten führen kann.

Parameter

Name Typ Default Beschreibung
$dba Pflicht Dba\Connection Eine gültige DBA-Datenbankverbindung, die zuvor mit dba_open() oder dba_popen() geöffnet wurde.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den Schlüssel des ersten Datenbankeintrags als string zurück. Falls die Datenbank leer ist oder ein Fehler auftritt, wird false zurückgegeben.

Beispiele

Alle Schlüssel und Werte einer DBA-Datenbank ausgeben

<?php
$db = dba_open('/tmp/test.db', 'c', 'gdbm');

if ($db === false) {
    die('Datenbank konnte nicht geöffnet werden.');
}

// Einige Einträge hinzufügen
dba_insert('vorname', 'Anna', $db);
dba_insert('nachname', 'Müller', $db);
dba_insert('stadt', 'Berlin', $db);

// Alle Schlüssel und Werte traversieren
$key = dba_firstkey($db);
while ($key !== false) {
    $value = dba_fetch($key, $db);
    echo "Schlüssel: $key => Wert: $value\n";
    $key = dba_nextkey($db);
}

dba_close($db);
Schlüssel: vorname => Wert: Anna Schlüssel: nachname => Wert: Müller Schlüssel: stadt => Wert: Berlin

Einträge nach Kriterien filtern und löschen

<?php
$db = dba_open('/tmp/cache.db', 'w', 'gdbm');

if ($db === false) {
    die('Datenbank konnte nicht geöffnet werden.');
}

// Alle Schlüssel sammeln, die mit "tmp_" beginnen
$keysToDelete = [];
$key = dba_firstkey($db);
while ($key !== false) {
    if (str_starts_with($key, 'tmp_')) {
        $keysToDelete[] = $key;
    }
    $key = dba_nextkey($db);
}

// Gesammelte Einträge löschen (nicht während des Traversierens!)
foreach ($keysToDelete as $k) {
    dba_delete($k, $db);
    echo "Gelöscht: $k\n";
}

dba_close($db);
Gelöscht: tmp_session_abc Gelöscht: tmp_cache_xyz

// Wichtig · Fallstricke

Wichtig: Während des Traversierens mit dba_firstkey() und dba_nextkey() sollten keine Einträge in die Datenbank eingefügt oder aus ihr gelöscht werden. Solche Änderungen können dazu führen, dass Einträge übersprungen oder doppelt zurückgegeben werden. Stattdessen empfiehlt es sich, zunächst alle relevanten Schlüssel in einem Array zu sammeln und anschließend die Änderungen vorzunehmen (wie im zweiten Beispiel gezeigt).

Ab PHP 8.2 ist der Typ des Parameters $dba offiziell Dba\Connection statt der zuvor verwendeten Ressource. Bei älteren PHP-Versionen wird eine Ressource übergeben.

Die Verfügbarkeit der DBA-Erweiterung sowie der unterstützten Treiber hängt von der PHP-Konfiguration ab. Mit dba_handlers() lassen sich die verfügbaren Treiber abfragen.