Come faccio a disattivare gli avvisi PHP?


126
Notice: Constant DIR_FS_CATALOG already defined

Ho già commentato display_errorsinphp.ini , ma non funziona.

Come faccio a fare in modo che PHP non invii tali cose ai browser?

AGGIORNARE

L'ho inserito display_errors = Offma riporta ancora tali avvisi,

È un problema con PHP 5.3?

Segnalazione anche di numerosi stack di chiamate .


3
Se stai usando Apache, potresti dover riavviare il tuo server! Se stai utilizzando XAMPP, seleziona "riavvia" nell'app di gestione.
st4wik

2
Suggerisco di correre grep display_errors /path/to/php.iniper vedere se la tua linea viene sovrascritta da qualche parte nel file. Questo è quello che mi stava succedendo.
usandfriends

Error_reporting è la soluzione
David Stienen

prova ini_set('display_errors',0)nel tuo file php. Quando le impostazioni iniziali non funzionano, è necessario verificare se phpinfo()mostra il valore desiderato. In caso contrario, hai cambiato il file ini sbagliato o qualcosa sovrascrive i tuoi valori da php.ini
Radon8472

non è un bug di php 5.3. display_errors funziona da php 4.0.3 fino alle ultime versioni @see 3v4l.org/87gIl
Radon8472

Risposte:


78

È possibile impostare display_errorsper 0o utilizzare la error_reporting()funzione di.

Tuttavia, gli avvisi sono fastidiosi (posso in parte simpatizzare ) ma servono a uno scopo. Non dovresti definire una costante due volte, la seconda volta non funzionerà e la costante rimarrà invariata!


4
+1: approvo menzionare che dovrebbe correggere gli errori, non disattivare la segnalazione. E l'hai fatto in un modo più gentile di @Jonathan Kuhn :-)
Josh

1
No, sembra che questo sia un bug di php5.3, display_errorsnon funziona come previsto.
user198729

@user prova a phpinfo()per vedere se l'impostazione si applica effettivamente. Perdonami, ma dubito fortemente che tu abbia trovato un bug in PHP 5.3 - Ci crederò solo quando lo vedrò :)
Pekka

Strano, local valueè acceso, ma master valueè spento, non so cosa significhi esattamente ...
user198729

1
@user Penso che il valore locale possa provenire da ini_setdirettive o php_ini_flagimpostazioni nei .htaccessfile.
Pekka

242

Dalla documentazione PHP ( error_reporting ):

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

Altre opzioni interessanti per quella funzione:

<?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);

?>

Molto utile e dà la risposta alla domanda. Anche se so che è meglio correggere anche tutti gli avvisi. A volte può essere utile visualizzare tutto tranne gli avvisi.
Timo002

3
La disattivazione dei soli avvisi non ha funzionato per me utilizzando ^ AVVISO come indicato nel post sopra. Per PHP v5.3 utilizzare: E_ALL & ~ E_NOTICE
Chizzle

Se hai un'API REST che restituisce JSON o XML o altro, potresti volerli disattivare. O almeno convertirli in eccezioni e gestirli di conseguenza.
TheRealChx101

Ciao. Ha funzionato per me. Grazie mille.
H. Farid

Display_errors controlla se gli errori vengono inviati a stdoutput. Ma quando modifichi error_reporting a 0, disabiliti totalmente tutta la gestione degli errori e le cose di errorloging .. non dovresti MAI fare error_reporting (0).
Radon8472

30

Per la riga di comando php, impostare

error_reporting = E_ALL & ~E_NOTICE

nel /etc/php5/cli/php.ini

l' phpesecuzione del comando quindi omette gli avvisi.


In questo modo error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING nel php.ini. Disabilita l'avviso PHP e gli avvisi PHP. In modo che nessun avviso php e avvisi php vengano visualizzati nei browser
Deepak Lamichhane

Questo vale per le impostazioni php della console. Se stai usando php per generare pagine web su apache2, il file di configurazione del server web è /etc/php5/apache2/php.ini È meglio usare phpinfo () per vedere quale file di configurazione è effettivamente usato.
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);

