Suchen
Inside Wiki
Nützliche Links
phpforum.de Tipp
 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Debuggen

 

Tutorials - Inhalte

Was tun, wenn ein Skript nicht das macht, was man von ihm erwartet?



Hier ein paar Tipps:
  1. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  2. An den Anfang des Scriptes schreibt man:
    PHP Quellcode:
    // PHP <= 4 und PHP >= 6
    error_reporting( E_ALL );
    // PHP 5.x
    error_reporting( E_ALL | E_STRICT );
    ini_set('display_errors', TRUE);

    Tipp:
    Um alle Error Schalter zu erwischen, auch die zukünftigen, schreiben wir:
    PHP Quellcode:
    error_reporting( -1 );
    ini_set('display_errors', TRUE);

    In der integer binär Darstellung sind bei -1 alle Bits gesetzt. Damit sind auch alle E_* aktiviert. Das funktioniert mit allen PHP Versionen.
  3. Fehler bei externen Programmen/Bibliotheken wie z.B. MySQL bleiben PHP verborgen. Hier muss man sich die Fehlermeldungen selbst abholen:
    PHP Quellcode:
    $result = mysqli_query($link, $sql) or die(mysqli_error($link));

    Die "mysqli_error" sollten alle wieder entfernt werden bevor die Website online geht,
    damit der User nicht plötzlich mysqli-Fehlermeldungen zu sehen bekommt und damit eventuelle Angreifer keine Rückschlüsse auf die DB-Struktur ziehen können.

    Damit man nicht alle "mysqli_error" suchen und entfernen muß
    kann man auch einfach die Funktion trigger_error verwenden, wie z.B.:
    PHP Quellcode:
    $result = mysqli_query($link, $sql)
      or trigger_error('mySQL-Fehler in Query "' . $sql . '": ' . mysqli_error($link), E_USER_ERROR);


    Auf Produktionsservern konfiguriert man PHPs error-reporting normalerweise so, dass Fehler nicht angezeigt, sondern nur geloggt werden. Das hat dann zur Folge, dass die obige Fehlermeldung nur angezeigt wird, wenn wir wirklich auf unserem Entwicklungsserver arbeiten.

    Auch Fehler bei Dateiuploads müssen abgeholt werden:
    PHP Quellcode:
    if ($_FILES['datei']['error'] != UPLOAD_ERR_OK) {
        echo 'Upload Fehlernummer: ' . $_FILES['datei']['error'];
    }

    Gleiches gilt z.B. auch für die IMAP- und die LDAP-Extension, sowie die meisten Datenbankzugriffslayer. Als Daumenregel kann man sagen, dass bei einem Großteil der Extensions, die Zugriff auf fremde Systeme erlauben, Fehlermeldung mittels geeigneter Funktionen abgeholt werden müssen.
  4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    Die Ausgaben per echo oder für Variableninhalte besser noch var_dump()/var_export() kann man sich ersparen, in dem man einen Debugger benutzt.

    Für die Überprüfung von Variablen könnten diese Funktion hilfreich sein:
    PHP Quellcode:
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE); // evtl. hilfreich


    function printGlobals()
    {
        $globals = array( 'POST',
                          'GET',
                          'SESSION',
                          'COOKIE',
                          'SERVER',
                      //  'REQUEST',
                          'ENV',
                          'FILES',
                        );
                       
        foreach($globals as $name)
        {
          if(isset($GLOBALS["_$name"]))
          {
            echo "<strong>\$_$name = </strong><br />";
            echo '<pre>';
            var_export($GLOBALS["_$name"]);
            echo ';</pre><br />';
          }
        }
    }

    // testcode
    printGlobals();

    ?>


  5. Schritt 4 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen.
  6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.

Es kommt aber trotzdem keine Fehlermeldung!


Manchmal kann es vorkommen, dass display_errors auf dem kompletten Server auf off steht. Dann werden selbst Parse Errors nicht angezeigt. Die Folge davon ist, dass sämtliche Debuggmechanismen(z.B. error_reporting()) nicht greifen, weil sie erst gar nicht ausgeführt werden. Als Abhilfe kann man display_errors in der php.ini auf on schalten oder besser, eine .htaccess Datei erstellen und sie auf den Webserver laden. Die Datei sollte folgenden Inhalt haben:
Code:
php_flag display_errors On
#Für php 5
php_value error_reporting 2048
#Für php 4
php_value error_reporting 2047


ALternativ kannst Du auch eine zweite .php Datei anlegen, in der Du die Einstellungen machst
und deine eigentliche Datei mit include() einbindest.
PHP Quellcode:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('log_errors', false);

include 'eigentliche_datei.php';
?>


Tipp:
@ unterdrückt Fehlermeldungen!
Wenn du die Meldungen sehen möchtest, dann nimm die @ aus deinem PHP Code raus.



Nach dem Debuggen


Bevor man das Skript auf den Produktionsserver lädt, sollte man error_reporting herunterfahren, die Fehlerausgabe mit display_errors abschalten und die "or die(mysqli_error($link))" Zusätze sowie alle anderen Debug-Statements entfernen. Die Fans eurer Sites wollen schliesslich keine Debug-Infos lesen! Vielleicht noch schlimmer: Angreifer werden Debug-Infos gegen euch verwenden! Also bitte nach dem Debuggen aufräumen.

« Vorheriges Kapitel   Tutorials
  Nächstes Kapitel »

Erstellt von Gary, 20.01.2008 am 18:44
Zuletzt bearbeitet von hellbringer, 13.05.2016 am 22:23
10 Kommentare , 30981 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
debuggen, error, error_reporting, tutorial

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Debuggen PHP_Anfänger Editoren & Entwicklungsumgebungen 2 11.10.2007 15:32
php debuggen tupan07 PHP 2 12.04.2007 14:04
Debuggen in PHPEclipse titan3003 Editoren & Entwicklungsumgebungen 6 08.03.2007 22:33
Debuggen mit PHPEdit 2.8 StefanJ Editoren & Entwicklungsumgebungen 5 21.11.2006 23:24
debuggen mit DBG Philipp PHP 0 01.01.1970 01:00


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:46 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC