Entfernen Sie Warnmeldungen in PHP

Antworten:

349

Sie sollten wirklich alles beheben, was die Warnung verursacht, aber Sie können die Sichtbarkeit von Fehlern mit steuern error_reporting(). Um Warnmeldungen zu überspringen, können Sie Folgendes verwenden:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
quelle
53
E_ALL ^ E_WARNINGDie Aktivierung aller Fehlerberichte außer Warnungen scheint eine bessere Wahl für das Argument zu sein error_reporting.
Mark Amery
1
Im Allgemeinen stimme ich zu, in meinem Fall war das Generieren der Warnmeldung beabsichtigtes Verhalten, da es Teil meiner Komponententests war.
pgee70
120

Sie können ein @ vor Ihren Funktionsaufruf setzen, um alle Fehlermeldungen zu unterdrücken.

@yourFunctionHere();
PetPaulsen
quelle
4
Dies verbirgt nur den Fehler, es passiert immer noch. Durch Fehler wird PHP langsamer, daher ist es am besten, den Fehler zu beheben, wenn dies überhaupt möglich ist. Die Verwendung von @ verlangsamt sogar den Code, wenn kein Fehler vorliegt. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Manchmal (leider) haben Sie wirklich keine Wahl. Beispielsweise generiert die PHP-Funktion parse_url () Warnungen für "stark fehlerhafte" URLs - was wohl ein Fehler ist, da die Funktion in diesem Fall false zurückgibt. Sie müssen diese PHP-Warnungen entweder in Ihrer Programmausgabe tolerieren (für Parser- / Validator-Anwendungen möglicherweise nicht akzeptabel), die Warnungen irgendwie unterdrücken oder das fehlerhafte PHP-Verhalten umgehen, indem Sie Ihren eigenen Parser / Validator für URLs schreiben. In diesem Fall wähle ich das @.
Peter
1
WICHTIG: Verwenden Sie diese Methode, wenn (1) Sie das Problem, das die Warnung generiert, nicht beheben oder (2) Ihre Warnungen über PHP error_reporting vor Endbenutzern verbergen können ... Das Ausblenden von Warnungen vor Ihren Entwicklern ist KEINE Lösung.
Joshua Kissoon
3
Lassen Sie mich erklären, warum dies kritisch ist. Einige Funktionen wie dns_get_recordwerden Warnungen auslösen. Ihr Code kann die Warnung kompensieren, wirft sie aber trotzdem aus. Das Deaktivieren der Fehlerberichterstattung funktioniert auf dem Produktionsserver, jedoch nicht auf dem Entwicklungsserver. Wenn Sie XML-Inhalte generieren, wird der Browser durch die Warnung nicht gerendert, da der Server aufgrund der Warnung fehlerhaftes XML sendet. Manchmal möchten Sie dies bei der Entwicklung, aber nicht für etwas, das durch einen vorübergehenden DNS-Suchfehler verursacht wird, den Sie bereits kompensieren.
Alice Wonder
2
Lassen Sie mich erklären, warum dies nützlich ist, wenn Sie anstelle aller Warnmeldungen die Warnung als Fehler behandeln und Ihre eigene Fehlermeldung generieren möchten
Daniel N.
43

So unterdrücken Sie Warnungen, während alle anderen Fehlerberichte aktiviert bleiben:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
quelle
28

Wenn Sie keine Warnungen sowie Fehler anzeigen möchten, verwenden Sie

// Turn off all error reporting
error_reporting(0);

Fehlerberichterstattung - PHP-Handbuch

mohan.gade
quelle
18

Wenn Sie die Warnungen und einige andere Fehlertypen (z. B. Hinweise) unterdrücken möchten, während Sie alle anderen Fehler anzeigen, haben Sie folgende Möglichkeiten:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
quelle
15

Um die Warnmeldung in Core Php auszublenden, setzen Sie error_reporting (0) oben auf die allgemeine Include-Datei oder einzelne Datei.

Fügen Sie in Wordpress Warnungen und Hinweise ausblenden folgenden Code in die Datei wp-config.php ein

ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Vijay Lathiya
quelle
Dies ist die beste Lösung, wenn es darum geht, Protokolle in Wordpress auszublenden. Danke dir!!
Neo Morina
10

Die Frage nicht genau beantworten, aber ich denke, dies ist in einigen Situationen ein besserer Kompromiss:

Ich hatte eine Warnmeldung als Ergebnis einer printf () - Anweisung in einer Bibliothek eines Drittanbieters. Ich wusste genau, was die Ursache war - eine vorübergehende Umgehung, während die Drittanbieter ihren Code reparierten. Ich bin damit einverstanden, dass Warnungen nicht unterdrückt werden sollten, aber ich konnte meine Arbeit einem Kunden nicht demonstrieren, wenn die Warnmeldung auf dem Bildschirm angezeigt wurde. Meine Lösung:

printf('<div style="display:none">');
    ...Third-party stuff here...
printf('</div>');

Die Warnung war noch in der Seitenquelle als Erinnerung für mich, aber für den Kunden unsichtbar.

DaveWalley
quelle
5
Persönlich würde ich ob_start()und ob_end_clean()stattdessen verwenden. Auf diese Weise wird das Zeug nicht einmal an den Browser gesendet (was hier der Fall ist).
H2ooooooo
6
Deshalb habe ich "einige Situationen", "Warnungen sollten nicht unterdrückt werden" und "Erinnerung an mich" aufgenommen.
DaveWalley
1
Bevor Sie mich weiter abstimmen, lesen Sie bitte meine Antwort. Beachten Sie "Drittanbieter", "Kompromiss" und den obigen Kommentar. Ich habe diese Antwort hinzugefügt, falls sich jemand anderes in der gleichen Situation befindet, in der ich mich befand, und in dieser speziellen Situation hat mich dies gerettet, während alle anderen Antworten nicht so gut gewesen wären. Das nächste Mal werde ich zweimal darüber nachdenken, hilfreich zu sein.
DaveWalley
Vielen Dank, dass Sie diese brillante Idee nicht entfernt haben. Auf meinem System speichere ich alle Fehler und Warnungen, die von den Clients zurückgesendet wurden. Wenn sich ein Administrator anmeldet, werden sie sofort über solche Aktivitäten informiert, damit sie die Wartungsmannschaft informieren können. Die Seite ist für Lernspiele gedacht, daher ist es kein Problem, wenn etwa eine Stunde lang etwas schief geht.
Cneeds
8

Ich mache es wie folgt in meiner php.ini :

error_reporting = E_ALL & ~E_WARNING  & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Dies protokolliert nur schwerwiegende Fehler und keine Warnungen.

navid
quelle
7

Ich denke, dass eine bessere Lösung die Konfiguration von .htaccess ist. Auf diese Weise müssen Sie den Anwendungscode nicht ändern. Hier sind Anweisungen für Apache2

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
Sebastian Piskorski
quelle
7

Sie können die Warnung mit error_reporting unterdrücken aber der viel bessere Weg ist, Ihr Skript zuerst zu reparieren.

Wenn Sie nicht wissen wie, bearbeiten Sie Ihre Frage und zeigen Sie uns die betreffende Zeile und die angezeigte Warnung.

Pekka
quelle
7
Safaali, du solltest die Probleme beheben, dann nicht ignorieren.
Sampson
2
Safaali, da Sie ein gewisses Interesse an PHP haben, tun Sie sich selbst einen Gefallen und versuchen Sie, dieses Skript zu reparieren.
Pekka
0

Es gibt bereits eine Antwort mit dem Error Control Operator, aber es fehlt eine Erklärung. Sie können den @Operator für jeden Ausdruck verwenden und er verbirgt Fehler (mit Ausnahme schwerwiegender Fehler).

@$test['test']; //PHP Notice:  Undefined variable: test

@(14/0); // PHP Warning:  Division by zero

//This is not working. You can't hide Fatal Errors this way.
@customFuntion(); // PHP Fatal error:  Uncaught Error: Call to undefined function customFuntion()

Zum Debuggen ist es eine schnelle und perfekte Methode. Sie sollten es jedoch niemals in der Produktion verwenden oder dauerhaft in Ihre lokale Version aufnehmen. Es wird Ihnen eine Menge unnötiger Irritationen bereiten.

Sie sollten stattdessen Folgendes berücksichtigen:

1. Fehlerberichtseinstellungen wie in der akzeptierten Antwort angegeben.

error_reporting(E_ERROR | E_PARSE);

oder aus den PHP INI-Einstellungen

ini_set('display_errors','Off');

2. Ausnahmen abfangen

try {
    $var->method();
} catch (Error $e) {
    // Handle error
    echo $e->getMessage();
}
Tajni
quelle
0

Verwenden Sie dieses Beispiel oben in Ihrem Code, um alle Warnungen zu ignorieren:

error_reporting(0);
Ada
quelle
Und was ist der Unterschied zwischen Ihrer Antwort und der akzeptierten Antwort?
endo64