Error ausgeben readfile

-ich setze error_reporting auf E_ALL, weil ich dachte (?) dass so alle Fehler ausgegeben werden...
Soweit ich das noch von damals weiß, denn in den letzten Jahren habe ich selbst kein PHP mehr benutzt, bezieht sich error_reporting nur darauf, ob Fehler zum Protokollieren oder Anzeigen weitergereicht werden. Nur wenn das Error Reporting E_NOTICE z. B. umfasst, wird dieser Fehler auch in die Fehlerlogdatei geschrieben. Aber nur wenn zusätzlich Display Errors auf 1 gesetzt ist, wird dieser Fehler auch auf der Standardausgabe (d. h. bei dir an den Browser) weitergereicht.

-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.
Wie hast du error_get_last verwendet?

PHP:
$inhalt = file_get_contents('beispiel.pdf');
if ($inhalt === false) {
  $lastError = error_get_last();
  // $lastError weiterverarbeiten, siehe Doku zu error_get_last, was da genau drinsteht
}

-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.
Das wichtigste Hilfsmittel eines Programmierers ist neben der IDE die API-Dokumentation ;) Auf http://php.net/manual/en/function.error-reporting.php steht, was der Rückgabewert bedeutet.

meistens probiere ich irgendwelche Methoden aus dem internet aus; auch wenn ich sie nicht verstehe
Schade :( Hast du dann meist Fragen zu den verwendeten Funktionen oder zum Aufbau/zur Logik des Codes? Bei Ersterem kann ich dir nur empfehlen, die Funktion auf php.net und (als Zweitquelle) im Internet allgemein danach zu suchen. Falls zur Logik des Codes: Da hilft es meist, eine andere Person zu fragen, falls du eine hast, die dir dabei helfen könnte. Wenn du solch eine Person nicht hast, kannst du auch gerne hier fragen ;)

bitte nicht übel nehmen, dass ich deshalb das Konzept hinter dem Kommentierten von dir nicht verstanden habe.
Anders formuliert: Wer bei seiner Fehlerausgabe auf Display Errors setzt, macht etwas grundlegend falsch. So macht man das nicht.
 
-
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=error_get_last(); echo $error;?></p>
<!-- und so weiter... -->
</body>
</html>
<?php } ?>
Jetzt gibt er mir aus: vor dem HTML-Teil eine Warnung "No such file or directory found" (war klar wenn ich zum testen den falschen Pfad angebe) und zwischen "Der Fehler: " und dem Rest
Notice: Array to string conversion in *********Dateipfad************* on line ***Das was hier line 15 ist***
Array
-In die Dokumentation habe ich geschaut, da stand: "If the optional level is not set, error_reporting() will just return the current error reporting level." 22527 ist keines dieser level.
-Na ja, beides etwas Meistens sind das eher die konkreten Funktionen, im Unterricht haben wirklich nur Grundlegendes behandelt. Aber auch generell aufbau/Logik des Codes. So als Beispiel. Ich habe einige Zeit gebraucht um das mit externen CSS-Klassen wirklich zu verstehen und konsequent anzuwenden, im Februar habe ich noch den Margin bei jedem Formularfeld einzeln auf 25px gesetzt... Oder für die Verbindung zur DB verwende ich PDO, also Data objects. Aber ich kann mir nichts wirklich darunter vorstellen was das heißt, dass meine Datenbankverbindung in einem Objekt gespeichert ist. Dieses Objekt ist für mich nur irgendein abstraktes etwas, das das Resultat liefert, welches ich will - worüber ich heilfroh bin. Ich habe mehr als einen Monat gebraucht, bis das ging. Oder bei der suchmaske. ich wollte sie Zentrieren und habe deshalb nach endlosen Versuchen eine flexbox verwendet. Das ist ein Kasten, der nur so breit ist wie das darin enthaltene und den man zentrieren kann (im gegensatz zum Such-Button allein)- soweit ich weiß. Dann habe ich einen befreundeten Informatikstudent gefragt ob er sich den Code mal ansieht, und er war ziemlich verwirrt. Er meinte: "Flexboxen haben da gar nichts zu suchen, das geht auch so; und du hast vieles auf mehrere Arten an verschiedenen Stellen vom Code einstellen wollen, das blockiert sich öfter. Das zentrieren wolltest du drei mal mit verschiedenen Befehlen erreichen..."
-Das mit den display errors: gut, dann nicht. Wie erreiche ich mein ziel "richtig"?

