Dateien 2
Jetzt lernen wir, wie wir mit PHP eine Datei komplett auslesen können.
Dafür gibt es in PHP zwei Möglichkeiten, die erste Möglichkeit ist es, die Datei zeilenweise in ein Array einzulesen.
Die erste Möglichkeit ist zu überprüfen, ob der Dateizeiger am Ende der Datei ist. Sobald der Dateizeiger am Ende der Datei ist, hört der Script auf zu lesen.
Dies geht so:
<?php $userdatei = fopen("datei.txt","r");while(!feof($userdatei)) { $zeile = fgets($userdatei,1024); echo $zeile; } fclose($userdatei);?>
Zuerst öffnen wir die Datei datei.txt mit dem Lesemodus r.
Die while-Schleife läuft solange bis, der Dateizeiger am Ende der Datei steht. Dies überprüfen wir mit !feof.
Danach lesen wir einfach die nächsten 1024 Zeichen aus der Datei aus und geben diese aus.
Man kann natürlich auch einen anderen Wert benutzen, aber man sollte nicht so kleine Werte benutzen, denn wenn ihr dort z.B. 2 eingebt, und eure Datei 1000 Zeichen hat, so muss die Schleife 500 mal durchlaufen. Dies dauert natürlich viel länger, als wenn PHP auf einmal z.B. 1024 Zeichen liest.
Ihr könnt auch größere Werte benutzen, z.B. 5000.
Wenn der Dateizeiger am Ende angekommen ist, ist diewhile-Schleife beendet und die Datei wird wieder geschlossen.
Die zweite Möglichkeit ist deutlich leichter, und zwar benutzt man dann den Befehl file:
<?php $datei = file("datei.txt");?>
Danach können wir den Inhalt des Arrays wieder mit einer geeigneten Schleife ausgeben. Entweder mit einer while-Schleife, for-Schleife oder auch mit foreach.
Wir können den Inhalt jetzt so wie ein Array behandeln, also nach Werten suchen (in_array), diese Werte sortieren oder auch Werte hinzufügen.
<?php $datei = file("datei.txt");foreach($datei AS $meine_datei) { echo $meine_datei."<br>"; }?>
Ich würde die Funktion file() empfehlen.
Wir haben auch die Möglichkeit per implode() ein Array anhand eines Trennzeichen zu einem String/Text zusammenzufügen:
<?php $datei = implode("",file("datei.txt")); echo $datei;?>
Dabei wird als Trennzeichen „“ (leer) benutzt. Man kann sich dieses aneinander hängen so vorstellen: Zuerst wird das erste Arrayelement ($array[0]) in der Variable gespeichert, dann folgt das Trennzeichen, danach kommt dann das zweite Arrayelement und dann wieder ein Trennzeichen und so weiter.
Möchte man z.B. dass jede Zeile in der Datei auch eine neue Zeile im Browser ist, so wird als Trennzeichen ein <br> benutzt:
<?php $datei = implode("<br>",file("datei.txt")); echo $datei;?>
Explode
Die explode Funktion ist sehr wichtig, wenn man mit Dateien arbeitet.
explode trennt einen Text an bestimmten Stellen (diese werden vom Programmierer bestimmt) und speichert die Textabschnitte in einem Array. So können wir das Array wieder speziell Abfragen.
Diese Funktion bringt uns viele Vorteile, so können wir z.B. einen Login-Script basteln, das den Benutzername und das Passwort in einer externen Datei speichert.
So können wir aber auch Texte viel leichter formatieren, z.B. die aus einem Gästebuch-Script.
Möchte man später das Design des Gästebuches verändern, so muss man nicht den ganzen Inhalt der Datei verändern (in der die Einträge gespeichert sind), sondern man muss nur ein paar Zeilen im PHP-Code verändern.
Die Funktion kann man sowohl bei Texten, als auch bei Inhalten von gelesenen Dateien benutzen.
<?php $zeile ="24.12.2006|Weihnachten|Frohes Fest"; $zerlegen = explode("|", $zeile); echo "<b>$zerlegen[0]</b>, <i>$zerlegen[1]</i> <u>$zerlegen[2]</u>";?>
Als Ausgabe erhalten wir folgendes Erhalten:
24.12.2006, Weihnachten Frohes Fest
Wir schreiben unseren Text in die Variable $zeile und trennen dann die einzelnen Abschnitte mit | (Alt Gr + <).
Danach benutzen wir die Funktion explode, diese trennt unseren Text überall, wo ein | steht. Wir könnten auch andere Zeichen benutzen, aber man sollte immer Zeichen benutzen, die man normalerweise nie für einen Text benutzen. (Also kein . (Punkt) nehmen o.ä.).
Danach geben wir mir echo den ersten Wert des Arrays aus (24.12.2006), danach den zweiten Wert (Weihnachten) und zum Schluss den dritten Wert (Frohes Fest).
Wir Ihr wisst, fangen Arrays immer bei 0 an zu nummerieren.
So können wir alle gespeicherten Werte unabhängig voneinander bearbeiten.
Wenn wir dann mit implode das bearbeitete Array zusammenführen, können wir sehr leicht veränderte Textdateien abspeichern.
Dieses Verfahren benutzt man besonders oft, wenn man mit Textdateien arbeitet.
Denn würde man in die Textdatei nicht die reine Information, also nur die Eingaben des Benutzers speichern, sondern auch noch HTML Tags, so wäre das Neu design der Ausgabe extrem schwierig. Und wenn man z.B. die eingegebene Emailadresse vor der Ausgabe noch einmal überprüfen möchte, ist dies fast unmöglich.
Hier ein Beispiel:
Wir erstellen einen kleinen Shoutbox, aber nur den Teil, wie wir den Text wieder ausgeben.
Zuerst legen wir eine neue Datei an (text.txt).
Dort schreiben wir folgendes rein:
PHP-Einfach|Wie geht es euch?
Andavos|Super Site
Peter|Hier kann man echt viel lernen
Den Text könnt ihr euch selber aussuchen, aber achtet darauf das zwischen dem Namen und dem Text ein | (Alt Gr + <) steht.
Jetzt wollen wir das mal wieder ausgeben.
<?php $datei = file("text.txt");foreach($datei AS $ausgabe) { $zerlegen = explode("|", $ausgabe); echo "Von <b>$zerlegen[0]</b><br> $zerlegen[1]<br><br>"; }?>
Da wir einen Zeilenumbruch als Trennzeichen der einzelnen Einträge benutzt haben, empfiehlt es sich hier, diese Datei per file() einzulesen.
Danach kommt eine foreach-Schleife. Jede Zeile aus der Datei wurde ja als eigenes Arrayelement gespeichert, und mit der foreach-Schleife gehen wir diese nacheinander durch.
Dabei haben wir das aktuelle Arrayelement per AS in die Variable $ausgabe gespeichert. Mit explode trennen wir die einzelnen Abschnitte voneinander, anhand des Trennzeichen| und speichern dies in dem Array $zerlegen
Danach geben wir mit echo den Inhalt der Datei aus.
Die Ausgabe würde so aussehen:
Von PHP-Einfach
Wie geht es euch?
Von Andavos
Super Site
Von Peter Pan
Hier kann man echt viel lernen
Man kann natürlich auch eine for- oder while-Schleifebenutzten, dies würde dann so aussehen:
<?php $datei = file("counter.txt");for($a =0; $a < count($datei); $a++) { $zerlegen = explode("|", $datei[$a]); echo "Von <b>$zerlegen[0]</b><br> $zerlegen[1]<br><br>"; } echo "<br><br>Und jetzt die while-Schleife"; $datei = file("counter.txt"); $a =0;while($a < count($datei)) { $zerlegen = explode("|", $datei[$a]); echo "Von <b>$zerlegen[0]</b><br> $zerlegen[1]<br><br>"; $a++; }?>
Mit dieser Funktion können wir schon komplexe Scripts erstellen, die nur Textdateien benötigen, darunter gehören auch recht sichere Login-Systeme.