Dateien schreiben
Um in Textdateien schreiben zu können, existiert in PHP die Funktion file_put_contents($filename, $data) . Als erstes Argument erwartet die Funktion den Dateinamen, als zweiten die Daten die man in die Datei schreiben möchte. Ist die Datei noch nicht vorhanden, so wird diese erstellt. Falls sie bereits vorhanden ist, wird der Inhalt überschrieben.
Datei überschreiben
Möchte man beispielsweise eine per GET übergebene Variable in eine Text-Datei schreiben, geht dies so:
1 2 3 4 5 6 |
<?php $name = $_GET["name"]; $zeile = "Per GET wurde der Name $name übergeben \r\n"; file_put_contents("beispiel.txt", $zeile); echo "beispiel.txt wurde überschrieben"; ?> |
Rufen wir diese Datei mit dem Parameter ?name=Max auf, so wird in der beispiel.txt der Satz Per GET wurde der Name Max übergeben stehen. Die Funktion file_put_contents() überschreibt den Inhalt der Datei. Sollte die Datei bereits existieren, so geht der Inhalt verloren.
Natürlich können wir auch eine Datei erst auslesen bevor wir diese überschreiben. Beispielsweise möchten wir einen einfachen Besucherzähler programmieren. Dazu legt im Ordner mit unserem PHP-Script per Editor eine Textdatei counter.txt an und schreibt eine 0 in diese. Unser Script zum Auslesen dieser Datei, zum Erhöhen der Zahl, und zum Ausgeben des Textes sieht wie folgt aus:
1 2 3 4 5 6 |
<?php $counter = file_get_contents("counter.txt"); //Einlesen des Wertes $counter++; //Wert um 1 erhöhen file_put_contents("counter.txt", $counter); //Abspeichern des Wertes echo "Diese Datei wurde bereits $counter mal aufgerufen"; ?> |
Text an Datei anhängen
Möchte man eine Datei nicht überschreiben, sondern Wert an die Datei anhängen, so muss man der Funktion file_put_contents() als drittes Argument die Konstante FILE_APPEND übergeben.
1 2 3 4 5 6 |
<?php $name = $_GET["name"]; $zeile = "Per GET wurde der Name $name übergeben \r\n"; file_put_contents("beispiel.txt", $zeile, FILE_APPEND); echo "beispiel.txt aktualisiert"; ?> |
Rufen wir diesen Script mit verschiedenen GET-Parametern auf, beispielsweise zuerst mit ?name=Max, dann mit ?name=Lena, so finden wir für jeden Aufruf eine neue Zeile in der beispiel.txt.
Arbeiten mit implode und explode
Im Artikel zu PHP Arrays habt ihr bereits die zwei nützlichen Funktionen implode() und explode() kennengelernt, mit denen ihr ein Array zu einem String zusammenfügen könnt oder einen String anhand von Trennzeichen auftrennen könnt. Diese zwei Funktionen werden sehr nützlich, wenn ihr mit Textdateien arbeitet.
Nachfolgend bauen wir eine sehr einfache Registrierung und einen internen Bereich. Dieses Beispiel ist sehr unsicher und sollte in echten Systemen nicht verwendet werden. Aber es illustriert gut, wie implode() und explode() im Zusammenhang mit Dateien verwendet werden kann.
Schritt 1: Registrierung
Zuerst benötigen wir ein Formular, in dem wir den Namen, die E-Mail Adresse und das Passwort abfragen. Diese Angaben hängen wir dann an die users.txt an.
Die Seite registrierungsformular.php sieht wie folgt aus:
1 2 3 4 5 6 |
<form action="registrierung.php" method="post"> Name: <input type="text" name="name" /><br /> E-Mail: <input type="text" name="email" /><br /> Passwort: <input type="password" name="passwort" /><br /> <input type="submit" value="Registrieren" /> </form> |
Danach die registrierung.php, die die Daten aus dem Formular an die Datei users.txt anhängt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $name = $_POST['name']; $email = $_POST['email']; $passwort = $_POST['passwort']; $user_info = array($email, $passwort, $name); if(!empty($name) AND !empty($email) and !empty($passwort)) { $eintrag = implode(";", $user_info)."\r\n"; file_put_contents("users.txt", $eintrag, FILE_APPEND); echo "$email wurde erfolgreich registriert"; } else { echo "Bitte alle Felder ausfüllen"; } ?> |
Sofern alle drei Felder ausgefüllt wurden, verbinden wir die drei Elemente per implode() und nutzen das Semikolon als Trennzeichen. An das Ende von jedem Eintrag schreiben wir noch einen Zeilenumbruch (für Windows per \r\n) und fügen per file_put_contents() diesen Eintrag an das Ende der users.txt an. In der users.txt sollte also in jeder Zeile ein Benutzereintrag im Format email;passwort;name stehen.
Für das loginformular.php fragen wir die E-Mail Adresse und das Passwort ab:
1 2 3 4 5 |
<form action="login.php" method="post"> E-Mail: <input type="text" name="email" /><br /> Passwort: <input type="password" name="passwort" /><br /> <input type="submit" value="Login" /> </form> |
Etwas komplizierter wird die login.php. Hier durchlaufen wir alle Zeilen, überprüfen ob die E-Mail Adresse und das Passwort stimmen. Ist dies der Fall, begrüßen wir den Benutzer mit seinem Namen:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $email = $_POST["email"]; $passwort = $_POST["passwort"]; $users = file("users.txt"); foreach($users AS $line) { $user_info = explode(";", $line); if($user_info[0] == $email AND $user_info[1] == $passwort) { echo "Hallo ".$user_info[2]; } } ?> |
Zuerst laden wir per file("users.txt") alle Zeilen der users.txt. Diese Zeilen durchlaufen wir dann mittels foreach-Schleife. Die Variable $line enthält dann immer einen Eintrag im Format email;passwort;name. Sollten die eingebene E-Mail-Adresse und das eingegebene Passwort aus dem Login-Formular mit dem Eintrag in der users.txt übereinstimmen, begrüßen wir den Benutzer mit seinem Namen.
Autor: Nils Reimers