Derzeit online: ca. 105 User  
Spenden via PayPal PHP für dich ist auch als Buch erhältlich - im handlichen Format, zum Nachschlagen, Mitnehmen oder gemütlichen nebenbei Lesen. Mit noch mehr Informationen, zusätzlichen Beispielen und Übungsaufgaben.
Jetzt in der aktualisierten Version bei Amazon oder BoD bestellen!


PHP

Um etwas in einer Datei abzuspeichern...

... bedarf es wenig.

Bisher sind wir in der Lage, mit Variablen zu arbeiten, und diese sogar überprüfen zu lassen und erst danach eine bestimmte Bedingung auszuführen. Jedoch können wir die Daten, die wir z. B. durch ein Formular übergeben, noch nicht abspeichern, was jedoch oft wünschenswert ist. Wenn man sich näher mit PHP beschäftigt, wird man selten Dateien verwenden, sondern die Daten eher in einer Datenbank abspeichern, aber für den Einstieg sind auch Dateien eine ausreichende Lösung.

Zunächst ist zu beachten, dass das Arbeiten mit Dateien immer in drei Schritten abläuft. Eine Datei wird geöffnet, danach wir der Inhalt in die Datei geschrieben oder aus der Datei gelesen (oder auch beides) und zum Schluss wird sie wieder geschlossen.

Für das Öffnen von Dateien gilt folgender Befehl:
<?php
$datei = fopen(Dateiname, Modus);
?>
Der Befehl fopen öffnet die Datei, die mittels Dateiname festgelegt wird. Durch das Öffnen wird ein so genannter Dateizeiger innerhalb der Datei gesetzt. Dieser macht nicht mehr als zu sagen, wo der Startpunkt für das Lesen bzw. Schreiben in der Datei ist. Dieser Dateizeiger steht entweder am Anfang oder am Ende der Datei und wird in der festgelegten Variable (in dem Fall datei) gespeichert.

Folgende Modi stehen zur Verfügung:
  Modus    Funktion               Dateizeiger    Anlegen?
  ==========================================================
  r        Lesen                  Anfang         Nein
  r+       Lesen und Schreiben    Anfang         Nein
  w        Schreiben              Anfang         Ja
  w+       Lesen und Schreiben    Anfang         Ja
  a        Schreiben              Ende           Ja
  a+       Lesen und Schreiben    Ende           Ja
Bei Verwendung von r oder r+ muss die Datei, aus der gelesen, bzw. in die geschrieben werden soll bereits vorhanden sein - bei allen anderen Fällen wird die Datei neu angelegt (sofern sie noch nicht existiert).

Wenn du w+ verwendest, musst du beachten, dass der Inhalt der Datei ohne Nachfrage überschrieben wird, da der Dateizeiger auf den Anfang gesetzt wird.

Für das Anlegen einer Log-Datei ist daher beispielsweise der Modus a zu empfehlen - bei einer Log-Datei muss nicht gelesen werden, sondern nur geschrieben und das immer am Ende der Datei. Sieht man also in der oberen Tabelle nach ergibt sich daraus Modus a.

Wir machen jetzt als Beispiel einen ganz simplen textbasierten Counter, ohne Reloadsperre.
<?php
$datei = fopen("counter.txt","r+");
?>
Die Datei, in die der Counterstand geschrieben werden soll nennt sich counter.txt und wir verwenden den Modus r+. In dem Fall müssen wir die counter.txt anlegen, bevor wir sie benutzen können.

Aber was jetzt? Jetzt ist zwar eine Datei geöffnet, aber wir können noch nichts mit den Werten, die darin enthalten sind, anfangen. Da wir einen Counter haben wollen, soll zunächst der derzeitige Wert ausgegeben werden. Zu diesem Zweck lesen wir den Dateiinhalt aus.
<?php
$counterstand = fgets($datei, 10);
?>
Mit fgets wird der Inhalt der Datei gelesen. Davor muss die Datei geöffnet worden sein und ein Dateizeiger muss gesetzt sein (das haben wir beides mit dem fopen Befehl durchgeführt und in die Variable datei gespeichert. Der Wert 10 gibt an, wieviele Zeichen gelesen werden sollen.

Das Lesen von Dateien erfolgt zeilenweise, das heißt es wird immer maximal bis zu einem Absatzzeichen gelesen - oder bis zum Dateiende. Jedoch kann auch festgelegt werden, dass z. B.. nur die ersten 10 Zeichen einer Datei gelesen werden sollen, so wie wir das jetzt gemacht haben (ich gehe davon aus, dass ein Counter nicht mehr als 10 Stellen haben wird).

Der Counterstand wird jetzt in die Variable counterstand gespeichert und soll anschließend erhöht werden.

Jedoch haben wir jetzt ein Problem. Da wir die Datei ja erst angelegt haben und noch kein Wert darin enthalten ist, ist die Variable counterstand leer. Wir wissen aber, dass sie nicht leer sein sollte, sondern den Wert 0 beinhalten sollte. Um das zu erreichen können wir jetzt die Variable "von Hand" auf 0 setzen.
<?php
if($counterstand == "")
{
  $counterstand = 0;
}
?>
Mit $counterstand = 0 setze ich den Wert der Variable auf 0. Damit das aber nicht immer geschieht, sondern nur dann, wenn in der Datei kein Wert steht, überprüfe ich davor, ob die Variable counterstand leer ist. Dieses leer wird durch zwei Anführungszeichen ausgedrückt (dazwischen darf sich kein Leerzeichen befinden).

Erst dann, wenn die Variable tatsächlich leer ist, wird der Wert auf 0 gesetzt.

Was kommt jetzt bei einem Counter? Da ein Zugriff erfolgte, muss der Counterstand um 1 erhöht werden und dieser neue Wert muss dann in die Datei geschrieben werden.
<?php
$counterstand++;
?>
Du erinnerst dich an diesen Befehl? Er ist die Kurzform zu $counterstand = $counterstand + 1 und erhöht den Wert um 1.

Und jetzt kann die Variable über echo $counterstand ausgegeben ...
<?php
echo $counterstand;
?>
... und der neue Wert in die Datei geschrieben werden.

Dafür müssen wir aber zuerst den Dateizeiger an den Anfang das Dokumentes zurück (sonst wird statt 2 plötzlich 12 geschrieben, weil sich der Dateizeiger am Ende befindet) setzen.

Dafür gibt es den Befehl rewind.
<?php
rewind($datei);
?>
Und anschließend den neuen Wert in die Datei schreiben.
<?php
fwrite($datei, $counterstand);
?>
Mit dem Befehl fwrite wird nun der neue Counterstand in die Datei geschrieben. Dabei wird zunächst angeben, wohin (in unserem Fall beschreibt die Variable datei in welcher Datei und an welche Stelle (Dateizeiger)) geschrieben werden soll. Nach dem Komma wird festgelegt, was geschrieben werden soll - bei uns ist das der neue Counterstand.

Da wir den Dateizeiger mit rewind an den Anfang gesetzt haben wird automatisch der alte Wert überschrieben.

Jetzt müssen wir nur mehr die Datei schließen und schon ist der Counter fertig.
<?php
fclose($datei);
?>
Der Befehl fclose gibt an, dass eine Datei geschlossen werden soll und in Klammer setzt man die Datei mit Zeiger - also die Variable, die am Anfang verwendet wurde um diesen Wert darin zu speichern.

Unser gesamter Counter sieht also so aus:
<?php
$datei = fopen("counter.txt","r+");
$counterstand = fgets($datei, 10);
if($counterstand == "")
{
  $counterstand = 0;
}
$counterstand++;
echo $counterstand;
rewind($datei);
fwrite($datei, $counterstand);
fclose($datei);
?>
Beachte bitte, dass wir in diesem Bespiel zwar sowohl gelesen als auch geschrieben haben, das aber nicht immer notwendig ist.

Um eine Datei immer weiter zu führen (wie eben bei einer Log-Datei), verwende am besten a (a+ ist nicht notwendig, da du die Daten ja nicht auslesen musst), da a am Dateiende zu schreiben beginnt.

Wenn du immer eine neue Datei anlegen möchtest kannst du w, w+, a oder a+ verwenden - je nachdem, ob du auch lesen möchtest. Du musst nur darauf achten, dass du immer einen neuen Dateinamen hast (am einfachsten geht das mit der aktuellen Uhrzeit/Datum).

Vergiss nicht, dass PHP einen Backslash vor Anführungszeichen setzt und Zeilenumbrüche durch \n ersetzt. Das wirkt sich vor allem dann aus, wenn du die Daten aus einer Textarea in eine Datei schreiben lässt. Was du dagegen tun kannst, erfährst du auf der nächsten Seite.

Autor: Claudia Unkelbach

=> Weiter
© 2001 - 2017 Claudia Unkelbach
Gießener Straße 75, 35396 Gießen