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

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
$neue_zeile 
"n".$name.",".$adresse.",";
?>

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
$zeile
[sizeof($zeile)] = $neue_zeile;
speichern("dateiname",implode("",$zeile));
?>

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
?$text = str_replace("a","bc1",$text);
?>

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";
  
$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]);

      
// Hier dann den benötigten Code einfügen ...

      
}
    }
  }
?>

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

  1. Verwirklichen Sie ein Script, dass den Namen und die Telefonnummer in einer ASCII Datenbank speichert.

    Lösung
  2. Schreiben 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ösung
  3. Schreiben 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ösung
  4. Verändern Sie nun die Scripte aus Aufgabe 1 und 3 so, dass die Daten verschlüsselt gespeichert werden.

    Lösung
  5. Als 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.

Erfahrungen

Es sind noch keine Kommentare vorhanden.

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe

Verwandte Beiträge

Wird geladen... Bitte warte.
Wird geladen... Bitte warte.

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen