650 Stimmen

Wie kann ich nützliche Fehlermeldungen in PHP erhalten?

Oft versuche ich, ein PHP-Skript auszuführen, und erhalte nur einen leeren Bildschirm zurück. Keine Fehlermeldung, nur ein leerer Bildschirm. Die Ursache könnte ein einfacher Syntaxfehler (falsche Klammer, fehlendes Semikolon), ein fehlgeschlagener Funktionsaufruf oder etwas ganz anderes sein.

Es ist sehr schwierig, herauszufinden, was schief gelaufen ist. Am Ende muss ich Code auskommentieren, überall "echo"-Anweisungen eingeben usw., um das Problem einzugrenzen. Aber es muss doch einen besseren Weg geben, oder?

Gibt es eine Möglichkeit, PHP dazu zu bringen, eine nützliche Fehlermeldung auszugeben, wie es Java tut?

1 Stimmen

5 Stimmen

@JuannStrauss, Das ist noch untertrieben. Und wenn Sie schließlich siehe die Fehler, es heißt T_PAAMAYIM_NEKUDOTAYIM . Oder vielleicht "muss eine Instanz von integer sein, integer gegeben" .

2 Stimmen

5voto

Die "FEHLER" sind die nützlichsten Dinge für die Entwickler, um ihre Fehler zu erkennen und sie zu beheben, damit das System perfekt funktioniert.

PHP bietet einige der besseren Möglichkeiten, um die Entwickler wissen, warum und wo ihr Stück Code ist immer die Fehler, so dass durch die Kenntnis dieser Fehler Entwickler können ihren Code besser in vielerlei Hinsicht.

Am besten schreiben Sie die folgenden zwei Zeilen an den Anfang des Skripts, um alle Fehlermeldungen zu erhalten:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Eine weitere Möglichkeit zur Verwendung von Debugger-Tools wie xdebug in Ihrer IDE.

5voto

Daniel Sorichetti Punkte 1899

Um die vollständige Fehlerberichterstattung zu aktivieren, fügen Sie Folgendes zu Ihrem Skript hinzu:

error_reporting(E_ALL);

Dies führt dazu, dass selbst minimale Warnungen angezeigt werden. Und, nur für den Fall der Fälle:

ini_set('display_errors', '1');

Erzwingt die Anzeige von Fehlern. Dies sollte bei Produktionsservern ausgeschaltet werden, aber nicht, wenn Sie entwickeln.

0 Stimmen

Wie bei der Antwort von Tomalak funktioniert dies nicht bei Syntaxfehlern.

4voto

mario Punkte 141130

Diese Antwort wird Ihnen von der Abteilung für Entlassungen zur Verfügung gestellt.

  1. ini_set() / php.ini / .htaccess / .user.ini

    Die Einstellungen display_errors y error_reporting sind nun ausreichend behandelt worden. Aber nur zur Erinnerung: Wann ist welche Option zu verwenden?

    • ini_set() y error_reporting() gelten nur für Laufzeitfehler.
    • php.ini sollte in erster Linie für die Entwicklung von Setups bearbeitet werden. (Webserver- und CLI-Version haben oft unterschiedliche php.ini's)
    • .htaccess Flaggen funktionieren nur bei veralteten Installationen (Suchen Sie sich einen neuen Hoster! Gut verwaltete Server sind billiger.)
    • .user.ini sind partielle php.ini's für moderne Setups (FCGI/FPM)

    Und als grobe Alternative für Laufzeitfehler können Sie oft verwenden:

    set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
  2. error_get_last()

    Kann verwendet werden, um die letzte Laufzeitmeldung/Warnung/Fehler abzurufen, wenn error_display deaktiviert ist.

  3. $php_errormsg

    ist eine superlokale Variable, die auch die letzte PHP-Laufzeitmeldung enthält.

  4. isset() Hinfort!

    Ich weiß, dass dies viele Leute verärgern wird, aber isset y empty sollte no von Neueinsteigern genutzt werden. Sie können den Hinweis Unterdrückung hinzufügen nach Sie haben überprüft, ob Ihr Code funktioniert. Aber nie zuvor.

    Viele der "etwas funktioniert nicht"-Fragen, die wir in letzter Zeit bekommen, sind das Ergebnis von Tippfehlern wie:

    if(isset($_POST['sumbit']))
    #                  

    Sie werden keine nützlichen Hinweise erhalten, wenn Ihr Code mit einer Vielzahl von isset / empty / array_keys_exists . Es ist manchmal mehr sinnvoll zu nutzen @ so dass Hinweise und Warnungen zumindest in den Protokollen erscheinen.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    Um Warnungen zu erhalten für assert() Abschnitte. (Ziemlich unüblich, aber geübterer Code könnte einige enthalten.)

    PHP7 erfordert zend.assertions=1 auch in der php.ini.

  6. declare(strict_types=1);

    Die Umwandlung von PHP in eine streng typisierte Sprache wird nicht viele Logikfehler beheben, aber es ist definitiv eine Option für Debugging-Zwecke.

  7. PDO/MySQLi

    Und @Phil erwähnte bereits PDO/MySQLi-Fehlerberichte Optionen. Ähnliche Optionen gibt es natürlich auch für andere Datenbank-APIs.

  8. json_last_error() + json_last_error_msg

    Für JSON-Parsing.

  9. preg_last_error()

    Für regexen.

  10. CURLOPT_VERBOSE

    Um Curl-Anfragen zu debuggen, benötigen Sie mindestens CURLOPT_VERBOSE.

  11. shell/exec()

    Auch die Ausführung von Shell-Befehlen führt nicht von selbst zu Fehlern. Sie brauchen immer 2>&1 und schauen Sie sich die $errno an.

4voto

jmucchiello Punkte 18129

Abgesehen von error_reporting und der ini-Einstellung display_errors können Sie SYNTAX-Fehler aus den Protokolldateien Ihres Webservers abrufen. Wenn ich PHP entwickle, lade ich die Webserver-Protokolle meines Entwicklungssystems in meinen Editor. Wenn ich eine Seite teste und einen leeren Bildschirm erhalte, ist die Protokolldatei veraltet und mein Editor fragt, ob ich sie neu laden möchte. Wenn ich das tue, springe ich an das Ende der Datei, und dort steht der Syntaxfehler. Zum Beispiel:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9

4voto

Ayman Hourieh Punkte 122012

Sie können die vollständige Fehlerberichterstattung aktivieren (einschließlich Hinweisen und strengen Meldungen). Manche Leute finden das zu ausführlich, aber einen Versuch ist es wert. einstellen error_reporting a E_ALL | E_STRICT in Ihrer php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT benachrichtigt Sie über veraltete Funktionen und gibt Ihnen Empfehlungen für die besten Methoden zur Ausführung bestimmter Aufgaben.

Wenn Sie keine Benachrichtigungen wünschen, aber andere Nachrichtentypen hilfreich finden, versuchen Sie, Benachrichtigungen auszuschließen:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Stellen Sie außerdem sicher, dass display_errors in der Datei php.ini aktiviert ist. Wenn Ihre PHP-Version älter als 5.2.4 ist, setzen Sie sie auf On :

display_errors = "On"

Wenn Ihre Version 5.2.4 oder neuer ist, verwenden Sie:

display_errors = "stderr"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X