Martin Hein: ini_set('display_errors', 1);

Hallo Forum,

ich arbeite an einer PHP-Site, auf der Code einer externen
Applikation eingebunden ist. Ein Blackbox für mich, an die
ich weder per FTP komme, noch sie verstehen würde.

Folgendes Problem:
------------------
#1 <?
#2 $meine_php_logik = "was auch immer";
#3 include '/blackbox';
#4 ?>

wenn ich VOR Zeile 3 folgenden Code:

ini_set('display_errors', 1);
echo provoziere_fehler();

... einfüge, wird der provoziere Fehler ausgegeben.
Hinter Zeile 3 wird kein Fehler mehr ausgegeben,
obwohl ich explizit 'display_errors' auf 1 gesetzt
habe. Ich weiss "aus sicherer Quelle", dass diese
Fehler in irgendeinem 'monitoring' auftauchen.

Ich schliesse daraus, dass 'ini_set('display_errors', 1)'
wohl wirkt, aber irgendetwas dafür sorgt, dass die
errors nicht am Bildschirm ausgegeben werden, was vielleicht
der default ist, sondern woanders.

Oder bin ich auf dem Holzweg ?

danke und

beste gruesse,
martin

  1. echo $begrüßung;

    ich arbeite an einer PHP-Site, auf der Code einer externen Applikation eingebunden ist.

    Welcher Art ist dieser Code denn? Vermutlich ist es kein PHP-Code, den dir der Server zurückliefert. Das würde das Ausbleiben der Fehlermeldung erklären, denn das was du nicht ausführst kann auch keine Fehler erzeugen.

    #3 include '/blackbox';

    Ist das in echt auch wie ein Dateizugriff ausgeführt oder steht da eher was wie include 'http://example.com/blackbox';
    Wenn das die zweite Form ist, gib die Adresse in einen Browser ein und schau dir den Quelltext an. Wenn du HTML-Code sieht: siehe oben. Wenn du PHP-Code siehst, dann lass dir nach dem include mal phpinfo() ausgeben und schau, ob display_errors oder error_reporting geändert wurden.

    echo "$verabschiedung $name";

    1. konkret sieht das so aus:
      -------------------------

      #01 <?php
      #02 define('IGS_COMPANY_DIRECTORY', '/kundenverzeichnis');
      #03 if (is_readable('/srv/www/igs-test/init.inc.php'))
      #04   {
      #05    $ipath = '/srv/www/igs-test';
      #06    define('IGS_URL_BASE', '/igs-test');
      #07   }
      #08 else
      #09     {
      #10      $ipath = '../../igs-test';
      #11      define('IGS_URL_BASE', '/igs-test/html');
      #12     }
      #13 ini_set('display_errors', 1);
      #14 @include($ipath . '/init.inc.php');
      #15
      #18
      #19 ?>
      #20
      #21 <?
      #22 //--built 07-----------------------------//
      #23 //--by    martin hein              ------//
      #24
      #25 include "includes/igs_config.inc.php";
      #26 include $_content."includes/functions/global.inc.php";

      ... das ist die Datei, die als 'Seite' im Browser aufgerufen wird
      und eine Ausgabe erzeugt. Die Zeilen #01-#19 sind meine Blackbox.
      #21-#26 ist mein Code. Der geht dann natürlich noch weiter. Spielt
      aber für mein Problem keine Rolle.

      Mein Problem ist, dass in meinem Code ein Fehler steckt, den
      ich gerne debuggen würde, was schwierig ist, denn der Fehler
      wird für mich ja nicht sichtbar. Klar geht es auch ohne
      Fehlermeldung. Ist aber mühsamer.

      Meine Versuche:
      ---------------

      In der php.ini ist 'display_errors' auf 'off'. Mit
      'ini_set('display_errors', 1)' lässt sich das
      überschreiben. Meint Test:

      ini_set('display_errors', 1);
      mysql($db1Name, $path_SelStatm);

      ... zwischen #2 und #3 führt zu einer Fehlerausgabe.
      Füge ich die Zeilen nach zwischen #15 und #18 ein,
      wird kein Fehler ausgegeben.

      Weil ich auf die includierter Datei '/srv/www/igs-test/init.inc.php'
      nicht per FTP zugreifen kann, habe ich sie per 'copy()' geholt und
      angesehen. Abgesehen davon dass ich den komplexer Code, nicht auf Anhieb verstehe, werden darin 1. weitere Datein includiert und 2.
      werde ich den Code auch nicht ändern können.

      Ich muss also davon ausgehen, dass irgendeine (php-)Anweisung
      in dieser Datei dafür sorgt, dass die Fehlerausgabe nicht auf
      dem Bildschrim stattfindet, sondern wo anders, damit ich ab #24
      dafür sorgen kann, dass sie wieder am Bildschirm stattfindet.

      was kann das sein ?

      beste gruesse,
      martin

      1. echo $begrüßung;

        Mein Problem ist, dass in meinem Code ein Fehler steckt, den
        ich gerne debuggen würde, was schwierig ist, denn der Fehler
        wird für mich ja nicht sichtbar. Klar geht es auch ohne
        Fehlermeldung. Ist aber mühsamer.

        Ja, Debugging ist oft ein mühsamer Weg. Doch es hilft nichts, man muss ihn gehen.

        Füge ich die Zeilen nach zwischen #15 und #18 ein, wird kein Fehler ausgegeben.

        Füge in Zeile 15 ein

        die('test');

        ein (der Test-Text muss ein Text sein, keine Zahl). Wenn das Script nicht an dieser Stelle mit Ausgabe dieses Textes stirbt, dann ist es bereits eher verendet. Schau auch mal in den Quelltext der angezeigten Seite, nicht dass da aufgrund unfertiger HTML-Elemente die Ausgabe nicht erscheint.

        Du kannst auch versuchen, die die()-Zeile immer weiter nach hinten zu verschieben. Wenn der Text irgendwann nicht mehr auftaucht, bist du dem Fehler nahe.

        Hattest du eigentlich mal phpinfo() in Zeile 15 verwendet und geschaut, ob deine ini-Änderungen noch aktiv sind?

        echo "$verabschiedung $name";