Wie schalte ich PHP Notices aus?


126
Notice: Constant DIR_FS_CATALOG already defined

Ich habe schon auf Kommentar display_errorsin php.ini, aber funktioniert nicht.

Wie kann ich PHP dazu bringen, solche Dinge nicht an Browser auszugeben?

AKTUALISIEREN

Ich habe es display_errors = Offdort abgelegt, aber es werden immer noch solche Mitteilungen gemeldet.

Ist das ein Problem mit PHP 5.3?

Berichterstattung über zahlreiche Call Stack auch ..


3
Wenn Sie Apache verwenden, müssen Sie möglicherweise Ihren Server neu starten! Wenn Sie XAMPP verwenden, wählen Sie einfach "Neustart" in der Manager-App.
st4wik

2
Ich schlage vor, zu laufen, um grep display_errors /path/to/php.inizu sehen, ob Ihre Zeile irgendwo in der Datei überschrieben wird. Das ist mir passiert.
usandfriends

Error_reporting ist die Lösung
David Stienen

versuchen Sie es ini_set('display_errors',0)in Ihrer PHP-Datei. Wenn phpinfo()Ihre INI-Einstellungen nicht funktionieren, sollten Sie überprüfen, ob Ihr gewünschter Wert angezeigt wird. Wenn nicht, haben Sie entweder die falsche INI-Datei geändert oder etwas überschreibt Ihre Werte von php.ini
Radon8472

Es ist kein PHP 5.3-Fehler. display_errors funktioniert von PHP 4.0.3 bis zu den neuesten Versionen @see 3v4l.org/87gIl
Radon8472

Antworten:


78

Sie können festlegen , display_errorsauf 0oder die Verwendung error_reporting()Funktion.

Mitteilungen sind jedoch ärgerlich (ich kann teilweise mitfühlen ), aber sie erfüllen einen Zweck. Sie sollten eine Konstante nicht zweimal definieren, das zweite Mal funktioniert nicht und die Konstante bleibt unverändert!


4
+1: Ich bin damit einverstanden zu erwähnen, dass er die Fehler korrigieren und die Berichterstattung nicht ausschalten sollte. Und du hast es sanfter gemacht als @Jonathan Kuhn :-)
Josh

1
Nein, scheint dies ein Fehler von PHP5.3 zu sein, display_errorsfunktioniert nicht wie erwartet.
user198729

@user versuchen Sie a, um phpinfo()zu sehen, ob die Einstellung tatsächlich gilt. Verzeihen Sie mir, aber ich bezweifle stark, dass Sie einen Fehler in PHP 5.3 gefunden haben - ich werde es nur glauben, wenn ich es sehe :)
Pekka

Seltsam, das local valueist an, aber das master valueist aus, weiß nicht, was das genau bedeutet ...
user198729

1
@user Ich denke, der lokale Wert kann von ini_setAnweisungen oder php_ini_flagEinstellungen in .htaccessDateien stammen.
Pekka

242

Aus der PHP-Dokumentation ( error_reporting ):

<?php
// Turn off all error reporting
error_reporting(0);
?>

Weitere interessante Optionen für diese Funktion:

<?php

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL & ~E_NOTICE);
// For PHP < 5.3 use: E_ALL ^ E_NOTICE

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

Sehr hilfreich und gibt die Antwort auf die Frage. Obwohl ich weiß, dass es besser ist, auch alle Hinweise zu korrigieren. Manchmal kann es praktisch sein, alles außer Hinweisen anzuzeigen.
Timo002

3
Das Deaktivieren von nur Benachrichtigungen funktionierte bei mir nicht mit ^ HINWEIS, wie im obigen Beitrag angegeben. Für PHP v5.3 verwenden Sie: E_ALL & ~ E_NOTICE
Chizzle

Wenn Sie eine REST-API haben, die JSON oder XML oder was auch immer zurückgibt, möchten Sie diese möglicherweise deaktivieren. Oder konvertieren Sie sie zumindest in Ausnahmen und behandeln Sie sie entsprechend.
TheRealChx101

