Web Development

Ein Lehrbuch für das Informatik oder Medien-Informatik Studium.

In diesem Kapitel wird beschreiben, wie PHP mit Dateien und Ordnern arbeiten kann und welche Web-spezifischen Probleme dabei auftreten.

Ordner auflisten

Um herauszufinden, welche Dateien (und Unter-Ordner) sich in einem Ordner befinden, verwendet man die Funktion glob. (Achtung: die Funktionen opendir, readdir, closedir gibt es auch, die sind aber komplizierter zu verwenden)

<?php
   $alle = glob("*");
   foreach( $alle as $file ) {  // forach-Schleife über Werte
                                // Schlüssel wird ignorieren!
       echo "<br>Datei $file gefunden.\n";
   } 
?> 

Im Output des Programmes werden nicht nur Dateien angezeigt, sondern auch Ordner. Mit den Funktionen is_dir() und is_file() könnte man herausfinden ob ein Ordner oder eine Datei vorliegt.

Die Funktion glob kann — ähnlich wie das DOS-Kommand dir oder das UNIX-Kommando ls —mit verschiedenen Mustern suchen:

<?php
   $alle = glob("*.jpg");
   foreach( $alle as $file ) {
       echo "<br>Bild $file gefunden.\n";
   } 
?>

Der Rückgabewert von glob ist ein Array. Mit array_merge kann man mehrere Arrays zusammenfügen zu einem langen Array und mit asort die Werte alphabethisch sortieren:

$jpg = glob("bilder/*.jpg");
$gif = glob("bilder/*.gif");
$alle_bilder = array_merge($jpg, $gif);
asort( $alle_bilder )

Datei lesen

Um eine Datei von PHP aus zu benutzen, muss man sie mit der Funktion fopen öffnen. Man erhält einen „handle“ mit dem man sich im Weiteren auf diese Datei bezeihen kann.

$handle = fopen("counter.txt", "r");    // r steht für read = lesen

Achtung: die Pfadangabe zur Datei ist in UNIX-Schreibweise mit Slash zu schreiben, nicht in Windows-Schreibweise mit Backslash, also:

# $handle = fopen ("unterordner\counter.txt", "r") # FALSCH
  $handle = fopen ("unterordner/counter.txt", "r")

Da die Datei zum Lesen geöffnet wurde, kann man nun mit fgets eine Zeile aus der Datei lesen. „Eine Zeile“ bedeutet hier: bis ein Zeilenumbruch in der Datei gefunden wird.

$zahl = fgets($handle);

Bei längeren Dateien wird fgets meist in einer Schleife verwendet, um alle Zeilen aus der Datei zu lesen. Nach Gebrauch muss man die Datei wieder schließen:

fclose($handle);

Datei (über-)schreiben

Bevor Sie beginnen mit PHP Dateien zu (über-)schreiben, zu löschen oder zu verschieben ein Warnhinweis: Es wird ernst. Hier gibt es keinen Papierkorb. Hat Ihr PHP-Programm eine Datei gelöscht, dann ist diese Datei unwiederbringlich weg.

Beim Schreiben wird als zweites Argument von fopen der Buchstabe „w“ übergeben:

$handle = fopen("counter.txt", 'w');
fwrite($handle, "$zahl\n");
fclose($handle);

Sowohl beim Lesen als auch beim Schreiben von Dateien kann viel schief gehen. Existiert die Datei, aus der ich lesen will, überhaupt? Darf ich in die Datei, in die ich schreiben will überhaupt schreiben?

Verschärft wird das Problem auf dem Webserver mit UNIX Zugriffsrechten!. Auf dem UNIX-Webserver läuft das PHP-Programm unter dem Account des Webservers, nicht unter Ihrem Account!

Um diese Fragen zu beantworten gibt es Funktionen is_readable, is_writable und die Rückgabewerte der verschiedenen schon gezeigten File-Funktionen. So liefert fwrite entweder die Anzahl der geschriebenen Bytes oder FALSE als Status-Code zurück:

$status = fwrite($handle, $zahl);
if ( $status === FALSE ) {
  echo "Datei nicht schreibbar: Platte voll? Zugriff verboten?";
  exit;
}

Gleichzeitiger schreibender Zugriff

Achtung: was passiert wenn zwei Zugriffe genau gleichzeitig erfolgen? Zwei Apache-Prozesse führen jeweils das PHP-Programm aus und versuchen, in die gleiche Datei zu schreiben! Diese Problem existiert, wir können es jetzt noch nicht lösen.