phpbar.de logo

Mailinglisten-Archive

[php] Problem mit fopen, fwrite

[php] Problem mit fopen, fwrite

Mathias Gloß (www.gmail.com) mgloss at gmail.com
Mi Dez 7 16:36:10 CET 2011


Aloha,

@was mache ich falsch: Du vertraust darauf, daß alle Funktionsaufrufe
deines Programmes fehlerfrei funktionieren. Das macht ein guter
Programmierer niemals!

Besser:

<?php
    $FileOne = fopen('Test1.txt', 'w');
    if ( $FileOne === FALSE ) { exit ('unable to open file Test1.txt'); }
    $FileTwo = fopen(realpath ('./') . '/Test2.txt', 'w');
    if ( $FileTwo === FALSE ) { exit ('unable to open file Test2.txt'); }
    $r = fwrite ($FileOne, "Eine Zeile in FileOne\n");
    if ( $r === FALSE ) { exit ('error writing to file Test1.txt' ); }
    $r = fwrite ($FileTwo, "Eine Zeile in FileTwo\n");
    if ( $r === FALSE ) { exit ('error writing to file Test2.txt' ); }
    $r = fclose ($FileOne);
    if ( $r === FALSE ) { exit ('error closing file Test1.txt' ); }
    $r = fclose ($FileTwo);
    if ( $r === FALSE ) { exit ('error closing file Test2.txt' ); }
?>

Auf einem Testsystem empfiehlt es sich, immer in der php.ini
*error_reporting
= E_ALL   *zu setzen, dann werden die Fehler auch gleich im Browser
angezeigt. Auf einem Produktivsystem sollte man das tunlichst unterlassen,
da es keinen etwas angeht mit welchem User man ich zur Datenbank verbindet
oder in welcher (physikalischen) Datei ein Fehler aufgetreten ist.

Für die Faulen gibts unter PHP ab Version 5 ja auch noch das try/catch
Konstruct, damit würdest du dir im obigen Beispiel schreibarbeit sparen.
Das würde dann etwa so aussehen:

<?php
    try {
      $FileOne = fopen('Test1.txt', 'w');
      $FileTwo = fopen(realpath ('./') . '/Test2.txt', 'w');
      fwrite ($FileOne, "Eine Zeile in FileOne\n");
      fwrite ($FileTwo, "Eine Zeile in FileTwo\n");
      fclose ($FileOne);
      fclose ($FileTwo);
    } catch (Exception $e) {
      exit ('Exception occured: '. $e->getMessage() );
    }
?>

Allerdings dürfte $e->getMessage() nicht immer eine aussagekräftige
Fehlermeldung liefern, da ja der Fehler beim Öffnen/Schreiben/Schließen
autreten kann.


Ansonsten wenns auf der Kommandozeile geht und über den Webserver nicht -
denk bitte daran, daß du auf der Kommandozeile in aller Regel mit einem
anderen Benutzer arbeitest, als der unter dem der Webserver läuft. ==>
Rechteproblem?

Grüße, Mathias

php::bar PHP Wiki   -   Listenarchive