Ähhh... blickt jetzt noch jemand durch?
 
Zuletzt bearbeitet:
Kurz zu deinem ersten Punkt:

-In die Dokumentation habe ich geschaut, da stand: "If the optional level is not set, error_reporting() will just return the current error reporting level." 22527 ist keines dieser level.
Ah, okay, dazu muss man wissen, dass Bitmasken verwendet werden. Angenommen ich habe zwei Fehlerstufen E_A und E_B und möchte die aktuell gesetzte Fehlerstufenkombination als einen einzelnen Wert ausdrücken, dann geht das z. B., indem ich E_A = 1 und E_B = 10 nehme und die Kombination mit (E_A + E_B) = 11 (dezimal!) ausdrücke. Dasselbe lässt sich mit Binärwerten tun. Wenn du 22527 in Binärdarstellung wandelst (siehe Internet für Tools), dann ist es eine Addition (= Veroderung auch) mehrerer Fehlerstufen von hier: http://php.net/manual/en/errorfunc.constants.php

Deinen zweiten Punkt les ich morgen oder es tut jemand anderes heute noch ;)
 
Und weißt du wieso ich jetzt außerdem noch dieses Notice zu dem Array kriege?
Ja, weil echo einen String haben möchte, du ihm aber ein Array gibst. Dann wird das zwar implizit konvertiert, aber trotzdem bekommst du einen E_NOTICE.
Mach lieber Folgendes:
PHP:
// Komplette Fehlermeldung inkl. Datei und Zeile
var_dump($error);

// Nur die Fehlernachricht (etwa No such file or directory found)
echo $error['message'];

(In dieser Fassung ist es von außen betrachtet nicht unbedingt besser als Display Errors auf 1, aber immerhin behälst du dir jetzt die Flexibilität $error nach dem Fehlercode zu durchsuchen, etwa wenn dieser etwa 12345 ist, dann gibst du "Datei nicht gefunden" aus, sonst gibst du "Interner Fehler" aus.)

Dieses Objekt ist für mich nur irgendein abstraktes etwas, das das Resultat liefert, welches ich will
Keine Sorge, am Anfang kann sowas durchaus abstrakt sein ;) Irgendwann begreift man, wie dieses Objekt real auf einen der Hauptspeicher-Riegel im PC abgebildet wird. Konkreter als das wird es wohl nicht, aber ich bezweifle, dass das bei Datenbankobjekten überhaupt relevant ist :p Manchmal hilft Abstraktion, indem man lästige Implementierungsdetails ignoriert.
 
Jetzt macht er was ich will, aber ich blicke gar nicht mehr durch wieso... #
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
error_reporting(0);
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 echo $error['message']." in document ".$error['file'];?></p>
<br />
<h3>Fehlerbehebungsmaßnahmen</h3>
</body>
</html>
<?php } ?>
Und nochwas, du sagtest man solle nicht die kompletten Fehlermeldungen ausgeben lassen. diese Seite ist für ein Schulprojekt, theoretisch gibt es da einen realen Kunden, aber ich denke nicht dass die es nehmen. sie haben uns nur die Arbeit abgenommen uns Inhalt für die Datenbank auszudenken ;). Das heißt so eine Fehlerbehebungsseite wie die im Anhang sollte ich wohl nicht machen, was wäre evtl. eine bessere Idee? Einige Sachen sind geschwärzt (in dem Fall "geweißt") weil ich eher nicht denke dass ich die ins Internet stellen sollte; wir dürfen auch nicht mit den echten Dokumenten arbeiten wegen dem Betriebsgeheimnis und deshalb... Für die eventuelle Zielgruppe (die Mitarbeiter) wäre es aber total okay.
fehlerbehebung.png
Also Fazit: Es funktioniert, aber ich würde das Thema noch nicht als gelöst markieren; ich wüsste nämlich noch gerne wieso es denn jetzt funktioniert... Außerdem ist da noch die Frage nach der prinzipiellen Klugheit dieser Website.
 
