PHP Lektionen – Lektion 2 – Arbeiten mit Dateien: Öffnen, Schreiben, Lesen.
In der letzten Lektion haben wir das Grundgerüst für unser Gästebuch, Blog oder Chat erstellt. Nun bleibt nur noch, die Funktionalität hinzuzufügen. In dieser Lektion werden wir unsere Einträge in Dateien schreiben und Einträge aus Dateien auslesen.
PHP bietet viele Funktionen für die Arbeit mit Dateien. Wir betrachten einige davon. Wahrscheinlich wird Ihre Seite Daten eher in einer Datenbank speichern (darauf bin ich sicher) als in Dateien, deshalb behandeln wir nur einige Funktionen, damit Sie das Prinzip verstehen. Die Arbeit mit Datenbanken behandeln wir später.
Wenn Sie die Dateien aus der letzten Lektion nicht haben, gehen Sie bitte zurück und laden Sie sie herunter.
Kommen wir zum Formular zum Hinzufügen eines Eintrags:
/index.php?admin=1
Über dieses Formular fügen wir unsere Einträge hinzu. Um die Einträge zu verarbeiten, prüfen wir in der Datei index.php (dort werden die Formulardaten gesendet), ob die Variable $_POST Werte enthält. Das geht ganz einfach:
if($_POST){ }
Ganz einfach, oder? Nun kommt die Verarbeitung des $_POST-Arrays innerhalb der geschweiften Klammern. Wir schreiben den Code nicht direkt dort, sondern rufen eine Methode unserer Klasse auf. In index.php rufen wir:
if($_POST){ $obj->write($_POST); }
In simpleCMS.php implementieren wir die Methode write():
public function write($p) { // Methode zum Schreiben eines Eintrags }
Warum machen wir das so? Damit der Code in index.php schlank bleibt. index.php dient nur zur Steuerung, die Verarbeitung der Arrays und die Ausgabe erfolgen in einer anderen Datei, z.B. unserer Klasse simpleCMS. Diese Trennung erhöht die Übersichtlichkeit und Wartbarkeit des Codes. Andere Entwickler sehen sofort, wo was liegt. Auch für Sie selbst wird es einfacher, den Code zu verstehen, wenn alles sauber strukturiert ist.
Beginnen wir einfach, indem wir das übergebene $_POST-Array ausgeben, um zu sehen, was ankommt:
public function write($p) { // Methode zum Schreiben eines Eintrags print_r($p); }
Wir verwenden hier die lokale Variable $p, obwohl die superglobale Variable übergeben wird. Wir greifen nicht direkt auf $_POST zu, weil wir in anderen Fällen Einträge auch z.B. aus einer XML-Datei schreiben wollen. Mit der lokalen Variablen können wir die Methode universell für verschiedene Eingabemethoden nutzen.
Füllen Sie das Formular aus und senden Sie es ab. Bei mir sieht das Ergebnis so aus:
Array ( [title] => Иван [bodytext] => Привет, Мир! )
Wenn Sie andere Daten eingeben, sieht das Array natürlich anders aus. Wir geben das Array aus, um zu sehen, welche Schlüssel wir verwenden können. Bei uns sind das $p['title'] und $p['bodytext']. Nun können wir die Daten in eine Datei schreiben. Beginnen wir mit dem Schreiben in eine Datei.
PHP: Schreiben in eine Datei
Bevor wir in eine Datei schreiben, müssen wir sie „zum Schreiben öffnen“. Das bedeutet, die Datei wird mit einer PHP-Variablen verbunden. Die Arbeit mit Dateien in PHP läuft über Variablen vom Typ resource. Ich zeige, was das bedeutet:
public function write($p) { // Methode zum Schreiben eines Eintrags $message = fopen("messages/file.txt","w"); print_r($message); }
Ich habe die Datei file.txt im Ordner messages erstellt. Wenn wir das Formular absenden, sehen wir:
Resource id #4
Resource ist der Datentyp der Variablen $message, und 4 ist die laufende Nummer unter anderen Ressourcen. Wenn wir mit der Variable $message arbeiten, wirkt sich das automatisch auf die Datei aus. Wir schreiben zeilenweise in die Datei, um sie später zeilenweise lesen zu können:
public function write($p) { // Methode zum Schreiben eines Eintrags $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); }
Die Zeichen \r\n in doppelten Anführungszeichen (in einfachen funktionieren sie evtl. nicht) bedeuten Zeilenumbruch. Im Ergebnis enthält file.txt dann:
Иван
Привет, Мир!
Nachdem wir mit der Datei gearbeitet haben, müssen wir die Datei schließen, damit die Ressource freigegeben wird:
public function write($p) { // Methode zum Schreiben eines Eintrags $message = fopen("messages/file.txt","w"); // Datei öffnen fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); fclose ($message); // Datei schließen }
Sie haben sicher bemerkt, dass bei jedem Öffnen mit "w" die Datei überschrieben wird. Das hängt vom Parameter in fopen ab. Wir können Dateien auch anhängen oder nur zum Lesen öffnen, z.B. so:
$message = fopen("messages/file.txt","r"); // Datei nur zum Lesen öffnen
- r – Öffnen zum Lesen.
- r+ – Öffnen zum Lesen und Schreiben.
- w – Neue leere Datei erstellen. Wenn Datei existiert, wird sie gelöscht.
- w+ – Wie r+, aber existierende Datei wird gelöscht.
- a – Datei zum Schreiben öffnen, Zeiger am Ende der Datei.
- a+ – Datei zum Lesen und Schreiben öffnen, Zeiger am Ende der Datei, Inhalt bleibt erhalten.
Wie oben beschrieben, wenn wir mit "w" öffnen, wird eine neue Datei erstellt, deren Name aus dem ersten Parameter genommen wird. Wir erstellen Dateinamen entsprechend der aktuellen Zeit mit der Funktion time().
Die Funktion time() gibt die Anzahl Sekunden seit dem 1. Januar 1970 zurück.
Das Ergebnis sollte so aussehen:
public function write($p) { // Methode zum Schreiben eines Eintrags $message = fopen('messages/'.time(),"w"); // Datei öffnen fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']. "\r\n"); fputs ($message, time()); fclose ($message); // Datei schließen }
So erzeugt time() jede Sekunde eine größere Zahl und die Dateinamen steigen an. Probieren Sie, neue Einträge hinzuzufügen, neue Dateien erscheinen im Ordner messages. Nun fehlt nur noch das Lesen und Ausgeben der Einträge.
PHP: Lesen aus einer Datei
Um aus einer Datei zu lesen, öffnen wir sie mit dem Parameter "r" in fopen(). Alle benötigten Dateien liegen im Ordner messages. Um alle Dateien zu lesen, verwenden wir eine while-Schleife, die solange läuft, bis keine Dateien mehr da sind.
Wir durchsuchen den Ordner mit opendir(), das den Ordner zum Lesen öffnet:
if (is_dir('messages')) { // Ordner prüfen if ($dh = opendir('messages')) { // Ordner öffnen while (($file = readdir($dh)) !== false) { // Dateien lesen // gewünschte Aktionen } closedir($dh); // Ordner schließen } }
Die Dateinamen bekommen wir mit readdir(), sie werden in $file gespeichert. Am Ende schließen wir den Ordner, um Speicher freizugeben.
Nun bauen wir die Methode display_public() aus:
public function display_public() { // Methode zum Ausgeben der Nachrichten $content = ''; if (is_dir('messages')) { // Ordner prüfen if ($dh = opendir('messages')) { // Ordner öffnen while (($file = readdir($dh)) !== false) { // Dateien lesen if(substr($file, -4) == '.txt'){ // nur .txt-Dateien $filename = 'messages/' . $file; // vollständiger Dateiname $message = fopen($filename, 'r'); // Datei öffnen $title = fgets($message); // erste Zeile lesen $body = fgets($message); // zweite Zeile lesen $time = fgets($message); // dritte Zeile lesen print '<div class="post">'; // div umschließt Eintrag print '<span class="time">' . date('d-m-Y', $time) . '</span><h2>' . $title . '</h2>'; // Zeit und Titel ausgeben print '<p>' . $body . '</p>'; // Nachrichtentext ausgeben print '</div>'; // div schließen fclose($message); // Datei schließen } } closedir($dh); // Ordner schließen } } $content .= '<p><a href="/index.php?admin=1">Nachricht hinzufügen</a></p>'; return $content; }
Ich habe jede Zeile kommentiert, falls etwas unklar ist, fragen Sie gerne.
Ich glaube, in der Praxis brauchen Sie kaum zeilenweises Lesen von Dateien, aber um die Funktionsweise von PHP mit Dateien und Ordnern zu verstehen, sind solche Lektionen sehr nützlich.
Unten finden Sie den Quellcode der Zwischenversion der Website.