Hallo. Hat für mich gearbeitet. Vielen Dank.
H. Farid

Display_errors steuert, ob Fehler an stdoutput gesendet werden. Wenn Sie jedoch error_reporting auf 0 ändern, deaktivieren Sie alle Fehlerbehandlungs- und Fehlerprotokollierungsvorgänge vollständig. Sie sollten NIEMALS error_reporting (0) ausführen.
Radon8472

30

Für die Kommandozeile PHP setzen

error_reporting = E_ALL & ~E_NOTICE

im /etc/php5/cli/php.ini

Die Befehlsausführung lässt phpdann die Benachrichtigungen aus.


Auf diese Weise wird error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING in der php.ini ausgeführt. Es deaktiviert den PHP-Hinweis und die PHP-Warnungen. Damit in den Browsern keine PHP-Hinweise und PHP-Warnungen
angezeigt

Dies gilt für die PHP-Einstellungen der Konsole. Wenn Sie PHP zum Generieren von Webseiten über die Apache2-Webserver-Konfigurationsdatei verwenden, lautet /etc/php5/apache2/php.ini. Verwenden Sie am besten phpinfo (), um festzustellen, welche Konfigurationsdatei tatsächlich verwendet wird.
MilanG

23
<?php

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

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

Quelle http://php.net/manual/en/function.error-reporting.php


2
Ist das nicht nur ein Duplikat dieser bestehenden Antwort, die vor Jahren veröffentlicht wurde?
Pang

Wir haben beide Kopien aus der PHP-Dokumentation eingefügt und beide Antworten haben die Ressourcen erwähnt.
Abhishek Goel

@AbhishekGoel Einhörner sind verkleidete Ponys, diese Aussage ist irrelevant, Sie haben die bereits vorhandene Antwort vier Jahre später noch dupliziert .
Ricky Boyce

@ RickyB Ich habe die vorhandene Antwort nicht überprüft und auch nicht kopiert.
Abhishek Goel

12

Verwendete diese Zeile in Ihrem Code

error_reporting(E_ALL ^ E_NOTICE);  

Ich denke, es ist voll für dich.


5

Du suchst nach:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"

2
Hallo @Christian, und willkommen bei StackOverflow! In Zukunft wäre es großartig, wenn Sie Ihrer Antwort eine zusätzliche Erklärung / ein Detail hinzufügen könnten, um diejenigen aufzuklären, die sehen, warum / wie die Lösung funktioniert / das Problem behebt. Vielen Dank und viel
Spaß

genau! Ich benutze /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpfür meine crontab
vladkras

4

Ich ziehe es vor, das error_reportingInnere meines Codes nicht festzulegen. Aber in einem Fall, einem Legacy-Produkt, gibt es so viele Hinweise, dass sie ausgeblendet werden müssen.

Also habe ich das folgende Snippet verwendet, um den serverseitig konfigurierten Wert für s festzulegen, error_reportingaber das E_NOTICEs zu subtrahieren .

error_reporting(error_reporting() & ~E_NOTICE);

Jetzt kann die Einstellung für die Fehlerberichterstattung in php.inioder weiter konfiguriert werden .htaccess. Nur Benachrichtigungen werden immer deaktiviert.


3

Sie können ini_set('display_errors',0);in Ihrem Skript festlegen oder definieren, mit welchen Fehlern Sie anzeigen möchten error_reporting().


Ich musste die ini_sethier erwähnte Methode verwenden, die an error_reporting(0)anderer Stelle erwähnte Methode hatte keine Wirkung.
Bilder

3

indem Sie die Fehler nicht verursachen:

defined('DIR_FS_CATALOG') || define('DIR_FS_CATALOG', 'whatever');

Wenn Sie es wirklich müssen, ändern Sie die Fehlerberichterstattung mit error_reporting () in E_ALL ^ ​​E_NOTICE.


1
Wenn es sich um eine Produktionsstätte handelt, unabhängig davon, ob Sie sie für fehlerfrei halten oder nicht, sollten Sie dennoch keine Fehler anzeigen, wenn sie auftreten. Wenn Sie also keine Fehler verursachen, erscheint dies wie eine freche Antwort auf eine gültige Frage.
Cam

5
Seit wann ist es in Ordnung, Fehler in einer Produktionsstätte zuzulassen? Ich bin damit einverstanden, dass auf einer Produktionsstätte keine Fehler angezeigt werden sollten, das habe ich nicht gesagt. Ich sagte, dass Sie überprüfen sollten, ob die Konstante definiert ist, und sie einstellen sollten, wenn nicht (weshalb ich das Codebeispiel gegeben habe).
Jonathan Kuhn

Obwohl Ihre Antwort nicht die "schönste" war, scheint sie die Frage des OP in vollem Umfang zu beantworten. +1 auf Ihre Antwort und / oder wünschen, dass sie als Antwort markiert wurde, da dies die richtige Antwort ist.
Nazca

@ Nazca Ja, ich habe seitdem mein Verhalten geändert und versuche viel freundlicher zu sein. :)
Jonathan Kuhn

2

Für PHP-Code:

<?php
error_reporting(E_ALL & ~E_NOTICE);

Für die php.iniKonfiguration:

error_reporting = E_ALL & ~E_NOTICE

1

Ich habe diesen Trick kürzlich herausgefunden. Schlagen Sie ein @ am Anfang einer Zeile, die eine Warnung / einen Fehler erzeugen kann.

Wie durch Zauberei verschwinden sie.


21
Das ist normalerweise eine schlechte Idee, es ist wie das Einsetzen von Ohrstöpseln, weil Ihr Auto ein schreckliches Schleifgeräusch macht.
David Morrow

10
Dies ist in einigen Fällen durchaus sinnvoll, beispielsweise beim Rendern einer Variablen, unabhängig davon, ob sie gesetzt oder leer ist.
Frans

1
Dies ist nur dann sinnvoll, wenn Sie so etwas wie ein WordPress-Plugin haben, das der Autor noch nicht aktualisiert hat, und Sie genau wissen, was das Problem verursacht. Es ist jedoch ein Pflaster, keine Lösung.
Imperativ

Ich mag sowohl error_reporting () als auch '@'. Beides war mir nicht bewusst. Danke dir. Ich mag das '@', da dies die gleiche Funktionalität wie error_reporting (0) bietet und einfacher zu tippen ist. Wenn das Problem eher dem "Kleiderbügel, der den Auspuff hält" als dem "schrecklichen Schleifgeräusch" ähnelt, kann das Projekt voranschreiten. Ich kann diese leicht finden und reparieren, wenn Zeit ist. Dies half bei einem Problem, bei dem der Fehler durch aus einer Datei gelesene Daten verursacht wurde, sodass keine Tippfehler oder Bibliotheksprobleme auftraten.
Mark Longmire

1
Stellen Sie einfach sicher, dass Sie @ dort platzieren, wo Sie 100% sicher sind, was Sie tun.
Nick

1

Verwenden Sie phpinfo () und suchen Sie nach Configuration File (php.ini) Path nach dem Konfigurationsdateipfad für PHP. PHP kann je nach Umgebung mehrere Konfigurationsdateien haben. Normalerweise ist es für die Konsole:

/etc/php5/cli/php.ini

und für PHP, das von Apache ausgeführt wird, ist es:

/etc/php5/apache2/php.ini

Und stellen Sie dann error_reportingden Weg ein, den Sie brauchen:

http://www.phpknowhow.com/configuration/php-ini-error-settings/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini- Datei


1

Wie von einigen erwähnt und wenn Sie der Code-Autor sind, sollten Sie all diese Fehler, Hinweise usw. korrigieren, da dies langfristig mehr Probleme für Sie verursacht, als sie nicht zu beheben (insbesondere, wenn Sie Ihr Betriebssystem aktualisieren). Für Ihren Server sollten Fehler nur in Ihren Protokollen angezeigt werden, nicht auf dem Bildschirm des Clients.

