Anzeige
Tutorialbeschreibung

PHP - Teil 16 - Mit Dateien arbeiten (Besucherzähler & Co.)

PHP - Teil 16 - Mit Dateien arbeiten (Besucherzähler & Co.)

Für die Verwaltung von Daten muss nicht immer auf Datenbanken zurückgegriffen werden. Oftmals genügt es, wenn man stattdessen mit normalen Textdateien arbeitet. Wie sich so etwas umsetzen lässt, zeigt dieses Video-Training. Dabei erfahrt ihr auch, wie man einen Besucherzähler ganz ohne Datenbank aufbauen kann.

Icon-Ersteller: Oxygen-Team

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Im einfachsten Fall greift man lesend auf eine Datei zu. Das Lesen erfolgt dabei immer in drei Schritten:

• Die Datei wird geöffnet. Ist die Datei nicht vorhanden, muss sie angelegt werden.
• Die Daten werden ausgelesen.
• Die Datei wird geschlossen.

Beim Schreiben in Dateien sind ebenfalls drei Schritte notwendig:

• Die Datei wird geöffnet. Sollte sie nicht vorhanden sein, muss sie erstellt werden.
• Es wird in die Datei geschrieben.
• Die Datei wird geschlossen.

Zum Öffnen von Dateien wird die Funktion fopen() verwendet.

<?php
$datei = fopen(Dateiname, Modus);
?>

Dabei öffnet fopen() die bei Dateiname angegebene Datei. Durch dieses Öffnen wird ein sogenannter Dateizeiger innerhalb des Dateisystems gesetzt, über den man auf den Dateiinhalt zugreifen kann. Dieser Zeiger legt den Startpunkt für das Lesen bzw. Schreiben in der Datei fest. Der Dateizeiger befindet sich entweder am Anfang oder am Ende der Datei und wird in einer Variablen (hier also $datei) gespeichert. Über Modus legt man den Zugriffstyp fest. Die folgenden Varianten stehen zur Verfügung:
Modus Beschreibung Dateizeiger
r Lesen Am Anfang
r+ Lesen und Schreiben Am Anfang
w Schreiben Am Anfang
w+ Lesen und Schreiben Am Anfang
a Schreiben Am Ende
a+ Lesen und Schreiben Am Ende



 

Dateien beschreiben

Um Inhalte in eine Datei zu schreiben, kann man eine der Funktionen fwrite() oder fputs() verwenden, wobei fputs() ein Alias von fwrite() ist. Beide Funktionen sind also absolut identisch. Welche dieser Funktionen ihr verwendet, bleibt also letztendlich euch überlassen.

Die allgemeine Syntax von fwrite() sieht folgendermaßen aus:

<?php
fwrite($datei, $daten);
?>

Man gibt die zu beschreibende Datei und den Inhalt an, der in die Datei geschrieben werden soll. Durch eine Kombination aus den beiden vorgestellten Funktionen fopen() und fwrite() lässt sich nun bereits eine erste Anwendung erstellen.

<?php
 $daten = "Dieser Inhalt wird in die Datei geschrieben.";
 $datei = fopen("text.txt","w");
 fwrite($datei, $daten);
?>

Durch diese Syntax wird die Datei text.txt angelegt. In diese Datei wird dann automatisch die Zeichenkette Dieser Inhalt wird in die Datei geschrieben. eingefügt. Die Ausgabe des Skripts bleibt zwar leer, es wird aber dennoch im Dateisystem die text.txt erzeugt.

Ist die Datei text.tx bereits vorhanden, wird diese überschrieben. Die ursprünglich darin enthaltenen Inhalte gehen dabei verloren.


 

Inhalte auslesen

Nun möchte man natürlich nicht nur in Dateien schreiben, sondern diese auch auslesen. Dafür stellt PHP ebenfalls einige vordefinierte Funktionen zur Verfügung.

fget() – Lesen eines einzelnen Zeichens.
fgets(), fgetss() und fgetcsv() – Lesen einer Zeile.
fread() – Lesen einer bestimmten Anzahl Bytes.
readfile(), fpassthru() und file() – Lesen der gesamten Datei.

Die Funktionen fget(), fgets(), fgetss() und fgetcsv() werden meistens innerhalb von Schleifen verwendet. Hilfreich ist es in diesem Zusammenhang, zu wissen, wann die Datei zu Ende ist. Dafür gibt es die Funktion feof().;

<?php
feof($datei);
?>

Befindet sich der Dateizeiger am Dateiende, liefert die Funktion TRUE (bzw. 1), anderenfalls FALSE (bzw. 0) zurück.

Im weiteren Verlauf dieses Tutorials wird der Einsatz der beiden Funktionen fgets() und readfile() anhand zweier Beispiele gezeigt. Die anderen Funktionen lassen sich dann ganz ähnlich nutzen.

Dateien sollten nach ihrer Verwendung normalerweise immer geschlossen werden, auch wenn das nicht zwingend notwendig ist. Durch das Schließen schützt man die Dateien aber vor möglichen Fehlern, die geöffnete Dateien beschädigen könnten. Zum Schließen von Dateien wird die Funktion fclose() verwendet.

<?php
fclose($datei);
?>

Die Funktion liefert im Erfolgsfall TRUE (bzw. 1), ansonsten FALSE (bzw. 0).

 
Im folgenden Beispiel wird die Datei text.txt geöffnet. Zum Auslesen wird die Funktion fgets() verwendet. Diese Funktion liest eine Zeile von der aktuellen Position des Dateizeigers aus. Damit aber tatsächlich alles ausgelesen wird, wird fgets() im Zusammenhang mit der while()-Schleife verwendet.

<?php
 $datei = fopen("text.txt", "r");
 while ( $inhalt = fgets ($datei))
 {
   echo "<li> $inhalt </li>";
 }
 fclose($datei);
?>

Das Skript liest die angegebene Datei zeilenweise aus und zeigt deren Inhalt im Browser an.

Bilder



So einfach kann also lesend auf Dateien zugegriffen werden.


 

Einen Besucherzähler umsetzen

Besucherzähler kann man auf Basis der Kombination von PHP und MySQL erstellen. Normalerweise wird für eine solch einfache Anwendung allerdings nicht unbedingt eine Datenbank benötigt.

<?php
 $datei = 'besucher.txt';
 if (file_exists($datei)) {
         $count = file($datei); 
         $count[0] ++;
         $fp = fopen($datei, "w");
         fwrite ($fp, "$count[0]");
         fclose ($fp);
         echo $count[0];
     } else {
         $fh = fopen($datei, "w");
         if($fh==false)
             die("Datei konnte nicht angelegt werden.");
         fwrite ($fh, 1);
         fclose ($fh);
         $count = file($datei); 
         echo $count[0];
 }
?>

Hier wird mittels if überprüft, ob es bereits die Datei "besucher.txt" gibt. Bei jedem Aufruf der Datei wird der Zahlenwert, der innerhalb der Datei steht – und der letztendlich die Seitenaufrufe darstellt – um den Wert 1 erhöht.

 
Dieser Wert wird anschließend in das Dokument geschrieben.

Bilder



 
Zugegebenermaßen fehlen hier noch einige Funktionen, wenn man einen "genauen" Zähler möchte. So könnte man durchaus noch eine Art IP-Sperre integrieren, um detailliertere Ergebnisse zu bekommen. Das lässt sich aber sehr einfach umsetzen. Anstelle einer echten IP-Sperre wird hier allerdings auf PHP-Sessions gesetzt.

<?php
$datei = 'besucher.txt';
session_start();
if(!isset($_SESSION['ip-sperre'])||$_SESSION['ip-sperre']<time()-100){
$_SESSION["ip-sperre"] = time();
    if (file_exists($datei)) {
        $count = file($datei); 
        $count[0] ++;
        $fp = fopen($datei, "w");
        fputs ($fp, "$count[0]");
        fclose ($fp);
        echo $count[0];
    } else {
        $fh = fopen($datei, "w");
        if($fh==false)
            die("Datei konnte nicht angelegt werden.");
        fputs ($fh, 1);
        fclose ($fh);
        $count = file($datei);
        echo $count[0];
}
}
else{
echo "Der Besuch wurde schon gezählt";
}
?>

 
Entscheidend ist in diesem Skript hauptsächlich der Bereich time()-100. Denn darüber wird festgelegt, wie lange der jeweilige Besucher nicht erneut gezählt wird, nachdem er die Seite aufgerufen hat.

Bilder



 
Im aktuellen Beispiel wurden 100 Sekunden bestimmt. Ebenso könnte man auch 24 Stunden angeben. Das sähe dann so aus:

time()-60*60*24.

Dadurch, dass hier Sessions verwendet werden, greift dieser Wert allerdings nicht unbedingt. Denn Sessions laufen – je nach Konfiguration – nach einer bestimmten Zeit automatisch ab. Weiterführende Informationen zu Sessions gibt es im Rahmen dieser Tutorialreihe und unter http://php.net/manual/de/ref.session.php.

Das restliche Skript entspricht dann größtenteils der bereits vorgestellten Anwendung. Auch dieses Skript ließe sich natürlich noch verbessern. So könnte man eine echte IP-Sperre integrieren. Dafür greift man dann allerdings meistens auf eine Datenbank zurück. Zudem solltet ihr – wenn ihr die IP-Adressen der Besucher speichert – diese explizit darauf hinweisen.

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 14.05.2017 - 01:25

Danke sehr für das gute Tutorial!

Portrait von kleckser*1
  • 07.10.2016 - 12:57

Danke für das Tutorial.

Portrait von dmtw2107
  • 16.11.2013 - 09:39

verständlich und toll erklärt danke für das tutorial

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 29.08.2011 - 15:15

Herzlichen Dank aus Hannover

x
×
×