Signatur
Beschreibung
dbase_pack() schreibt die dBase-Datenbankdatei physisch neu, indem alle Datensätze, die zuvor mit dbase_delete_record() als gelöscht markiert wurden, endgültig entfernt werden. Dieser Vorgang ist nicht rückgängig zu machen.
In dBase-Datenbanken werden Datensätze beim Löschen nicht sofort aus der Datei entfernt, sondern lediglich mit einem Lösch-Flag markiert. Sie bleiben dabei physisch in der Datei vorhanden und werden weiterhin beim Zählen der Datensätze mit dbase_numrecords() berücksichtigt. Erst nach einem Aufruf von dbase_pack() werden sie tatsächlich aus der Datei entfernt.
Der Aufruf dieser Funktion ist sinnvoll, wenn viele Datensätze gelöscht wurden und die Dateigröße reduziert werden soll oder wenn die Dateiintegrität sichergestellt werden muss, bevor die Datenbank an Dritte weitergegeben wird.
Hinweis: Die dbase-Erweiterung ist veraltet und sollte in modernen Projekten nicht mehr verwendet werden. Für neue Projekte empfiehlt sich der Einsatz von PDO, MySQLi oder SQLite.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $database Pflicht | resource | Eine gültige dBase-Datenbankressource, die mit dbase_open() oder dbase_create() geöffnet wurde. |
Rückgabewert
true zurück, wenn die Datenbank erfolgreich komprimiert wurde, oder false bei einem Fehler (z. B. wenn die Datenbankressource ungültig ist oder keine Schreibrechte bestehen).Beispiele
Gelöschte Datensätze endgültig entfernen
<?php
// Datenbank im Lese-/Schreibmodus öffnen
$db = dbase_open('/var/data/adressen.dbf', 2);
if ($db) {
// Datensätze 3 und 7 als gelöscht markieren
dbase_delete_record($db, 3);
dbase_delete_record($db, 7);
echo 'Datensätze vor dem Packen: ' . dbase_numrecords($db) . PHP_EOL;
// Gelöschte Datensätze endgültig aus der Datei entfernen
if (dbase_pack($db)) {
echo 'Datenbank erfolgreich komprimiert.' . PHP_EOL;
} else {
echo 'Fehler beim Komprimieren der Datenbank.' . PHP_EOL;
}
echo 'Datensätze nach dem Packen: ' . dbase_numrecords($db) . PHP_EOL;
dbase_close($db);
} else {
echo 'Datenbank konnte nicht geöffnet werden.' . PHP_EOL;
}
?>
Bereinigung einer dBase-Datenbank mit Prüfung
<?php
function bereinige_datenbank(string $pfad): bool {
$db = dbase_open($pfad, 2);
if (!$db) {
trigger_error('Datenbank konnte nicht geöffnet werden: ' . $pfad, E_USER_WARNING);
return false;
}
$anzahl_vorher = dbase_numrecords($db);
// Alle als gelöscht markierten Datensätze entfernen
$ergebnis = dbase_pack($db);
$anzahl_nachher = dbase_numrecords($db);
dbase_close($db);
if ($ergebnis) {
echo sprintf(
'Bereinigung abgeschlossen: %d Datensätze entfernt, %d verbleiben.' . PHP_EOL,
$anzahl_vorher - $anzahl_nachher,
$anzahl_nachher
);
}
return $ergebnis;
}
bereinige_datenbank('/var/data/kunden.dbf');
?>
// Wichtig · Fallstricke
Irreversibilität: Der Vorgang kann nicht rückgängig gemacht werden. Es empfiehlt sich, vor dem Aufruf von dbase_pack() eine Sicherungskopie der Datenbankdatei anzulegen.
Veraltete Erweiterung: Die dbase-Erweiterung ist nicht Teil des PHP-Kerns und muss separat installiert werden (PECL). Sie gilt als veraltet und wird in modernen PHP-Versionen nicht aktiv weiterentwickelt. Für neue Projekte sollten relationale Datenbanken (MySQL, PostgreSQL) oder SQLite verwendet werden.
Dateisperre: Während dbase_pack() ausgeführt wird, sollte kein anderer Prozess gleichzeitig auf die Datei zugreifen, da es sonst zu Dateikorruption kommen kann. PHP bietet für dBase-Datenbanken keine eingebaute Dateisperrung.