Technikerschule
Nördlingen
Programmierung dynamischer Internetseiten
Startseite
Termine
Links
Einführung
Netzdiagnose
Webserver
HTML-Unterlagen
HTML-Praxis
Stylesheets
Javascript
WAMP-Installation
PHP-Lektionen
PHP-Übungen
Vorlagen
Kontakt

Zugriff auf das Dateisystem

Inhalte müssen nicht zwangsläufig in einer Datenbank wie MySQL abgelegt werden. Mit PHP können sowohl Text- als auch Binärdateien bearbeitet werden. Auf diese Weise lassen sich Daten, die zum Beispiel von Maschinen oder Meßgeräten in Dateien geschrieben werden, aufbereiten.

Für den Zugriff auf das Dateisystem stehen rund 70 Funktionen zur Verfügung, mit denen sich Eigenschaften von Dateien (Größe, Typ oder letztes Änderungsdatum) und Verzeichnissen bestimmen oder ändern lassen. Auch das Kopieren, Löschen und Schreiben von Dateien ist möglich.

Sofern dem Skript entsprechende Lese- und Schreibrechte gewährt werden, kann sich das Programm in der Verzeichnisstruktur frei bewegen und auch Dateien anlegen.

1. Dateien lesen

readfile("dateiname");

Mit der Funktion readfile("dateiname") wird eine Datei gelesen und der Inhalt so wie er ist an die Standardausgabe gesendet, das ist normalerweise der Browser.

Üblichweise will man aber mit dem Inhalt einer Datei arbeiten. Dafür ist die Funktion file("dateiname") besser geeignet.

$arZeilen=file("dateiname");

Bei $arZeilen handelt es sich um einen Array, in dem jede Zeile der Datei ein Element des Arrays ist. Vor allem, wenn man weiß, in welcher Zeile einer Datei ein bestimmter Inhalt steht, lassen sich Daten auf diese Weise einfach visualisieren.

Ein Beispiel: Eine Wetterstation zeichnet Uhrzeit, Temperatur, Luftfeuchtigkeit und Windgeschwindigkeit auf. In regelmäßigen Abständen werden die Daten in eine Datei geschrieben. Jeder Wert bekommt eine Zeile, bei jedem Messvorgang wird die Datei neu geschrieben.

Die Datei wetterdaten.txt könnte so aussehen:

20.02.2011 10 Uhr
-2
35
4

Mit $wetter_jetzt=file("wetterdaten.txt"); ließen sich die vier Zeilen in einen Array einlesen, deren einzelne Elemente in eine HTML-Datei eingebaut werden. Mit der Funktion chop() werden "Whitespaces" am Ende des Strings entfernt. "Whitepaces" sind Formatierungszeichen wie Zeilenumbrüche, Leerzeichen oder Tabulatoren. In unserem Beispiel wird damit der Zeilenumbruch am Ende jeder Zeile entfernt. Besonders wichtig ist dies, wenn mit Daten aus Dateien gerechnet werden soll. Das Ganze sieht dann so aus:

<table cellspacing="2" cellpadding="2" border="0">
<tr bgcolor="#F0F0F0">
<td>Datum/Uhrzeit</td>
<td><? echo chop($wetter_jetzt[0]); ?> </td>
</tr>
<tr bgcolor="#F0F0F0">
<td>Temperatur</td>
<td><? echo chop($wetter_jetzt[1]); ?> Grad</td>
</tr>
<tr bgcolor="#F0F0F0">
<td>Luftfeuchtigkeit</td>
<td><? echo chop($wetter_jetzt[2]); ?> Prozent</td>
</tr>
<tr bgcolor="#F0F0F0">
<td>Wingeschwindigkeit</td>
<td><? echo chop($wetter_jetzt[3]); ?> Beaufort</td>
</tr>
</table>

Das Ergebnis im Browser (demo):

Datum/Uhrzeit 20.02.2011
Temperatur -2 Grad
Luftfeuchtigkeit 35 Prozent
Windgeschwindigkeit 4 Beaufort

2. Dateien öffnen, schreiben

Nicht immer soll die ganze Datei ausgelesen werden, oder neben dem Lesen soll auch etwas hineingeschrieben werden. Für das Schreiben oder die Arbeit mit einem "Dateizeiger" muss die Datei geöffnet werden. Dies geschieht mit der Funktion $handler=fopen("dateiname"). Dabei wird ein so genannter "Handler" erzeugt. Über diese Referenz auf die Datei greifen verschiedene Funktionen auf den Inhalt zu. Ein Attribut legt fest, was mit der Datei möglich ist.

Das Attribut kann einen der folgenden Werte haben:

  • 'r' - öffnet die Datei nur zum Lesen und positioniert den Dateizeiger auf den Anfang der Datei.
  • 'r+' - Öffnet die Datei zum Lesen und Schreiben und setzt den Dateizeiger auf den Anfang der Datei.
  • 'w' - Öffnet die Datei nur zum Schreiben und setzt den Dateizeiger auf den Anfang der Datei sowie die Länge der Datei auf 0 Byte. Wenn die Datei nicht existiert wird versucht, sie anzulegen.
  • 'w+' - Öffnet die Datei zum Lesen und Schreiben und setzt den Dateizeiger auf den Anfang der Datei sowie die Länge der Datei auf 0 Byte. Wenn die Datei nicht existiert, wird versucht, sie anzulegen.
  • 'a' - Öffnet die Datei nur zum Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht, sie anzulegen.
  • 'a+' - Öffnet die Datei zum Lesen und Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht, sie anzulegen.

