Error ausgeben readfile

MerlinaMendel

Grünschnabel
Ich habe eine Funktion geschrieben, um ein PDF zu öffnen, die auch wunderbar funktioniert.
PHP:
header("Content-Type: application/pdf;");
error_reporting(E_ALL);
readfile("beispiel.pdf");

Aber wenn ich will dass der eventuelle Error ausgegeben wird, muss ich ins skript gehen und den header auskommentieren, was nervt - vor allem da das ja für normalbenutzer gedacht ist. Also wollte ich einen ungefähr so aussehenden Code einbauen:

PHP:
if(/*error während readfile*/){
error_reporting(E_ALL); //gibt den beim Fehler aus; lässt den header WEG
}
else{/*sehr schön, es funktioniert, dann gib das PDF doch aus! -> Code siehe oben*/}

Ich weiß aber nicht wie ich das "es gab einen error - ja oder nein?" in php-code ausdrücken soll. Wenn ich den Rückgabewert von error_reporting ausgeben lasse, ist es immer der Wert "22527" - egal ob ein Fehler da ist oder nicht! Die zwei Fehler, die ich bisher hatte, sind "File not found" und "permissions denied" (natürlich neben syntax-fehlern), das heißt die würde ich gern berücksichtigen. Ich habe auch probiert, die ausgabe des Fehlers als pop-up-fenster oder so zu regeln, aber das hat auch nicht funktioniert.

Dnke für alle Hilfe, selbst wenn es ab Ende immer noch nicht geht!
 
Hi

readfile list die Datei ja nicht nur von der Festplatte, sondern sendet sie auch gleich zum Benutzer - das muss hier getrennt werden.

zB. zuerst mit file_get_contents die Datei nur einlesen, in eine Variable. Da kann man dann auch prüfen, ob es erfolgreich war oder nicht. (Wenn man die genaue Fehlermeldung will könnte error_get_last weiterhelfen).

Und nur, wenn es erfolgreich war, header aufrufen und die Daten in der Variable dann mit echo ausgeben.
 
OK, Teil eins funktioniert. Das Dokument wird immer noch ausgegeben.
zuerst mit file_get_contents die Datei nur einlesen, in eine Variable. Da kann man dann auch prüfen, ob es erfolgreich war oder nicht. (Wenn man die genaue Fehlermeldung will könnte error_get_last weiterhelfen).

Wie drücke ich dann aus ob es einen Fehler beim einlesen gab oder nicht? Also wie du gesagt hast : Wie weiß ich ob es erfolgreich war? Danke!
 
Ah, danke! Hatte mir die Seite durchgelesen, es aber offenbar irgendwie nicht richtig verstanden.
Daraus folgende Frage: Wenn ich hier mein if(inhalt===false){} habe, kann ich irgendwie in den geschweiften Klammern eine HTML-Seite unterbringen?
 
Zuletzt bearbeitet:
Ja, einfach die PHP-Sektion beenden:
PHP:
<?php
$inhalt = file_get_contents('beispiel.pdf');
if($inhalt === false) {
?>

Hier HTML für den Fehlerfall

<?php
}
?>
 
Je nach Größe der PDF-Datei ist die Zwischenspeicherung in einer Variable nicht die beste Option.

Edit: Man lese die Doku!
php.net zu fread hat gesagt.:
If you just want to get the contents of a file into a string, use file_get_contents() as it has much better performance than the code above.

php.net zu file_get_contents hat gesagt.:
file_get_contents() is the preferred way to read the contents of a file into a string. It will use memory mapping techniques if supported by your OS to enhance performance.

Wenn dein HTML-Code jedoch größer ist, empfehle ich aus Übersichtlichkeitsgründen jedoch ein require:

PHP:
$inhalt = file_get_contents('beispiel.pdf');
if($inhalt === false) {
  require('error_page.php');
  exit;
}
else {
  header("Content-Type: application/pdf;");
  echo $inhalt;  // Ich hoffe, das gibt den String auch chunk-weise aus.
}
 