Um die Fehler in Ihrem Browser zu vermeiden, verwenden Sie das display_errorsFlag, wie Sie es bereits gefunden haben:

display_errors = Off

Das eigentliche Problem ist jetzt, wenn Sie einen anderen Code ausführen. In diesem Fall wird das Ändern des Codes wahrscheinlich jedes Mal überschrieben, wenn Sie diesen Code aktualisieren. Es macht es mühsam, diesen Code zu pflegen.

In meinem Fall führe ich PHP mit aus crontab, damit das wp-cron.phpSkript gelegentlich ausgeführt wird. Ich habe Fehler an meine E-Mails gesendet bekommen, was mühsam wird, wenn Sie alle 10 Minuten eine E-Mail erhalten! In diesem Fall enthält das Wordpress-System jedoch eine Konfigurationsdatei, die a enthält, WP_DEBUGund sie rufen die error_reporting()Funktion auf, sodass der Versuch, die error_reportingVariable in der Befehlszeile zu ändern, nicht funktioniert. Stattdessen müssen Sie die wp-config.phpDatei im Stammordner bearbeiten und sicherstellen, dass auf WP_DEBUGgesetzt ist false. Andernfalls erhalten Sie ständig alle diese Warnungen und Hinweise.


0

Sie können überprüfen, ob die Konstante bereits definiert ist, indem Sie:

<?php
if (!defined('MYCONST'))
    define('MYCONST', 'Weeha!');
?>

0

Ich glaube, dass das Auskommentieren von display_errors in der php.ini nicht funktioniert, da der Standardwert On ist. Sie müssen es stattdessen auf "Aus" setzen.

Vergessen Sie nicht, Apache neu zu starten, um Konfigurationsänderungen zu übernehmen.

Beachten Sie auch, dass Sie zwar zur Laufzeit display_errors festlegen können, eine Änderung hier jedoch keine Auswirkungen auf FATAL-Fehler hat.

Wie von anderen angemerkt, sollten Sie idealerweise während der Entwicklung mit error_reporting auf der höchstmöglichen Ebene und aktivierten display_errors ausgeführt werden. Diese Fehler, Warnungen, Hinweise und strengen Codierungshinweise sind beim ersten Start zwar ärgerlich, summieren sich jedoch und ermöglichen es Ihnen, ein besserer Codierer zu werden.


0

Doppelte definierte Konstanten

Um den spezifischen Fehler hier zu beheben, können Sie überprüfen, ob eine Konstante bereits definiert ist, bevor Sie sie definieren:

if ( ! defined( 'DIR_FS_CATALOG' ) ) 
  define( 'DIR_FS_CATALOG', 'something...' );

Ich persönlich würde mit einer Suche in der Codebasis nach der Konstante beginnen DIR_FS_CATALOGund dann die doppelte Definition durch diese ersetzen.

Ausblenden von PHP-Hinweisen inline von Fall zu Fall

PHP bietet die @ Fehlerkontrolloperator, mit dem Sie bestimmte Funktionen ignorieren können, die Hinweise oder Warnungen verursachen.

Auf diese Weise können Sie Benachrichtigungen und Warnungen in Ihrem Code von Fall zu Fall ignorieren / deaktivieren. Dies kann hilfreich sein, wenn ein Fehler oder eine Benachrichtigung beabsichtigt, geplant oder einfach nur ärgerlich ist und an der Quelle nicht behoben werden kann . Platzieren Sie eine@ vor die Funktion oder Variable, die einen Hinweis verursacht, und es wird ignoriert.

Hier ist ein Beispiel:

// Intentional file error
$missing_file = @file( 'non_existent_file' );

Weitere Informationen hierzu finden Sie in den PHP- Dokumenten zu Error Control Operators .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.