?>

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


2
Non è solo un duplicato di questa risposta esistente pubblicata anni fa?
Pang

Entrambi abbiamo copiato dalla documentazione php ed entrambe le risposte hanno menzionato le risorse.
Abhishek Goel

@AbhishekGoel Gli unicorni sono pony travestiti, questa affermazione è irrilevante, hai ancora duplicato la risposta già esistente quattro anni dopo.
Ricky Boyce

@ RickyB Non ho controllato la risposta esistente e nemmeno l'ho copiata.
Abhishek Goel

12

Utilizzato questa riga nel codice

error_reporting(E_ALL ^ E_NOTICE);  

Penso che sia pieno per te.


6

Stai cercando:

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

2
Ciao @Christian e benvenuto in StackOverflow! In futuro, sarebbe fantastico se potessi aggiungere una piccola spiegazione / dettaglio extra alla tua risposta per illuminare coloro che lo vedono sul perché / come funziona la soluzione / risolve il problema. Grazie mille e buona programmazione :)
Zachary Kniebel

1
Esattamente! Uso /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpper il mio crontab
vladkras

4

Preferisco non impostare l' error_reportinginterno del mio codice. Ma in un caso, un prodotto legacy, ci sono così tanti avvisi che devono essere nascosti.

Quindi ho usato il seguente frammento per impostare il valore configurato sul lato server per error_reportingma sottrarre E_NOTICEs.

error_reporting(error_reporting() & ~E_NOTICE);

Ora l'impostazione di segnalazione degli errori può essere ulteriormente configurata in php.inio .htaccess. Solo gli avvisi saranno sempre disabilitati.


3

È possibile impostare ini_set('display_errors',0);nel proprio script o definire con quali errori si desidera visualizzare error_reporting().


Avevo bisogno di utilizzare il ini_setmetodo menzionato qui, il error_reporting(0)metodo menzionato altrove non ha avuto alcun effetto.
pix

2

non causando gli errori:

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

Se è davvero necessario, modificare la segnalazione degli errori utilizzando error_reporting () in E_ALL ^ ​​E_NOTICE.


1
Se si tratta di un sito di produzione, indipendentemente dal fatto che tu pensi che sia privo di errori, non dovresti comunque visualizzare gli errori se si verificano, quindi "non causando errori" sembra una risposta un po 'sfacciata a una domanda valida.
Cam

5
da quando è consentito consentire errori in un sito di produzione? Sono d'accordo che su un sito di produzione non dovresti visualizzare errori, non è quello che stavo dicendo. Stavo dicendo che dovresti controllare se la costante è definita e impostarla in caso contrario (motivo per cui ho fornito il codice di esempio).
Jonathan Kuhn

Sebbene la tua risposta non sia stata la "più carina", sembra rispondere al meglio alla domanda dell'OP. +1 alla tua risposta e / vorrei che fosse contrassegnata come risposta, perché è la risposta corretta.
Nazca

@Nazca Sì, da allora ho cambiato il mio comportamento e cerco di essere molto più amichevole. :)
Jonathan Kuhn

2

Per il codice PHP:

<?php
error_reporting(E_ALL & ~E_NOTICE);

Per la php.iniconfigurazione:

error_reporting = E_ALL & ~E_NOTICE

1

Ho scoperto questo trucco di recente. Colpisci una @ all'inizio di una riga che potrebbe produrre un avviso / errore.

Come per magia, scompaiono.


21
di solito è una cattiva idea, è come mettere i tappi per le orecchie perché la tua auto fa un rumore terribile.
David Morrow

10
Questo in realtà ha perfettamente senso per alcuni casi, ad esempio quando si esegue il rendering di una variabile, indipendentemente dal fatto che sia impostata o vuota.
Frans

1
Questo ha senso solo quando hai qualcosa come un plugin per WordPress che l'autore non ha ancora aggiornato e sai esattamente cosa sta causando il problema. Tuttavia è un cerotto, non una soluzione.
Imperativo