Danke, hat funktioniert. Mein Code sieht jetzt so aus:
HTML:
<?php
$inhalt=file_get_contents("beispiel-fehler.pdf");//Das Dokument heißt beispiel.pdf; ich will nur einen Fehler verursachen um den Code zu testen
if($inhalt == true) {
header("Content-Type: application/pdf;");
echo $inhalt;}
else{
?>
<!DOCTYPE HTML>
<html lang= "de">
<head>
   <meta charset="utf-8">
</head>
<body>
   <h3>Der Fehler: </h3>
   <p><?php error_reporting(E_ALL);?></p>
   <!-- und so weiter...-->
</body>
</html>
<?php } ?>
Irgendwie ist die Code-Anzeige für kombinierten HTML- und PHP-Code seltsam.
Jetzt gibt er mir ZUERST den Fehler aus und DANN die ganze HTML-Seite; auch wenn ich den Code zwischen der Überschrift "Der Fehler: " und dem ganzen restlichen Code haben möchte. woran könnte das liegen? Wenn ich als Title <title><?php echo $variable1; ?> schreibe, funktioniert das einwandfrei; also ist nicht das PHP an sich komisch. Normaler PHP-Code wird an der richtigen Stelle ausgegeben (sowas wie << echo "Ich bin php!"; >>). Woran könnte das liegen?
 
<p><?php error_reporting(E_ALL);?></p>
Warum setzt du das error_reporting dort auf E_ALL? Fehler werden nicht gepuffert: Wenn vorher das error_reporting z. B. auf 0 war, ein Fehler auftrat und du dann das error_reporting wieder hoch setzt, wird überhaupt kein Fehler protokolliert.

Der Fehler, der bei dir ganz am Anfang ausgegeben wird, ist vom file_get_contents und wird nur deswegen ausgegeben, weil dein display_errors wohl auf 1 ist. In deiner Production Environment solltest du niemals diese Einstellung auf 1 haben, denn erstens werden sie unkontrolliert ausgegeben ("irgendwo" im HTML) und zweitens könnten sie wichtige Daten leaken.

Du kannst den Fehler wesentlich sauberer mit error_get_last differenziert behandeln.
 
-ich setze error_reporting auf E_ALL, weil ich dachte (?) dass so alle Fehler ausgegeben werden...
-Wenn ich aber display_errors auf null setze, wird da wo ich das will auch kein Fehler mehr ausgegeben; auch wenn ich error_get_last verwende.
-Noch etwas seltsames: Wenn ich den Rückgabewert von error_reporting ausgeben lasse (egal ob es auf E_ALL oder () steht), wird immer 22527 ausgegeben. Auch wenn gar kein Error da ist...

Ehm, noch ein Hinweis:
In deiner Production Environment solltest du niemals diese Einstellung auf 1 haben, denn erstens werden sie unkontrolliert ausgegeben ("irgendwo" im HTML) und zweitens könnten sie wichtige Daten leaken.Du kannst den Fehler wesentlich sauberer mit error_get_last differenziert behandeln.
Diese Level von Programierkenntnissen hat mich etwas verwirrt. Ich bin jetzt 10. Klasse und musste mit zwei Mitschülern für ein Schulprojekt eine webbasierte Datenbank zum öffnen von Dokumenten mit Suchmaske programmieren (3 wochenstunden, ein Vierteljahr lang). Dann habe ich noch eine Funktion zum öffnen dieser Dokumente hinzugefügt, und dafür brauche ich das hier. Verhältnismäßig sind wir schon sehr weit; die meisten haben die Verbindung website-Datenbank noch nicht hingekriegt, von Abfragen ganz zu schweigen. Ich weiß auch selbst, dass ich nicht so gut im strukturierten programmieren bin, meistens probiere ich irgendwelche Methoden aus dem internet aus; auch wenn ich sie nicht verstehe. An diesem Problem sitze ich schon ein paar Wochen, aber nächste Woche ist Abgabe, deshalb habe ich es ziemlich eilig.
bitte nicht übel nehmen, dass ich deshalb das Konzept hinter dem Kommentierten von dir nicht verstanden habe.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück