Error ausgeben readfile


ComFreek

Mod | @comfreek
Moderator
#21
Jetzt macht er nochwas anderes, er gibt die Message aus "file_get_contents(beispiel-fehler.pdf): failed to open stream: No such file or directory"
Passt doch?

Ich versteh immer noch nicht diese Zeile. Die wird dir nicht helfen.

Statt "echo $error['message']" solltest du jetzt mit einem IF prüfen, ob der Fehlertyp == 2 ist. Wenn ja, dann gibt "No such file or directory" aus (ggf. mit dem verwendeten Dateinamen), sonst "Fehlertyp $error['type']", sodass du keine sensiblen Informationen veröffentlichst.
 
#22
Huch, ich habe sie ja noch drin! Das war aus versehen.

Ich wollte doch den Fehler-Code und nicht diese Message, deshalb war ich verwirrt.

Aber bei Permission denied und file not found gibt es beide Male Typ 2 (ich denke, weil beide zum Typ E_WARNING gehören), kann man die irgendwie anders auseinander halten?
 
Zuletzt bearbeitet:
#23
habe festgestellt, dass bei Permission denied ["message"]=> string(123) "file_get_contents(...)... dasteht, bei file not found ["message"]=> string(104) "file_get_contents(...)...
Also wollte ich ungefähr so eine if-Schleife einbauen:
PHP:
if($error['type']==2 AND $error['message']=="string(104)"){echo "Dokument nicht gefunden"}
else{
if($error['type']==2 AND $error['message']=="string(123)"){echo "falsche Zugriffsrechte"}
else{echo $error['message']." in document ".$error['file'];}
}
Das war leider nicht zielführend, da es immer der Fall in Zeile 4 zutraf - offenbar muss man die Bedingung mit dem string(...) anders formulieren. Hat jemand Ideen, wie?

Außerdem hätte ich ganz gern, dass nicht das ganze Array vom var_dump ausgegeben wird, aber ich habe keinen Weg gefunden es zu verhindern.
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
#24
habe festgestellt, dass bei Permission denied ["message"]=> string(123) "file_get_contents(...)... dasteht, bei file not found ["message"]=> string(104) "file_get_contents(...)...
Super, dass du das Testen hinbekommen hast!

Deine if-Bedingungen (!) haben zwei Probleme:
  • Sie sind beide identisch
  • Du möchtest doch nach dem Fehlertyp differenzieren. Der Fehlertyp ist nur dann 2, wenn das Dokument nicht gefunden worden ist. Bei fehlenden Zugriffsrechten ist das eine andere Zahl (nochmal wie oben probieren). Außerdem beinhaltet $error['message'] z. B. "file_get_contents(...)". Das "string(123)", was du siehst, ist nur als Debuginformation von var_dump ausgegeben worden. Der String ist 123 Zeichen lang. Aber das kann sich mit einem anderen Dateinamen sofort ändern. Das einzige zuverlässige Kriterium ist der Typ.
 
