<?php
/* bdb.php - Modul zum Zugriff auf die ASCII-Datenbank von Robert Bienert
Copyright (C) 2002, 2003 Robert Bienert <robertbienert@gmx.net>
Zum Datei-Format:
* Eine Zeile der Textdatei entspricht einer Datenbankzeile
* Kommentare sind jeweils von Zeilenanfang bis Zeilenende und beginnen
mit einer Raute '#'. Ich empfehle Kommentare NUR am Anfang der Datei.
* Die einzelnen Spalten werden durch den senkrechten Strich '|'
voneinander getrennt.
* Die Namen der Spalten werden in einer Zeile, die mit '!' beginnt, im
gleichen Format wie normale Spalten definiert. Diese Zeile MUSS vor den
Datensätzen stehen:
!ID|Nachname|Vorname|Straße|...
* Die erste Spalte stellt den Primärschlüssel dar (in diesem Beispiel ID).
Zugriff auf die Datenbank:
--------------------------
$db = ladeBDB($dbfile);
Lädt die Datenbank von der Datei $dbfile in das zweidimensionales Array
$db. Der Zugriff darauf erfolgt mit den folgenden Funktionen:
holeBDBZelle($db, $zeile, $spalte);
Gibt den Wert der Zelle wieder, die die Koordinaten $zeile,$spalte hat.
$db ist die gleiche Variable, wie sie ladeBDB zurückgibt.
$db = setzeBDBZelle($db, $zeile, $spalte, $wert);
Gibt die neue Datenbank als zweidimensionales Array in $db zurück. Die
Funktion setzt den Wert der Zelle $zeile,$spalte auf $wert, es erfolgt
also ein Eintrag in eine Zelle.
Abschließend sollten wir unsere Änderungen an der Datenbank auch
speichern:
schreibeBDB($db, $dbfile);
Schreibt den Inhalt von $db nach $dbfile. Am zweckmäßigsten sind dies
die gleichen Variablen wie oben.
*/
function ladeBDB ($dbfile) {
$db = file($dbfile);
$schluessel = array();
$datenbank = array();
for ($i = 0; $i < count($db); ++$i) {
// durchlaufe die Datenbankdatei bis zum Dateiende
if (preg_match("/^#/", $db[$i])) continue;
// Kommentarzeilen beginnen mit einer Raute '#'
if (preg_match("/\!/", $db[$i])) {
$schluessel = preg_split("/\|/", substr(chop($db[$i]), 1));
continue;
}
/* Die Namen der Zellen. $schluessel[0] enthält den Namen des
* Primärschlüssels. Der Wert dieses Schlüssels (ist eher für
* uns wichtig) steht in $datei[0] (siehe unten). */
if (preg_match("/^\s/", $db[$i])) continue;
// Zeilen mit einem Space am Anfang werden ignoriert
$datei = preg_split("/\|/", chop($db[$i]));
/* VORSICHT: $datei ist ein Array! $datei enthält eine Zeile als
* ungeordnetes Array. Dies wird nun behoben: */
for ($a = 0; $a < count($schluessel); ++$a) {
$key = $schluessel[$a]; // ein String
$datensatz[$key] = $datei[$a];
}
$primaerS = $datei[0]; // Wert des Primärschlüssels
$datenbank[$primaerS] = $datensatz;
}
return($datenbank);
}
function schreibeBDB($datenbank, $dbfile) {
$ersterEintrag = each($datenbank);
/* Bei einem assoziativen Array kann ich nicht über die Indexzahlen
* zugreifen. Deshalb hole ich mir mit each() das erstbeste Paar aus
* Primärschlüssel und zugehörigem Datensatz. Der Array muss nicht
* zurpckgesetzt werden, da dies von foreach erledigt wird. */
$kopfZeile = '!';
foreach($ersterEintrag[1] as $key => $value) {
$kopfZeile .= "$key|"; // Klappt jetzt
}
$fh = fopen($dbfile, 'w');
fwrite($fh, substr($kopfZeile, 0, -1) . "\n");
// entferne ein '|' zuviel und hänge "\n" an
foreach($datenbank as $primaerS => $datensatz) {
$zeile = '';
foreach($datensatz as $value) {
$zeile .= "$value|";
}
fwrite($fh, substr($zeile, 0, -1) . "\n");
}
fclose($fh);
}
function holeBDBZelle($datenbank, $primaerS, $spalte) {
$datensatz = $datenbank[$primaerS];
return ($datensatz[$spalte]);
}
function setzeBDBZelle($datenbank, $primaerS, $spalte, $wert) {
$datensatz = $datenbank[$primaerS]; // hole einen Datensatz
$datensatz[$spalte] = $wert; // Setze Wert einer Zelle
$datenbank[$primaerS] = $datensatz; // Zurückschreiben
return($datenbank);
}
?>