ASCII Datenbanken
ASCII Datenbanken sind eigentlich nur Textdateien, in denen man Daten speichert, die durch ein Trennzeichen voneinander getrennt sind. Dieses Tutorial zeigt wie es geht. Mit Übung und Lösung
2002-10-13 00:32:00 2002-10-13 00:32:00 deep_space_nine@
Achtung:
Zu diesem Tutorial finden Sie hier verschiedene Aufgaben sowie die dazugehörigen Lösungen!!
1. Allgemeines
ASCII Datenbanken sind eigentlich nur Textdateien, in denen man Daten speichert, die durch ein Trennzeichen voneinander getrennt sind. Am Besten lässt sich das eigentlich erklären, wenn man in einem Tabellenkalkulationsprogramm die Datei als reine ASCII oder ANSI Datei abspeichert und sie sich dann mit dem Notepad oder unter Linux mit kedit anschaut (MS Exel z.B. speichert diese Dateien standardmäßig mit der Endung *.csv). Aber auch für die, die kein solches Programm haben möchte ich die Struktur eines solchen Datensatzes einmal darstellen:
Im Programm:Herr | Mustermann | Musteradresse |
Frau | Mustermann | Musteradresse |
In der ASCII Datei sähe der obenstehende Datensatz wie folgt aus:
Herr,Mustermann,Musteradresse,
Frau,Mustermann,Musteradresse,
Hier sieht man, dass auch für jede neue Zeile im Programm eine neue Zeile in der Datei genommen wird, was zwar nicht sein muss aber durchaus sinnvoll ist, wie wir später sehen werden. Als Trennzeichen, das die einzelnen Spalten trennt habe ich hier ein Komma verwendet, das ich zukünftig noch häufiger verwenden werde doch gibt es hierbei noch weitere Dinge zu beachten ($ Das sollte man unbedingt beachten).
Wann verwendet man ASCII Datenbanken? Hauptsächlich gilt: man braucht ASCII Datenbanken, wenn der Server keine MySQL o.ä. unterstützt, wenn man sich nicht mit SQL auskennt und man braucht bei kleineren Datenmengen auch nicht unbedingt eine Datenbank.
Was sind Risiken der ASCII Datenbanken? Ganz ehrlich: sie sind nicht besonders sicher, da man sie einfach über den Browser aufrufen kann. Wenn man sensible Daten hat sollte man sie lieber in einer richtigen Datenbank speichern oder sie verschlüsseln ($ Schreiben in ASCII Datenbanken). Eine weitere Möglichkeit ist die Verwendung von .htaccess auf einzelne Dateien oder ganze Ordner ($ Das sollte man unbedingt beachten).
2. Was muss man beachten?
Bei einer ASCII Datenbank sollte man darauf achten, dass man das Trennzeichen entweder so exotisch wählt, dass nie jemand das eingibt, wobei sich ein Restrisiko nie ausschließen lässt oder das Trennzeichen im vom Benutzer angegebenen Text durch eine Umschreibung ersetzt (z.B. als Trennzeichen "," und das wird durch "&komma#" im normalen Text ersetzt), wobei sich auch hier wieder ein (extrem) kleines Risiko nicht ausschließen lässt, dass ein gehässiger oder unwissender Benutzer zufällig diese Zeichenkombination eingibt. Das lässt sich aber dadurch vermeiden, dass man ein HTML Sonderzeichen als Trennzeichen verwendet und den zu speichernden Text mit der Funktion htmlentities(); behandelt.
Zum Thema Sicherheit:
Wenn man sensible Daten speichern will, ist es Ratsam einige Sicherheitshinweise zu beachten wie z.B. verwenden Sie einen außergewöhnlichen Dateinamen für die Datenbank inkl. einer außergewöhnlichen Endung, geben sie die genaue URL der Datei niemals preis. Weiterhin ist zu beachten, dass das Verzeichnis, in dem die Daten liegen unbedingt eine Indexdatei hat (z.B. index.html). Wenn Sie auf Nummer sicher gehen wollen schützen Sie noch das Verzeichnis oder die betreffende Datei per .htaccess. Wie das geht erfahren Sie auf pcwelt.de.
3. Die wichtigsten Funktionen
Um eine genauere Beschreibung der jeweiligen Funktion zu bekommen klicken sie bitte auf sie oder wählen Sie sie aus dem Funktionsverzeichnis aus. Brauche ich nicht mehr Funktionen? Doch aber die Obenstehenden sind die Wichtigsten. Alle weiteren ergeben sich aus der Aufgabenstellung, die das Script erfüllen soll.
Welche Funktionen sind besonders zum Speichern wichtig? Das sind alle Funktionen, da man beim Speichern sowol lesen, wie auch Schreiben und ersetzen muß, wobei man bei MySQL nur schreiben muß.
Warum nimmt man nicht die Standertfunktion nl2br(); ? Ganz einfach: nl2br bringt zwar bei Zeilenumbrüchen ein <BR> ein, lässt den alten Zeilenumbruch aber bestehen, was dazu führt, dass der Text nicht in eine Zeile eingetragen werden kann, sondern mehrere Zeilen belegt daraus folgen dann schwierigkeiten beim Auslesen.
4. Schreiben in ASCII Datenbanken
Um Daten in einer ASCII Datenbank zu schreiben müssen Sie sie vorher so
aufbereiten, dass sie die gewünschten Informationen nachher beim Lesen ohne
Probleme wiederfinden können. Speichern Sie als ein Adressbuch empfiehlt es
sich also den Namen immer in die erste Spalte zu schreiben und die Adresse immer
in die zweite Spalte (was eine gewisse Logik hat?!).
Bekommen Sie also aus einem Formular mehrere Angaben (als Beispiel nehme ich
hier Name & Adresse) müssen Sie zuerst die Spalte aufbereiten, die Sie neu speichern wollen. Das geht mit einer einfachen Variablenzuweisung z.B.
<?php
|
Die Gespeicherte Zeile würde dann also lauten: Herr Mustermann,Musterstraße
12, Das n am Anfang der Zeile bewirkt einen Zeilenumbruch, den wir
brauchen, wen wir unsre Zeile an die anderen dranhängen wollen.
Zum speichern der Datei müssen wir sie nun zuerst einmal lesen, dass uns keinen
Daten verloren gehen. Das machen wir wie folgt: $zeile = file("dateiname"); Nun müssen wir eigentlich nur noch ein Arrayelement dranhängen und dann wieder
speichern, dass die Sache perfekt wird. Diese ganze Prozedur mache ich jetzt auf
einen Rutsch.
<?php
|
Mit sizeof() bekommen wir die Größe eines Arrays und somit auch automatisch sein (neues) letztes Glied, was wir dann nur noch beschreiben müssen. Mit der selbstdefinierten Funktion speichern(); ($ Die wichtigsten Funktionen) Speichern wir die Datei.
Zum Thema sensible Daten: Wenn Sie sensible Daten in einer ASCII Datenbank speichern wollen sollten Sie die Dateien per .htaccess schützen oder sie wenigstens verschlüsseln. Zum verschlüsseln ersetzen sie bestimmte Buchstaben einfach durch eine von ihnen gewählte (eindeutige) Zeichenketten.
Bsp.
<php
|
Nun müssen Sie aber den Text immer dechiffrieren bevor sie die Daten verwenden können. Das geht einfach, indem Sie die ersten zwei Parameter vertauschen.
5.Auslesen aus ASCII Datenbanken
Um das Auslesen aus einer ASCII Datenbank zu verdeutlichen werde ich die einzelnen Schritte anhand eines Beispiels zeigen.
datenbank.store
Manfred,Schreiber,Ahornstraße,5,
Adam,Seibert,B-Hornstraße,28,
Egon,das Eichhörnchen,Nußbaumweg,20,
auslesen.php
<?$datei = "./datenbank.store";
|
Was macht jetzt was? Mit allen if Anweisungen fängt man Fehler ab, mit der for - Schleife durchlaufen Sie den gesamten Datensatz. Nun müssen Sie eigentlich nur noch die benötigten Daten in eine Variable schreiben oder sie direkt ausgeben. Wollen Sie z.B. eine Liste mit allen Vornamen ausgeben müssten sie nur unter dem Kommentar folgende Zeile einfügen:
<?echo $eintrag[0]."<BR>";?>
|
Wollen Sie nur die Adresse ausgeben ersetzen Sie die Variable $eintrag[0] durch $eintrag[2], da die Adresse im obigen Beispiel an dritter Stelle steht.
6. Übungen zu den Datenbanken
Verwirklichen Sie ein Script, dass den Namen und die Telefonnummer in einer ASCII Datenbank speichert.
LösungSchreiben Sie ein Script, das die Daten aus der ASCII Datenbank ausliest und sie in einer einfachen Tabelle anzeigt. (Verwenden Sie hierzu die Datenbank aus der vorherigen Übung.)
LösungSchreiben Sie nun das Script aus Aufgabe 2 so um, dass es anhand eines Parameters (z.B. show=numer) nur spezifische Informationen aus der Datenbank anzeigt.
LösungVerändern Sie nun die Scripte aus Aufgabe 1 und 3 so, dass die Daten verschlüsselt gespeichert werden.
LösungAls letztes verändern Sie noch das Anzeigescript aus der vorherigen Aufgabe so, dass man nach einem Name suchen kann.
Lösung
7. Lösungsvorschläge zu den Übungen
1. Aufgabe
<?php
function speichern($datei, $eintragen)
{
$fp = fopen($datei, "w");
fwrite($fp, $eintragen);
fclose($fp);
}
if($name&&$tel)
{
$nachricht = "Gespeichert!";
if(!file_exists("./db.store")) speichern("./db.store","");
$zeile = file("db.store");
$zeile[sizeof($zeile)] = $name.",".$tel.",n";
speichern("./db.store",implode("",$zeile));
}
else $nachricht = "Es fehlen noch angaben!";
?>
<html>
<body>
<?php
if($nachricht) echo $nachricht;
?>
<form method="post">
Name: <input type="text" name="name" size="30"><br>
Telefon: <input type="text" name="tel" size="30"><br>
<input type="submit" value="Speichern">
</form>
</body>
</html>
7. Lösungsvorschläge zu den Übungen
2. Aufgabe
<html>
<body>
<table border cellpadding=0 cellspacing=0>
<?php
$datei = "./db.store";
$trennzeichen = ",";
if(file_exists($datei))
{
$zeile = file($datei);
for($i=0;$i<sizeof($zeile);$i++)
{
if(($zeile[$i] != "")&&($zeile[$i] != "n"))
{
$eintrag = explode($trennzeichen,$zeile[$i]);
echo "<tr>";
for($t=0;$t<sizeof($eintrag);$t++) echo "<td>".$eintrag[$t]."</td>";
echo "</tr>";
}
}
}
?>
</table>
</body>
</html>
7. Lösungsvorschläge zu den Übungen
3. Aufgabe
<html>
<body>
<table border cellpadding=0 cellspacing=0>
<?php
// Den Parameter mit script.php?show=param
// Mögliche parameter: name, tel
if(!$show) $show = "name";
switch($show)
{
case "name" : $t = 0;
break;
case "tel" : $t = 1;
break;
default : $t = 2;
break;
}
$datei = "./db.store";
$trennzeichen = ",";
if(file_exists($datei))
{
$zeile = file($datei);
for($i=0;$i<sizeof($zeile);$i++)
{
if(($zeile[$i] != "")&&($zeile[$i] != "n"))
{
$eintrag = explode($trennzeichen,$zeile[$i]);
echo "<tr>";
echo "<td>".$eintrag[$t]."</td>";
echo "</tr>";
}
}
}
?>
</table>
</body>
</html>
7. Lösungsvorschläge zu den Übungen
4. Aufgabe
1. Datei
<?php
function speichern($datei, $eintragen)
{
$fp = fopen($datei, "w");
fwrite($fp, $eintragen);
fclose($fp);
}
function my_crypt($txt)
{
$txt = strtolower($txt);
$txt = str_replace(" ","_",$txt);
$txt = str_replace("a","1 ",$txt);
$txt = str_replace("b","2 ",$txt);
$txt = str_replace("c","3 ",$txt);
$txt = str_replace("d","4 ",$txt);
$txt = str_replace("e","5 ",$txt);
$txt = str_replace("f","6 ",$txt);
$txt = str_replace("g","7 ",$txt);
$txt = str_replace("h","8 ",$txt);
$txt = str_replace("i","9 ",$txt);
$txt = str_replace("j","10 ",$txt);
$txt = str_replace("k","11 ",$txt);
$txt = str_replace("l","12 ",$txt);
$txt = str_replace("m","13 ",$txt);
$txt = str_replace("n","14 ",$txt);
$txt = str_replace("o","15 ",$txt);
$txt = str_replace("p","16 ",$txt);
$txt = str_replace("q","17 ",$txt);
$txt = str_replace("r","18 ",$txt);
$txt = str_replace("s","19 ",$txt);
$txt = str_replace("t","20 ",$txt);
$txt = str_replace("u","21 ",$txt);
$txt = str_replace("v","22 ",$txt);
$txt = str_replace("w","23 ",$txt);
$txt = str_replace("x","24 ",$txt);
$txt = str_replace("y","25 ",$txt);
$txt = str_replace("z","26 ",$txt);
return $txt;
}
if($name&&$tel)
{
$nachricht = "Gespeichert!";
if(!file_exists("./db.store")) speichern("./db.store","");
$zeile = file("db.store");
$zeile[sizeof($zeile)] = my_crypt($name).",".$tel.",n";
speichern("./db.store",implode("",$zeile));
}
else $nachricht = "Es fehlen noch angaben!";
?>
<html>
<body>
<?php
if($nachricht) echo $nachricht;
?>
<form method="post">
Name: <input type="text" name="name" size="30"><br>
Telefon: <input type="text" name="tel" size="30"><br>
<input type="submit" value="Speichern">
</form>
</body>
</html>
2. Datei
<html>
<body>
<table border cellpadding=0 cellspacing=0>
<?php
// Den Parameter mit script.php?show=param
// Mögliche parameter: name, tel
function my_decrypt($txt)
{
$txt = strtolower($txt);
$txt = str_replace("10 ","j",$txt);
$txt = str_replace("11 ","k",$txt);
$txt = str_replace("12 ","l",$txt);
$txt = str_replace("13 ","m",$txt);
$txt = str_replace("14 ","n",$txt);
$txt = str_replace("15 ","o",$txt);
$txt = str_replace("16 ","p",$txt);
$txt = str_replace("17 ","q",$txt);
$txt = str_replace("18 ","r",$txt);
$txt = str_replace("19 ","s",$txt);
$txt = str_replace("20 ","t",$txt);
$txt = str_replace("21 ","u",$txt);
$txt = str_replace("22 ","v",$txt);
$txt = str_replace("23 ","w",$txt);
$txt = str_replace("24 ","x",$txt);
$txt = str_replace("25 ","y",$txt);
$txt = str_replace("26 ","z",$txt);
$txt = str_replace("1 ","a",$txt);
$txt = str_replace("2 ","b",$txt);
$txt = str_replace("3 ","c",$txt);
$txt = str_replace("4 ","d",$txt);
$txt = str_replace("5 ","e",$txt);
$txt = str_replace("6 ","f",$txt);
$txt = str_replace("7 ","g",$txt);
$txt = str_replace("8 ","h",$txt);
$txt = str_replace("9 ","i",$txt);
$txt = str_replace("_"," ",$txt);
return $txt;
}
if(!$show) $show = "name";
switch($show)
{
case "name" : $t = 0;
break;
case "tel" : $t = 1;
break;
default : $t = 2;
break;
}
$datei = "./db.store";
$trennzeichen = ",";
if(file_exists($datei))
{
$zeile = file($datei);
for($i=0;$i<sizeof($zeile);$i++)
{
if(($zeile[$i] != "")&&($zeile[$i] != "n"))
{
$eintrag = explode($trennzeichen,$zeile[$i]);
echo "<tr>";
echo "<td>".my_decrypt($eintrag[$t])."</td>";
echo "</tr>";
}
}
}
?>
</table>
</body>
</html>
7. Lösungsvorschläge zu den Übungen
4. Aufgabe
<html>
<body>
<table border cellpadding=0 cellspacing=0>
<?php
// Den Parameter mit script.php?show=param&suchname=name
// Mögliche parameter: name, tel
// name durch den entsprechenden parameter ersetzen
// Suchname angeben ...
if(!$suchname) $suchname = "";
$suchname = strtolower($suchname);
function my_decrypt($txt)
{
$txt = strtolower($txt);
$txt = str_replace("10 ","j",$txt);
$txt = str_replace("11 ","k",$txt);
$txt = str_replace("12 ","l",$txt);
$txt = str_replace("13 ","m",$txt);
$txt = str_replace("14 ","n",$txt);
$txt = str_replace("15 ","o",$txt);
$txt = str_replace("16 ","p",$txt);
$txt = str_replace("17 ","q",$txt);
$txt = str_replace("18 ","r",$txt);
$txt = str_replace("19 ","s",$txt);
$txt = str_replace("20 ","t",$txt);
$txt = str_replace("21 ","u",$txt);
$txt = str_replace("22 ","v",$txt);
$txt = str_replace("23 ","w",$txt);
$txt = str_replace("24 ","x",$txt);
$txt = str_replace("25 ","y",$txt);
$txt = str_replace("26 ","z",$txt);
$txt = str_replace("1 ","a",$txt);
$txt = str_replace("2 ","b",$txt);
$txt = str_replace("3 ","c",$txt);
$txt = str_replace("4 ","d",$txt);
$txt = str_replace("5 ","e",$txt);
$txt = str_replace("6 ","f",$txt);
$txt = str_replace("7 ","g",$txt);
$txt = str_replace("8 ","h",$txt);
$txt = str_replace("9 ","i",$txt);
$txt = str_replace("_"," ",$txt);
return $txt;
}
if(!$show) $show = "name";
switch($show)
{
case "name" : $t = 0;
break;
case "tel" : $t = 1;
break;
default : $t = 2;
break;
}
$datei = "./db.store";
$trennzeichen = ",";
if(file_exists($datei))
{
$zeile = file($datei);
for($i=0;$i<sizeof($zeile);$i++)
{
if(($zeile[$i] != "")&&($zeile[$i] != "n"))
{
$eintrag = explode($trennzeichen,$zeile[$i]);
if(my_decrypt($eintrag[0]) == $suchname)
{
echo "<tr>";
echo "<td>".my_decrypt($eintrag[0])."</td>";
echo "<td>".$eintrag[1]."</td>";
echo "</tr>";
}
}
}
}
?>
</table>
</body>
</html>
Detail: (my_nl2br)
<?php
function my_nl2br($text)
{
$retvalue="";
for ($i=0;$i<strlen($text);$i++)
{
if ($text[$i]!=chr(13)) $text[$i]=="n" ? $retvalue .= "<BR>" : $retvalue .= $text[$i];
}
return $retvalue;
}
?>
Parameter:
$string : Text, in dem die Zeilenumbrüche ersetzt werden sollen
Der neue Text besteht nur noch aus einer Zeile
Detail: (speichern)
<?php
function speichern($datei, $eintragen)
{
$fp = fopen($datei, "w");
fwrite($fp, $eintragen);
fclose($fp);
}
?>
Parameter:
$string : Dateiname + Pfad
$string : String, der in die datei geschrieben werden soll
ACHTUNG:
Die Datei wird vollständig überschrieben.Ratings
Here you can write a comment
Related topics
IP-Sperre
IP-Sperre mit PHP und MySQL Oder wie man einen User für eine gewisse Zeit aussperrt. ...
Autor :
webmaster1@
Category:
PHP-Tutorials
HTML5-Formulare mit jQuery.html5form
Mit dem von Matias Mancini machen Sie aus Ihrem Browser einen HTML5-Kompatiblen Bowser. Mit Einschränkungen aber ... ...
Autor :
admin
Category:
Other tutorials
Templates in PHP
Ein kleines Tutorial zum Einsatz von Templates in PHP am Beispiel der Apolda Templateklasse (kuerbis.org/template/) ...
Autor :
stulgies@
Category:
PHP-Tutorials
Programmierung - SQL
Dieser SQL-Kurs wendet sich vor allem an Programmierer, die mit Hilfe von SQL auf Datebaken zugreifen, und an alle, die Datenbanken neu entwerfen, erweitern oder abändern wollen ...
Autor :
webmaster205@
Category:
mySQL-Tutorials
plotting masters - a professional guide - Teil I
Grafische Interpolation und Bestapproximation von numerischen Wertepaaren: Wir wollen Punkte auf einer Zeichenebene über verschiedene Verfahren miteinander verbinden. ...
Autor :
EVAMasters
Category:
PHP-Tutorials
Eigene Web Services mit PHP5 bereitstellen? Kein Problem!
PHP5 bietet das nötige Rüstzeug, um bequem und schnell den eigenen Web Service auf die Beine zu stellen. ...
Autor :
beebob
Category:
PHP-Tutorials