Zuletzt bearbeitet:
@file_get_contents("beispiel-fehler.pdf");
Warum nutzt du den Fehlerunterdrückungsoperator (@) hier? Der unterdrückt, dass der Fehler protokolliert wird, jedoch nicht, dass error_get_last() ihn zurückgibt.

error_reporting(0);
Warum diese Zeile? Der Fehler von file_get_contents tritt sowieso vor dieser Zeile auf. Und auch wenn du die Zeile davor schreiben würdest, sehe ich leider nicht den Sinn darin. Normalerweise solltest du immer error_reporting(E_ALL) und Display Errors auf Off in jedem Skript am Anfang (oder noch besser: in der php.ini) haben.

Hier das Skript mit obigen Vorschlägen:
HTML:
<?php
ini_set('display_errors', '0');
error_reporting(E_ALL);


$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 echo $error['message']." in document ".$error['file'];?></p>
<br />
<h3>Fehlerbehebungsmaßnahmen</h3>
</body>
</html>
<?php } ?>

ich wüsste nämlich noch gerne wieso es denn jetzt funktioniert
Versuch mal, das Skript Zeile für Zeile nachzuvollziehen. An welcher Zeile scheitert es denn?

Das heißt so eine Fehlerbehebungsseite wie die im Anhang sollte ich wohl nicht machen, was wäre evtl. eine bessere Idee?
Die relevanten Fehlercodes (z. B. für "Permission denied" und "No such file or directory") raussuchen - von mir aus über Trial & Error, indem du bewusst die Fehler erzeugst und mit error_get_last den Fehlercode dir ausgeben lässt - und diese explizit abfangen. Dann kannst du deine eigene Nachricht dem Benutzer anzeigen und zwar ohne sensible Informationen wie den Dateipfad.
 
Na ja, es war nicht so dass ich irgendeinen Code verwendet hatte und es dann ging, es war eher so "ich habe deine Vorschläge berücksichtigt und dann ging es zuerst immer noch nicht, dann aber plötzlich doch". Ich glaube das hängt auch mit deinen Vorschlägen von gerade eben zusammen. Mit denen geht es aber immer noch, das ist doch schonmal gut.
Warum nutzt du den Fehlerunterdrückungsoperator (@) hier? Der unterdrückt, dass der Fehler protokolliert wird, jedoch nicht, dass error_get_last() ihn zurückgibt.
Warum diese Zeile? Der Fehler von file_get_contents tritt sowieso vor dieser Zeile auf.
Ich denke mal, das war wieder einmal das schon bekannte doppelt-und dreifachlösen von Problemen mittels verschiedener Befehle...
Die relevanten Fehlercodes (z. B. für "Permission denied" und "No such file or directory") raussuchen - von mir aus über Trial & Error, indem du bewusst die Fehler erzeugst und mit error_get_last den Fehlercode dir ausgeben lässt
Geht nicht, habe ich schon oft probiert. Da kommt immer entweder das schon bekannte 22527 oder irgendein nerviges Notice. sonst ist die Idee gut.
 
OK. Ansonsten habe ich gerade nochwas zu deinem vorherigen Beitrag in meiner Antwort ergänzt.
PHP:
$inhalt=file_get_contents("beispiel-fehler.pdf");
$error=error_get_last();
echo $error['message'];
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"

EDIT: mit dem Code von Ideone sagt er
"array(4) { ["type"]=> int(2) ["message"]=> string(123) "file_get_contents(C:\Users\KinderDesktop\BAD\1008BADD0-MDA00010001-A.pdf): failed to open stream: No such file or directory" ["file"]=> string(43) "C:\xampp\htdocs\website1903\downloadpdf.php" ["line"]=> int(7) }"
PHP:
$inhalt=file_get_contents("beispiel-fehler.pdf);
var_dump(error_get_last());
error_reporting(0);

Noch ein Edit: :glühbirne-geht-an: Achso! das heißt ich soll dieses Array dazu bringen dass er mir sagt welcher Typ es ist und je nach dem dann was ausgeben lassen... aber wie mache ich das?
 
Zuletzt bearbeitet:
Zurück