Hallo zusammen,
ich bin gerade am Kapitel mit dem Zugriffszähler dran und verstehe da die Funktionsweise der verschiedenen modes von fopen, also r,r+,w,w+,a,a+ nicht so ganz und das Verhalten des "rewind"-befehls.
Folgender Code um einen Zugriffszähler zu erzeugen:
<?php
$datei = "seitenaufrufe.txt";
$handle = fopen($datei, "r");
$dateigroesse = filesize ($datei);
$inhalt = fread($handle, $dateigroesse);
fclose ($handle);
$inhalt += 1;
echo "Seitenaufrufe: $inhalt";
$handle = fopen($datei, "w");
fwrite ($handle,$inhalt);
fclose ($handle);
?>
So, aber warum funktioniert dieser Code hier nicht -> es kommt in der Zeile bei fread ein Fehler und der Wert bei der Ausgabe bleibt immer bei 1:
<?php
$datei = ("test.txt");
$handle = fopen($datei, "w+");
$dateigroesse = filesize($datei);
$inhalt = fread($handle,$dateigroesse);
$inhalt += 1;
fwrite ($handle,$inhalt);
echo "$inhalt";
?>
Ich stelle mir die Funktionsweise beim letzten Code so vor: die Datei wird, wenn sie durch fwrite geöffnet wird, durch den mode "w+" auf 0 gesetzt am Anfang, wodurch das $inhalt += 1 den Wert immer wieder nur auf 1 setzt. Und vorher bei $inhalt = fread ($handle, $dateigroesse) der Fehler kommt, weil die Datei ja noch leer ist, weil durch w+ auf Null gesetzt.
Aber im Code darüber mit den zwei fopens wird ja auch "w" benutzt, und der setzt die Datei dann nicht auf Null, sondern da funktioniert der Zähler und erhöht sich schön weiter. Liegt das daran, dass vom fopen "r" das vorher schon ausgelesen wurde und quasi "im gedächtnis" behalten wurde, und damit dann nicht mehr vom fopen "w" auf null gesetzt wird, sondern dann weiter mit $inhalt += 1 weiter hoch gesetzt wird? Also der Datei Inhalt zwar durch "w" gelöscht wird (auf null gesetzt), aber dadurch, dass der Inhalt vorher gelesen wurde von "r", noch zwischengespeichert ist und darauf dann aufgebaut werden kann?
Meine zweite Frage ist folgende, falls jemand Zeit hat, die auch noch zu beantworten:
Mit dem rewind Befehl soll der Dateizeiger ja wieder zurück an den "Anfang" gesetzt werden. Bei dem "r" mode für fopen steht aber in der Definition auch, dass der Dateizeiger immer an den Anfang gesetzt wird, nur ist damit aber quasi das andere Ende gemeint, also beides unterschiedlich als "Anfang" definiert ist, richtig? Außerdem wird bei rewind der Dateizeiger nicht nur an den Anfang gesetzt, sondern dieser ersetzt dann auch das was da vorher stand, wenn etwas neu reingeschrieben wird und das ist bei "r" ja nicht der Fall, jedoch ist dies ebenfalls nicht in der Definition oder im Video angegeben, oder übersehe ich da was?
Ansonsten wäre die Funktionsweise von "rewind" ja definitionsgemäß genau dieselbe wie von dem mode "a", da wird der Dateizeiger ja auch wieder an den Anfang der Datei (also ganz nach links!) gesetzt, was laut definition aber das "ende" der Datei ist. Allerdings wird bei "a" nix ersetzt, sondern nur etwas davor geklatscht, quasi.
Ich hoffe, ihr versteht was ich meine, und ich konnte es einigermaßen schildern. Grob komm ich gerade nicht mit den modes und dem rewind befehl klar, weil die sich alle etwas widersprüchlich zu dem was man auf php.net liest oder wies im video erklärt wird, verhalten.
Herzliche Grüße,
Frank