Für Binärdateien wie Bilder wird ein b hinzugefügt also br+ oder bw etc.

Wenn unsere Wetterstation die Daten mit PHP auch schreibt, wird die Datei zunächst geöffnet.

$handle=fopen("wetterdaten.txt","w+");

Eingefügt werden Inhalte mit der Funktion fputs($handle,$inhalt), und zwar an der Stelle, an der der Dateizeiger steht. Deshalb ist es von Bedeutung, ob Sie als Attribut von fopen() w+ oder a+ verwenden. Das a steht übrigens für append (zu deutsch anhängen), denn der neue Inhalt wird an den bestehenden angehängt.

Um die Wetterdaten in die Datei zu schreiben, könnte folgendes Skript verwendet werden. Beachten Sie die \n, mit denen der Zeilenwechsel in der neuen Datei erzeugt wird. Ohne diesen Zeilenwechsel würden alle Daten in eine Zeile geschrieben werden. Diesen Zeilenwechsel müssen wir beim Auslesen mit der Funktion chop() wieder entfernen (s.o.).

Genauso wichtig wie fopen() ist die Funktion fclose(), mit der die Datei geschlossen wird.

$handle=fopen("wetterdaten.txt","w");

$wetter_neu = "$zeit\n";
$wetter_neu.= "$temperatur\n";
$wetter_neu.= "$luftfeuchtigkeit\n";
$wetter_neu.= "$wind\n";

fputs($handle,$wetter_neu);
fclose($handle);

 

Man muss aber nicht zwangsläufig die gesamte Datei neu Schreiben. Wenn, wie im obigen Beispiel, mit der file()-Funktion die Zeilen in einen Array geladen wurden, lassen sich auch einzelne Zeilen manipulieren. Allerdings muss dazu der Array wieder in einen String verwandelt werden, damit die Datei mit fputs() neu geschrieben werden kann. Dies geschieht mit der Funktion implode(), die als Argument einen Separator (wird in unserem Fall nicht benötigt) und den Array erhält. Um nur die Temperaturdaten zu ändern, können wir das Skript wie folgt anpassen.

$wetter_jetzt=file("wetterdaten.txt");

$wetter_jetzt[1]= "$neue_temperatur\n";

$handle=fopen("wetterdaten.txt","w");

$wetter_neu=implode("",$wetter_jetzt);

fputs($handle,$wetter_neu);
fclose($handle);

Sollen die Wetterdaten gespeichert werden, ist es wahrscheinlich sinnvoller, jeden Wetterdatensatz in eine Zeile zu schreiben und die einzelnen Felder mit einem Trennzeichen zu separieren.

20.02.2011 10 Uhr#-2#35#4
20.02.2011 11 Uhr#-1#38#3
20.02.2011 12 Uhr#-1#39#4
20.02.2011 13 Uhr#0#45#3
20.02.2011 14 Uhr#2#43#4

Wir könnten, wie oben, zunächst die file()-Funktion verwenden. Es geht aber auch mit fgets(). Fgets() liest von der Position des Dateizeigers, bis eines der folgenden Ereignisse eintritt:

  • ein Zeilenende wird erreicht
  • die als Attribut übergebene Anzahl Bytes wird erreicht
  • das Dateiende wird erreicht

Um die Datei korrekt auslesen zu können, müssen wir Sie also mit einem Attribut öffnen, das den Dateizeiger an den Anfang von wetterdaten.txt setzt.

Mit einer while()-Schleife wird dann Zeile für Zeile ausgelesen und deren Elemente mit der Funktion split("trennzeichen",$zeile) in einen Array eingelesen werden.

<table cellspacing="2" cellpadding="2" border="1">
<tr><th>Datum/Zeit</th>
    <th>Temperatur</th>
    <th>Luftfeuchtigkeit</th>
    <th>Windgeschwindigkeit</th>
</tr>


<?
$handle=fopen("wetterdaten.txt","r");

while($zeile = fgets($handle,1000)){
   $wetter_jetzt=split("#",chop($zeile));
   echo "<tr><td>$wetter_jetzt[0]</td>
             <td>$wetter_jetzt[1]</td>
             <td>$wetter_jetzt[2]</td>
             <td>$wetter_jetzt[3]</td>
         </tr>";
}
fclose($handle);
?>
</table>

Und das ist das Ergebnis (demo):

Datum/Zeit Temperatur Luftfeuchtigkeit Windgeschwindigkeit
20.02.2011 10 Uhr -2 35 4
20.02.2011 11 Uhr -1 38 3
20.02.2011 12 Uhr -1 39 4
20.02.2011 13 Uhr 0 45 3
20.02.2011 14 Uhr 2 43 4

Eine Alternative zum Einlesen des Eregebnisses der Funktion split() in einen array ist die Funktion list(). Da bekannt ist, in wie viele Einzelteile die Zeile zerlegt wird (nämlich 4) kann man die Teile auch jeweils in einen String einlesen.

Die Zeile sieht dann so aus

$handle=fopen("wetterdaten2.txt","r");

while($zeile = fgets($handle,1000)){
   list($zeit,$temp,$luft,$wind)=split("#",chop($zeile));
   echo "<tr><td>$zeit</td>
             <td>$temp</td>
             <td>$luft</td>
             <td>$wind</td>
        </tr>";
}
fclose($handle);
 
Zurück   Home   Nächste