Sven Rautenberg: Warning: fopen("", "r") - No error in .....

Beitrag lesen

Moin!

Ich habe die Anweisungen zum Öffnen bzw. Schliessen von Dateien in eigene Funktionen ausgelagert:

Warum das denn? Ok, es bringt dir einen absolut _WINZIGEN_ Vorteil: Statt fopen() und flock() nacheinander aufzurufen, muß du jetzt nur noch dauei_oeffnen_r() aufrufen, aber tatsächlich gesehen verkomplizierst du die Dinge damit eigentlich nur unnötig.

Abgesehen davon hast du massive Fehler in deine Auslagerung eingebaut:

function datei_oeffnen_r()
  {
    if(file_exists($datei_name))
    {
      $datei_zeiger = fopen($datei_name, "r") or die ("Datei $datei_name kann nicht geöffnet werden.");
      flock($datei_zeiger, LOCK_EX);
      return ($datei_zeiger);
    }

else? Was passiert dann? Kein definierter Rückgabewert!

}

function datei_schliessen($datei_zeiger)
  {
    flock($zeiger,LOCK_UN);

$zeiger ist nicht definiert.

fclose ($datei_zeiger);

Keine Fehlerabfrage.

}

function statistik_anzeigen($datei_name)
  {
    [ ... ]
    datei_oeffnen_r($datei_name);

Rückgabewert (der Dateizeiger) wird nicht gespeichert.

$datei_zeiger = func_get_arg(1);

Damit kriegst du das zweite der Funktion statistik_anzeigen() übergebene Argument - das ist mit Sicherheit nicht der Dateizeiger.

$anzahl_eintraege = count(file($datei_name)) - 1;

Hier liest du die komplette Datei in ein temporäres Array, zählst dann deren Einträge und wirfst das Array dann wieder weg. Sehr uneffektiv!

$datei_schliessen($datei_zeiger);

Und hier schließt du die Datei dann wieder (mit einem falschen Dateizeiger wird das allerdings nichts), ohne irgendwas aus ihr gelesen zu haben. Warum das? file() funktioniert auch ohne Dateiöffnen/-schließen.

[ ... ]
  }

Nun erhalte ich aber folgende Warnung:

Von mir erhälst du auch eine Warnung: Junge, so wird das nichts! :)

Mein Tipp: file() ist eine tolle Funktion. Man übergibt ihr einen Dateinamen und erhält als Ergebnis ein Array mit allen Zeilen der Datei darin. Das könnte für dein Vorhaben bestens geeignet sein: Gästebuch komplett in das Array einlesen, und fertig. Alle weiteren Dinge werden dann nicht mit der Datei, sondern mit dem Array geregelt. Am Skriptende bei Veränderungen wieder speichern. Und ansonsten: Mach dein Skript nicht unnötig komplizierter, als es sein muß. Dinge in Funktionen auszulagern mag toll sein, aber man kann es auch übertreiben!

- Sven Rautenberg