#25
Oh, mist. Schade...
Oh! da gab es beim kopieren ein Problem, ich meinte bei Dokument nicht gefunden string(104)... :(
Der Typ ist bei beiden aber der selbe, es steht jedes Mal ["type"]=> int(2) - was nur sinn macht, meiner Meinung nach. Im Manual steht, Typ 2 heißt E_WARNING, und es sind ja beides WARNINGS (http://php.net/manual/en/errorfunc.constants.php)
Außerdem geht das Array vor dem HTML-Teil
array(4) { ["type"]=> int(2) ["message"]=> string(104) "file_get_contents(C:\Users\Kinder\Desktop\Fehler\beispiel.pdf): failed to open stream: Permission denied" ["file"]=> string(50) "C:\xampp\htdocs\website1903\downloadpdf_Backup.php" ["line"]=> int(7) },
das ich ja eigentlich nur zum Testen gebraucht habe, nicht wieder weg, auch wenn ich es versuche - bzw. Ich weiß nicht mehr durch welchen Befehl es erschienen ist :/
OK, EDIT: es geht weg wenn man $error=var_dump(error_get_last()); weglässt und stattdessen nur $error=error_get_last(); hinschreibt :)
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
#26
Der Typ ist bei beiden aber der selbe, es steht jedes Mal ["type"]=> int(2) - was nur sinn macht, meiner Meinung nach. Im Manual steht, Typ 2 heißt E_WARNING, und es sind ja beides WARNINGS (http://php.net/manual/en/errorfunc.constants.php)
Oh, dann ist das absolut mein Fehler, tut mir leid. Danke, dass du ihn erkannt hast!

Ich habe gerade in einem PHP-Chat gefragt, ob es eine andere Möglichkeit gebe, die Fehlermeldung herauszubekommen, ohne sich auf $error['message'] zu verlassen. Die gibt es, aber das ist m. E. auch nur eine unschöne Alternativlösung (weil eben PHP keinen genauen Fehlercode anbietet) und wahrscheinlich auch out-of-scope für euer Projekt.
Am besten du belässt es jetzt doch bei "echo $error['message']". Tut mir leid für die Zeit, die du jetzt wegen mir zusätzlich reingesteckt hast, weil ich die Manualseite nicht aufmerksam gelesen habe, was denn nun $error['type'] genau ist :(
 
#27
Macht nichts. Sieh es so, ich kann stolz auf mich sein weil ich das selbst richtig erkannt habe °°... und ich kann es trotzdem verwenden, wenn der Fehler keine WARNING ist nützt mir die Hilfe für permission denied und file not found gar nichts... Und danke für deine Zeit, du hast ja immerhin mehrere Tage damit verbracht, meine (manchmal ziemlich dummen) Fragen zu beantworten und zu versuchen, meinen Code zu verstehen!
Dann fange ich wohl damit an, eine Präsentation in Tex über das Projekt zu schreiben... Hoffentlich muss ich hier nicht so schnell die nächste Frage stellen, bald ist Abgabe!
Nochmal für jeden der vorbeikommt und das selbe Problem hat der (ziemlich) vollständige Code: Er lässt sich, wenn man den
header("Content-Disposition: attachment; filename=$file.pdf",false); weglässt, auch zum öffnen des dokuments verwenden.
HTML:
<?php
ini_set('display_errors', '0');
error_reporting(E_ALL);
$Pfad="C:\Users\KinderDesktop";// LINUX "/home/user/Desktop";  WINDOWS C:\Users\Kinder\Desktop
$inhalt=file_get_contents("$Pfad\\beispiel.pdf","beispiel.pdf");//LINUX "$Pfad/$ordnerfirma/$file.pdf"; WINDOWS ("$Pfad\\$file.pdf","$file.pdf")
$error=error_get_last();
if($inhalt == true) {
header("Content-Type: application/pdf;");
header("Content-Disposition: attachment; filename=$file.pdf",false);
echo $inhalt; ?>
<!DOCTYPE HTML>
<html lang= "de">
<head>
   <meta charset="utf-8">
</head>
<body> downloading file... </body>
</html>
<?php } else{ ?>
<!DOCTYPE HTML>
<html lang= "de">
<head>
   <meta charset="utf-8">
</head>
<body>
<?php
if($error['type']==2 ){
?>
<h4>Dokument <?php echo $file.".pdf"; ?> wurde nicht in <?php echo"($Pfad)";?> gefunden</h4>
Überprüfen Sie den Pfad <?php echo "($Pfad\\beispiel.pdf)";?> und den Dokumentnamen <?php echo "(beispiel.pdf)";?>. <br />
Versuchen Sie das Dokument "normal", also über Adobe, zu öffnen. <br />
Den richtigen Pfad kann man bestimmen, indem man im Dokumentenverzeichnis des Computers auf die Adressleiste klickt, nachdem man den Ordner, der die Firmenordner enthält, geöffnet hat. Achten Sie darauf dass der Pfad richtig -je nach Betriebssystem- im Dokument openpdf.php angegeben wurde:
<ul>
   <li>Windows: </li>
   <ul>
       <li>Beispiel für $Pfad: "C:\Users\Kinder\Desktop";</li>  
       <li>Pfadangabe für file_get_contents: file_get_contents("$Pfad\\beispiel.pdf","$file.pdf");</li>
   </ul>
   <li>Linux: </li>
   <ul>
       <li>Beispiel für $Pfad: "/home/user/Desktop"</li>
       <li>Pfadangabe für file_get_contents: file_get_contents("$Pfad/beispiel.pdf");</li>
   </ul>
</ul>
<h4>-> falsche Zugriffsrechte <?php echo"($Pfad\\beispiel.pdf)";?></h4>
Gehen Sie zu dem Ordner, der das betreffende Dokument enthält <?php echo"($Pfad\\beispiel.pdf)";?>. Über Linksklick kommen Sie zum Bereich Eigenschaften, in dem die Zugriffsrechte enthalten sind. Fügen Sie bei Windows den Benutzer "Jeder" hinzu und geben Sie ihm alle Rechte. Übertragen Sie diese Rechte auf die im Ordner enthaltenen Dateien. Bei Linux müssen Sie für alle Bereiche alle Rechte einstellen, die möglich sind und das wieder auf die Dateien übertragen lassen.
<?php }
else{ echo $error['message']." in document ".$error['file'];
}?>
</html>
 

Neue Beiträge