Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Fehlerbehandlung in PHP

  1. #1
    Kaiser(in)
    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard Fehlerbehandlung in PHP

    Da in letzter Zeit öfters Code von TS's gepostet wurde, der Fehlermeldungen ausgespuckt hat, zusammen mit der Frage, was falsch ist, habe ich dieses Tutorial erstellt. Kritik ist willkommen, aber bitte Konstruktiv.

    Fehlerbehandlung in PHP
    Um immer alle Fehler zu sehen, sollte man folgendes an den Anfang seiner PHP-Dateien setzen:
    PHP-Code:
    error_reporting(E_ALL);
    ini_set("display_errors""true"); 
    Hier werden evtl. viele NOTICE-Errors kommen. Daher sage ich zu denen auch noch was:
    Ein E_NOTICE kommt meistens durch Unstimmigkeiten im Programmcode zustande. z.B.:
    PHP-Code:
    <?php
    error_reporting
    (E_ALL);
    echo 
    $a*5;
    ?>
    Hier wird mit einer nicht-definierten variable gerechnet. Die Zählt PHP normalerweise als Null,
    aber wenn alle Errors an sind, erhält man eine Fehlermeldung.
    Notice: Undefined variable: a in foo.php on line 3
    Hier könnte z.B. eine falsch geschriebene Variable der Grund für ein falsches Ergebnis sein, für das man evtl. seine Rechnung verantwortlich macht.
    Der simpelste Fehler ist der Syntax-Error. Jedoch sind die Meldungen von PHP da nicht immer ganz eindeutig.
    Code:
    <?php
    echo "Hello World;
    ?>
    Das hier ergibt folgende Fehlermeldung:
    Parse error: syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /users/cptest/www/foo.php on line 3
    PHP sagt uns hier, das Script hört unerwarteterweise auf. Warum? da gibt es doch ein ?>.
    In PHP kann man beliebig viele Zeilenumbrüche in einen String packen. daher parst PHP den Code bis zum >, weil der String nicht geschlossen wurde. Aber beim > hört das Script auf und das ergibt die Fehlermeldung.
    PHP-Code:
    <?php
    echo "Hello World";
    ?>
    Hier parst PHP nur bis zum zweiten " und gibt den String aus, kein Fehler.

    Eine komplexere Form des Syntax-Errors wäre z.B. das hier:
    PHP-Code:
    <?php
    $foo
    ="DeFbArxYZ";
    if (
    strToLower(htmlspecialchars(mysql_real_escape_string(substr($_GET["bla"], 34))) == strToLower(substr($foo33))) {
     echo 
    "Ja";
    } else {
     echo 
    "Nein";
    }
    ?>
    Und hier verliert man leicht die Übersicht. Da hilft natürlich erstmal ein Editor mit Syntaxhighlighting, der die Klammern hervorhebt.
    Jedenfalls, PHP meckert hier:
    Parse error: syntax error, unexpected '{' in /users/cptest/www/foo.php on line 3
    Da hilft es, zumindest gedanklich die Bedingung auseinanderzunehmen, denn einfach irgendwo eine Klammer setzen macht keinen Sinn.
    PHP-Code:
    <?php
    $foo
    ="DeFbArxYZ";
    if
    (
    strToLower(
     
    htmlspecialchars(
      
    mysql_real_escape_string(
       
    substr(
        
    $_GET["bla"], 34
       
    )
      )
     )
    ==
    strToLower(
     
    substr(
      
    $foo33
     
    )
    )
    ) {
     echo 
    "Ja";
    } else {
     echo 
    "Nein";
    }
    ?>
    Und man erkennt ziemlich schnell, das strToLower im ersten teil der Bedingung nicht geschlossen ist.
    Btw: Wenn das script mit einer Datenbank verbunden ist, ist die Ausgabe: Nein

    Die Fehlermeldung des Typs "Warning" sind ähnlich zu behandeln, sie betreffen aber eher weniger den Code an sich. Ein typischer Fehler dieser Art ist dieser:
    Warning: Cannot modify header information - headers already sent by (output started at foo.php:3) in /users/cptest/www/foo.php on line 4
    Das tritt immer dann auf, wenn man bereits eine Ausgabe gemacht hat, und dann die Funktion header() benutzt. Hier hilft es, das Script von vorne durchzugehen und die erste Ausgabe zu suchen.
    Und weiter zum Tod jedes Scripts, zum Fatal-Error. Der kommt in den meisten Fällen bei Datenbankabfragen, daher nehme ich das im Beispiel.
    PHP-Code:
    <?php
    $db
    =new mysqli("localhost""user""password""datenbank");
    $query=$db->query("SELECT foo, blub, defg, FROM abc WHERE d='bar', m='D'");
    echo 
    "<table><thead><td>foo</td><td>blub</td><td>defg</td></thead>";
    while (
    $row=$query->fetch_array()) {
     echo 
    "<tr>";
     foreach (
    $row as $v) {
       echo 
    "<td>".$row."</td>";
     }
     echo 
    "</tr>";
    }
    echo 
    "</table>";
    $query->close();
    $db->close();
    // Ein meinem Fall existiert hier garkeine Datenbank, nur der Server ist online, d.h.,
    // bereits der Verbindungsversuch schlaegt schon fehl. Wuerde die Verbindung jedoch
    // klappen, wuerde das Script am falschen Query scheitern.
    ?>
    Das fuehrt zu einem Fatal-Error bei $query->fetch_array().
    Fatal error: Call to a member function fetch_array() on a non-object in /users/cptest/www/foo.php on line 5
    Da gibts 2 moeglichkeiten, das Problem zu loesen.
    1. Die mysql_* Funktionen benutzen und in diesem Fall nur ein Warning anstadt einem Error zu erhalten\
    2. Pruefen, ob das Query durchgegangen ist und nur dann fetch_array() aufrufen.

    Es ist wohl offensichtlich, dass hier 2. die bessere Idee ist.
    PHP-Code:
    <?php
    $db
    =new mysqli("localhost""user""passwort""datenbank");
    if (
    $query=$db->query("SELECT foo, blub, defg, FROM abc WHERE d='bar', m='D'")) {
     echo 
    "<table><thead><td>foo</td><td>blub</td><td>defg</td></thead>";
     while (
    $row=$query->fetch_array()) {
       echo 
    "<tr>";
       foreach (
    $row as $v) {
         echo 
    "<td>".$row."</td>";
       }
       echo 
    "</tr>";
     }
     echo 
    "</table>";
     
    $query->close();
    }
    $db->close();
    ?>
    Und damit kommen wir zum 3. Punkt, die Fehler bei SQL-Statements.
    Nun kommt schonmal keine Fehlermeldung mehr, aber wissen, wo das Problem steckt, weis man immernoch nicht. Dazu steht die variable $error im mysqli-Object bzw. die mysql_error() funktion bereit.
    Von den beiden erfahren wir naemlich immer, was gerade falsch lauft.
    Wenn man also von einer If-Abfrage erfaehrt, dass der Query fehlgeschlagen ist, dann immer
    PHP-Code:
    echo mysql_error();
    // b.z.w.
    echo $db->error
    EDIT:
    Hier empfiehlt es sich jedoch, um SQL-Injector Angreiffern das Leben schwerer zu machen, diese Funktion zu benutzen:
    PHP-Code:
    function logError($message) {
     if (
    $_SERVER["HOST_ADDR"]=="127.0.0.1") {
       
    // localhost, error ausgeben
       
    echo "FEHLER: ".$message."<br>";
     } else {
       
    // online, ins logfile
       
    file_put_contents(
         
    "errorlog.txt",
         
    file_get_contents("errorlog.txt").$message."\n"
       
    );
     }

    Im allgemeinen: Bitte ALLE Fehlermeldungen GENAU anschauen, mit dem Code abgleichen und dann verbesern
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!
    Geändert von Tobse (02.01.2011 um 05:05 Uhr)
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  2. #2
    Forum Guru Avatar von synaptic
    Registriert seit
    20.06.2007
    Ort
    Butzbach-Wiesental
    Beiträge
    10.901
    Danke
    45
    Bekam 48 mal "Danke" in 46 Postings
    Blog-Einträge
    1

    Standard AW: Fehlerbehandlung in PHP

    in memoriam banditum möchte ich noch des hier hinzufügen:
    Zitat Zitat von bandit600
    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    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).
    5. Schritt 3 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.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
    KEIN support via pn, email, messenger oder falsch geposteten threads
    Futter für deine Schnuffelzwerge gibts bei den Schnuffelzwergen TOP Qualität, also klicken und kaufen

  3. #3
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Fehlerbehandlung in PHP

    Zitat Zitat von Tobse Beitrag anzeigen
    Wenn man also von einer If-Abfrage erfaehrt, dass der Query fehlgeschlagen ist, dann immer
    PHP-Code:
    echo mysql_error();
    // b.z.w.
    echo $db->error
    Keine gute Idee, wenn man aus irgendeinem Grund eine Injection zulässt, bekommt ein Angreifer so das Tabellenformat wesentlich schneller raus…

    Außerdem sollte man sich auch um E_NOTICE kümmern, das sind echte Performance-Bremsen, auch wenn man sie ignoriert. Aus dem Grund auch das @ nur benutzen, wenn es keine andere Möglichkeit in PHP gibt.

    Auch gut zu gebrauchen:
    http://de3.php.net/manual/en/functio...or-handler.php
    http://firephp.org
    Geändert von The User (01.01.2011 um 13:42 Uhr)

  4. #4
    Prinz(essin) Avatar von -Bambino-
    Registriert seit
    21.12.2007
    Ort
    Berlin
    Beiträge
    865
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    4

    Standard AW: Fehlerbehandlung in PHP

    Das fachliche ist zwar größtenteils okay, aber wenn man so ein "Tutorial" vielen Leuten zugänglich machen will, dann achtet man doch auf Rechtschreibung, oder? Die ist bei dir unter aller Sau, es gibt kaum einen Satz an dem man beim lesen nicht hängen bleibt weil diverse Rechtschreibfehler drin sind.
    Das mindert den Wert dieses Tutorials massiv!
    wert.TeeeX.de
    Wie gut ist die technische Umsetztung deiner Website wirklich?
    Teste es!

  5. #5
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Fehlerbehandlung in PHP

    Also es sind da ein paar Rechtschreib- bzw Tippfehler, aber lange nicht in jedem Satz, bis auf die Groß-/Kleinschreibung und die Umlaute.

  6. #6
    Pion
    Gast

    Standard AW: Fehlerbehandlung in PHP

    Notice sollte man natürlich beachten, nicht nur wegen Performance, sie zeugen unteranderen von schlampigen Programmierstiel

    Klar sollte auch sein, dass Fehler nur in der Testumgebung/Localhost angezeigt werden sollten, in einer Liveumgebung werden alle Fehler unterdrückt (auch Notices) und werden in Logdaten geschrieben.

    Mittels einer einfachen IF könnte man oben das Reporting umschalten

    mfg

  7. #7
    Unregistriert
    Gast

    Standard AW: Fehlerbehandlung in PHP

    Was mir jetzt aber neu ist, dass es nur 3 Fehlermeldungen gibt.

    Nicht böse gemeint, aber diesen Beitrag "Tutorial" zu nennen, ist heftig überzogen.

  8. #8
    Kaiser(in)
    Themenstarter

    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: Fehlerbehandlung in PHP

    Zitat Zitat von Unregistriert Beitrag anzeigen
    Was mir jetzt aber neu ist, dass es nur 3 Fehlermeldungen gibt.

    Nicht böse gemeint, aber diesen Beitrag "Tutorial" zu nennen, ist heftig überzogen.
    Nein, natuerlich gibt es mehr. Aber ein E_NOTICE zu falsch zu bearbeiten ist recht schwierig.
    Zitat Zitat von The User Beitrag anzeigen
    Keine gute Idee, wenn man aus irgendeinem Grund eine Injection zulässt, bekommt ein Angreifer so das Tabellenformat wesentlich schneller raus…
    Oh, danke das dus sagst. Ich editier den Post gleich und fuege noch was an.
    Zitat Zitat von The User Beitrag anzeigen
    Außerdem sollte man sich auch um E_NOTICE kümmern, das sind echte Performance-Bremsen, auch wenn man sie ignoriert. Aus dem Grund auch das @ nur benutzen, wenn es keine andere Möglichkeit in PHP gibt.
    Im ersten Code-Tag steht doch im kommentar, dass durch E_ALL viel Zeugs durchkommt, dass man in der Live-Version nicht brauchen kann und daher auf jeden fall unterdruecken sollte, aber beim Programmieren und Debuggen unbedingt beachten muss. E_NOTICE sind meistens wichtige dinge, ja, auch auf den Programmierstil bezogen wie "undefined Variable".

    THX fuer das gute Feedback.

    @Unregistriert: Ja, ich uebe noch, ich versuchs aber noch zu verbessern
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  9. #9
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Fehlerbehandlung in PHP

    @Pion
    Naja, manchmal kanns sein, dass die Notice echt nicht schlimm ist und genau das passiert, was man haben will, dann sollte man sich die Mühe wegen der Performance machen…

    @Tobse
    Höh? E_NOTICE nicht im Live-Betrieb und den Rest schon??

  10. #10
    Kaiser(in)
    Themenstarter

    Registriert seit
    29.03.2009
    Ort
    1011 1111 1011 WorldWideWeb
    Beiträge
    2.439
    Danke
    2
    Bekam 6 mal "Danke" in 6 Postings

    Standard AW: Fehlerbehandlung in PHP

    Wenn im Live betrieb was anderes kommt ausser E_NOTICE dann stimmt was nicht und gehoert verbessert, evtl gibts da ein Paar ausnahmen, aber genau dafuer ist ja das @ da
    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.
    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

Ähnliche Themen

  1. php: fehlerbehandlung...
    Von baloo im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 3
    Letzter Beitrag: 12.01.2005, 09:57

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •