phpbar.de logo

Mailinglisten-Archive

[php] Problem mit fopen, fwrite

[php] Problem mit fopen, fwrite

Ulrich Goebel ulrich at fam-goebel.de
Mi Dez 7 17:09:50 CET 2011


Wow, das ist ja schon ein Tutorial für Anfänger im Programmieren - für 
mich tatsächlich sehr hilfreich! Vielen Dank!

Beim Umgang mit den Dateirechten habe ich jetzt noch folgendes 
herausgefunden: Der user bestimmt sich aus dem Eigentümer der 
betreffenden php-Datei. Wenn ich also mit "chown www-data:www-data 
index.php" dafür sorge, dass die Datei index.php dem user gehört, unter 
dem auch der www-Server läuft (das ist beim meinem virtuellen Server von 
HostEurope www-data), dann bekomme ich von get_current_user() www-data 
zurück, und die Dateien werden ohne Problem erzeugt.

Mit bestem Gruß
Ulrich

Am 07.12.2011 16:36, schrieb Mathias Gloß (www.gmail.com):
> 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

-- 
Ulrich Goebel
Sonnenrain 29, 53757 Sankt Augustin
Telefon: 02241-8799161

php::bar PHP Wiki   -   Listenarchive