Mi piacciono sia error_reporting () che "@". Non ero a conoscenza di nessuno di questi. Grazie. Mi piace la "@" in quanto fornisce la stessa funzionalità di error_reporting (0) ed è più facile da digitare. Se il problema è più come "l'appendiabiti che sostiene lo scarico" che "l'orribile rumore di sfregamento", allora il progetto può andare avanti. Posso facilmente trovarli e sistemarli quando c'è tempo. Ciò ha aiutato con un problema in cui l'errore è causato dai dati letti da un file, quindi nessun errore di battitura o problemi di libreria.
Mark Longmire

1
Assicurati solo di mettere @ dove sei sicuro al 100% di quello che stai facendo.
Nick

1

Usa phpinfo () e cerca per Configuration File (php.ini) Pathvedere quale percorso del file di configurazione per php viene utilizzato. PHP può avere più file di configurazione a seconda dell'ambiente in esecuzione. Di solito, per console è:

/etc/php5/cli/php.ini

e per php gestito da apache è:

/etc/php5/apache2/php.ini

E poi imposta error_reportingil modo in cui ne hai bisogno:

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


1

Come menzionato da alcuni e se sei l'autore del codice, dovresti correggere tutti quegli errori, avvisi, ecc. Perché ti causerà più problemi a lungo termine che non risolverli (specialmente quando aggiorni il tuo sistema operativo). Per il tuo server, dovresti visualizzare gli errori solo nei log, non nella schermata del client.

Quindi per evitare errori nel tuo browser usi il display_errorsflag come hai già trovato:

display_errors = Off

Ora il vero problema è quando esegui il codice di qualcun altro. In tal caso, è probabile che la modifica del codice venga sovrascritta ogni volta che si aggiorna quel codice. È noioso mantenere quel codice.

Nel mio caso, sto eseguendo PHP con crontabper avere lo wp-cron.phpscript in esecuzione una volta ogni tanto. Ricevo errori inviati alle mie e-mail, il che diventa noioso quando ricevi un'e-mail ogni 10 minuti! In quel caso, però, il sistema Wordpress ha un file di configurazione che include un WP_DEBUGe chiamano la error_reporting()funzione, quindi provare a cambiare la error_reportingvariabile sulla riga di comando non funzionerà. Invece devi modificare il wp-config.phpfile nella cartella principale e assicurarti che WP_DEBUGsia impostato su false. Altrimenti riceverai tutti quegli avvisi e avvisi tutto il tempo.


0

Puoi verificare se la costante è già definita utilizzando:

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

0

Credo che commentare display_errors in php.ini non funzionerà perché l'impostazione predefinita è On. Devi invece impostarlo su "Off".

Non dimenticare di riavviare Apache per applicare le modifiche alla configurazione.

Si noti inoltre che sebbene sia possibile impostare display_errors in fase di esecuzione, modificarlo qui non influisce sugli errori FATALI.

Come notato da altri, idealmente durante lo sviluppo dovresti eseguire con error_reporting al livello più alto possibile e display_errors abilitato. Anche se fastidiosi quando si inizia per la prima volta, questi errori, avvisi, avvisi e rigorosi consigli di codifica si sommano e ti consentono di diventare un programmatore migliore.


0

Costanti doppie definite

Per correggere l'errore specifico qui puoi controllare se una costante è già definita prima di definirla:

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

Personalmente inizierei con una ricerca nella base di codice per la costante DIR_FS_CATALOG, quindi sostituisco la doppia definizione con questa.

Nascondere gli avvisi PHP in linea, caso per caso

PHP fornisce l' @operatore di controllo degli errori, che puoi utilizzare per ignorare funzioni specifiche che causano avvisi o avvisi.

Usando questo puoi ignorare / disabilitare gli avvisi e gli avvisi caso per caso nel tuo codice, il che può essere utile per situazioni in cui un errore o un avviso è intenzionale, pianificato o semplicemente fastidioso e non è possibile risolverlo alla fonte . Posiziona un file@ prima della funzione o var che sta causando un avviso e verrà ignorato.

Ecco un esempio:

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

Maggiori informazioni su questo possono essere trovate nei documenti PHP's Error Control Operators .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.