Start · Sprachen · PHP · Referenz · dba_replace

dba_replace

Funktion

Ersetzt einen vorhandenen Eintrag in einer DBA-Datenbank oder fügt ihn neu ein, falls er noch nicht existiert.

seit PHP 4.0.0 Kategorie: db

Signatur

dba_replace(string $key, string $value, Dba\Connection $dba): bool

Beschreibung

dba_replace schreibt einen Schlüssel-Wert-Paar in eine geöffnete DBA-Datenbank. Existiert der angegebene Schlüssel bereits, wird sein Wert überschrieben. Existiert er noch nicht, wird ein neuer Eintrag angelegt. Die Funktion kombiniert damit das Verhalten von dba_insert und einem manuellen Update in einem einzigen Aufruf.

DBA (Database Abstraction Layer) ist PHPs Schnittstelle zu dateibasierten Schlüssel-Wert-Datenbanken wie GDBM, NDBM, DB4 oder CDB. Die Datenbank muss zuvor mit dba_open oder dba_popen im Schreib- oder Lese-Schreib-Modus geöffnet worden sein, andernfalls schlägt der Aufruf fehl.

Die Funktion eignet sich besonders für Szenarien, in denen nicht im Voraus bekannt ist, ob ein Schlüssel bereits vorhanden ist, und ein bedingtes Prüfen mit dba_exists vor dem Schreiben vermieden werden soll. Sie ist damit effizienter als eine separate Existenzprüfung gefolgt von dba_insert oder dba_replace.

Ab PHP 8.4 wird das Datenbankhandle als Objekt vom Typ Dba\Connection übergeben; in älteren PHP-Versionen handelt es sich um eine resource.

Parameter

Name Typ Default Beschreibung
$key Pflicht string Der Schlüssel des Eintrags, der ersetzt oder neu angelegt werden soll.
$value Pflicht string Der Wert, der dem Schlüssel zugeordnet werden soll.
$dba Pflicht Dba\Connection Das Datenbankhandle, das von dba_open oder dba_popen zurückgegeben wurde. Die Datenbank muss im Schreibmodus geöffnet sein (w, wd usw.).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Eintrag erfolgreich ersetzt oder eingefügt wurde. Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. wenn die Datenbank nicht beschreibbar ist oder das Handle ungültig ist.

Beispiele

Eintrag einfügen oder aktualisieren

<?php
// Datenbank im Lese-Schreib-Modus öffnen (erstellen wenn nicht vorhanden)
$db = dba_open('/tmp/meine_daten.db', 'wd', 'gdbm');

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

// Eintrag einfügen oder überschreiben
$erfolg = dba_replace('benutzername', 'max.mustermann', $db);

if ($erfolg) {
    echo 'Eintrag erfolgreich gespeichert.' . PHP_EOL;
} else {
    echo 'Fehler beim Speichern.' . PHP_EOL;
}

// Wert auslesen zur Überprüfung
$wert = dba_fetch('benutzername', $db);
echo 'Gespeicherter Wert: ' . $wert . PHP_EOL;

dba_close($db);
Eintrag erfolgreich gespeichert. Gespeicherter Wert: max.mustermann

Vorhandenen Eintrag überschreiben

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

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

// Ersten Wert setzen
dba_replace('sprache', 'de', $db);
echo 'Vor Aktualisierung: ' . dba_fetch('sprache', $db) . PHP_EOL;

// Wert mit dba_replace überschreiben (kein dba_exists nötig)
dba_replace('sprache', 'en', $db);
echo 'Nach Aktualisierung: ' . dba_fetch('sprache', $db) . PHP_EOL;

dba_close($db);
Vor Aktualisierung: de Nach Aktualisierung: en

// Wichtig · Fallstricke

Öffnungsmodus beachten: Die Datenbank muss zwingend in einem beschreibbaren Modus geöffnet worden sein (z. B. w, wd, n). Bei einem Handle, das nur im Lesemodus (r) geöffnet wurde, gibt dba_replace false zurück.

Nebenläufigkeit: DBA-Dateien unterstützen kein echtes paralleles Schreiben. Bei gleichzeitigem Zugriff aus mehreren Prozessen sollten DBA-Locking-Mechanismen oder externe Sperren verwendet werden, um Datenverlust zu vermeiden.

Unterschied zu dba_insert: dba_insert schlägt fehl, wenn der Schlüssel bereits existiert, während dba_replace in diesem Fall den vorhandenen Wert überschreibt. dba_replace ist daher für Upsert-Szenarien die bessere Wahl.