PHP Seltsame Fehlermeldung beim Öffnen von Dateien

jopjip

Ensign
Registriert
Juni 2008
Beiträge
233
Hi,
ich habe in PHP ein Programm geschrieben, das txt-Dateien auf dem PC des Users bearbeiten kann/soll.
Der Code zum öffnen und bearbeiten der Datei sieht wie folgt aus:

PHP:
$haha = $_POST['pfad'];
	$e = fopen($haha,w);
	rewind($e);
	fwrite($e, $handle);
	fclose($e);

Beispiel für
PHP:
$_POST['pfad']

->/Users/Thore/Desktop/text00-49-49.txt

Ist der Pfad eine Angabe auf dem Computer und nicht im Stammverzeichnis des Programmes so erhalte ich folgende Fehlermeldungen:

Warning: fopen(text00-49-49.txt) [function.fopen]: failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/index.php on line 90

Warning: rewind() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/index.php on line 91

Warning: fwrite() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/index.php on line 92

Warning: fclose() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/index.php on line 93

Der Knackpunkt ist meiner nach die Funktion fopen(), die letzen drei Meldungen sind nur ein Ergebnis der Tatsache, dass fopen() nicht richtig arbeitet. Ich habe das Gefühl, dass fopen() für dererlei Aufgaben nicht geeignet ist und nur auf dem Server aber nicht auf dem Computer des Anwenders nach der Datei sucht, es könnte aber auch an etwas anderem liegen. Kennt jemand eine geeignete Funktion und die Lösung für mein Problem?

MFG
P.S. Das Programm wird auf einer XAMPP-Umgebung ausgeführt.
 
Ist in der PHP-Konfiguration ein "open base dir" definiert?

Mit dem "open base dir" werden die Pfade eingeschränkt, in denen man Dateioperationen durchführen kann.
 
Mir wird schlecht: Folgebefehle, die trotz möglichem Fehlschlagen dennoch ausgeführt werden.

Ich hoffe, Du lernst aus diesem Szenario, dass Du die Rückgabewerte von möglicherweise fehlschlagenden Funktionen überprüfen musst, jopjip.
 
Das Problem hier ist, dass du mit relativen Pfadangaben arbeitest und solang bei dir das zu ausführende Verzeichnis nicht direkt das Laufwerk ist, wird die Adressierung so erstmal nicht funktionieren.

Du bist ja anscheinend in:
/Applications/XAMPP/xamppfiles/htdocs/index.php
und versuchts:
/Applications/XAMPP/xamppfiles/htdocs/Users/Thore/Desktop/text00-49-49.txt zu öffnen.

PHP:
$path = $_POST['pfad'];
if(file_exists($path) {
   $file = fopen($path,'w');
   if($file) {
      rewind($file);
      fwrite($file, $handle);
      fclose($file);
    } else { echo 'Datei kann nicht geöffnet werden'; }
} else { echo 'Datei existiert nicht'; }
 
Zuletzt bearbeitet:
@XunnD Dass man Varibalen prüfen sollte weiß ich auch, aber darum geht es hier nicht im geringsten.

@Eagle-PsyX- Danke für den Hinweis, das löst nur nicht mein Problem.

@Conbinja Kannst du mir evtl. kurz erklären, was openbase_dir ist? Google spuckt nichts gescheites aus, es geht um absolute und relative angaben richtig?

Sonst hätte ich noch die Idee die Datei in eine MySQL-Datenbank upzuloaden(klingt blöd), zu bearbeiten und dann wieder zu exporten bzw. zu downloaden, allerdings liegt sie dann ja nicht zwangsläufig wieder im Ausgangverzeichnis.
Hat jemand eine Idee?

MFG
 
Als seltsam würde ich den Fehler nicht bezeichnen. Wenn du die Fehlermeldung lesen würdest, dann könntest du sehen dass es sich um "Permission Denied" handelt. Dein Script hat also keine Rechte diese Textdatei zu öffnen.
 
Das "open base dir" gibt die Verzeichnisse an, unterhalb derer Dateioperationen zugelassen sind.

Wenn du z.B. "C:\\PHP" angibst, dann dürfen nur unterhalb dieses Ortes Dateien geöffnet werden. Du kannst auch mehrere Verzeichnisse angeben, die dann unter Windows mit Semikolon, auf anderen Systemen mit Doppelpunkt getrennt werden.
Das open_basedir ist nicht zwangsläufig ein vollständiger Verzeichnisname, sondern wird als Präfix ausgewertet, d.h. "C:\\PHP" als open_basedir gilt für die Verzeichnisse "C:\PHP" und für "C:\PHP-Dateien".

Wenn also bei dir in der PHP-Konfiguration ein open_basedir auf das htdocs-Verzeichnis vom Apache gesetzt ist, darfst du woanders im Dateisystem keine Dateien öffnen.
 
jopjip schrieb:
@XunnD Dass man Varibalen prüfen sollte weiß ich auch, aber darum geht es hier nicht im geringsten.

Wenn es nicht darum geht und Du es auch wissen behauptest - dann muss die Frage erlaubt sein, warum Du dann die aus diesem Grunde erzeugten Warnings gleich mit postest?

Die Fehlermeldungen sind in keinem Falle mysteriös oder seltsam, sondern können mit dem PHP-Manual geklärt werden.
 
$e = fopen($haha,"w"); muss es heißen.. beachte die quotes!
außerdem solltest du immer den rückgabewert $e prüfen, ob die datei überhaupt geöffnet werden konnte. bei fehlschlag gilt $e === false

dass die datei nicht geöffnet werden kann liegt entweder an der falschen benutzung von fopen, an falschen zugriffsrechten der datei oder daran, dass der zugriff in der php config z.b. mit open_basedir blockiert ist.
als erstes solltest du prüfen, welche zugriffs-flags die datei gesetzt hat. dabei ist zu berücksichtigen, dass der webserver oftmals mit einem anderen benutzer-account läuft als z.b. der ftp-server, mit dem du dateien auf den webserver hochlädst. aus diesem grund sollte die datei -rw-rw-rw- (0666) als mods haben.
wenn es dann noch nicht funktioniert, so solltest du die php config prüfen. z.b. phpinfo() in nem skript aufrufen, dann bekommst du alles relevante angezeigt.
 
Zurück
Oben