Rimuovi i messaggi di avviso in PHP


Risposte:


349

Dovresti davvero risolvere qualunque cosa stia causando l'avvertimento, ma puoi controllare la visibilità degli errori con error_reporting(). Per saltare i messaggi di avviso, è possibile utilizzare qualcosa come:

error_reporting(E_ERROR | E_PARSE);

53
E_ALL ^ E_WARNING, abilitando tutte le segnalazioni di errori oltre agli avvisi, sembra una scelta migliore per l'argomento error_reporting.
Mark Amery,

1
generalmente sono d'accordo, nel mio caso generare il messaggio di avvertimento era un comportamento previsto perché faceva parte dei miei test unitari.
pgee70,

121

È possibile inserire una @ davanti alla chiamata della funzione per eliminare tutti i messaggi di errore.

@yourFunctionHere();

4
Questo nasconde l'errore, sta ancora accadendo. Gli errori rallentano PHP, quindi è meglio correggere l'errore se possibile. L'uso di @ persino rallenta il codice quando non si verifica un errore. vega.rd.no/articles/php-performance-error-suppression
dprevite

46
A volte (purtroppo) non hai davvero scelta. Ad esempio, la funzione PHP parse_url () genera avvisi per URL "gravemente malformati" - che è probabilmente un bug poiché la funzione restituisce false in questo caso. Quindi è necessario tollerare questi avvisi PHP nell'output del programma (potrebbe essere inaccettabile per le applicazioni parser / validator), sopprimere gli avvertimenti in qualche modo o aggirare il comportamento PHP rotto scrivendo il proprio parser / validator per gli URL. In questo caso, scelgo @.
Peter,

1
IMPORTANTE: utilizzare questo metodo se (1) non è possibile risolvere il problema che genera l'avviso né (2) nascondere gli avvisi agli utenti finali tramite php error_reporting ... Nascondere gli avvisi dagli sviluppatori NON è una soluzione.
Joshua Kissoon,

3
Lasciami spiegare perché questo è fondamentale. Alcune funzioni come dns_get_recordlanceranno avvisi. Il tuo codice potrebbe compensare l'avviso ma li lancia comunque. La disattivazione della segnalazione errori funziona sul server di produzione, ma non sul server di sviluppo. Se stai generando contenuto XML, l'avviso impedirà al browser di non eseguire il rendering perché il server sta inviando XML non valido causato dall'avviso. A volte lo desideri allo sviluppo, ma non per qualcosa causato da un errore di ricerca DNS temporaneo che già compensi.
Alice Wonder,

2
Lasciami spiegare perché questo è utile, quando invece di tutti i messaggi di avviso, sei tu che vuoi gestire l'avviso come un errore e generare il tuo messaggio di errore
Daniel N.

43

Per eliminare gli avvisi lasciando abilitate tutte le altre segnalazioni di errori:

error_reporting(E_ALL ^ E_WARNING); 


18

Se si desidera eliminare gli avvisi e alcuni altri tipi di errore (ad esempio, avvisi) durante la visualizzazione di tutti gli altri errori, è possibile eseguire:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);

15

in Core Php per nascondere il messaggio di avviso impostare error_reporting (0) nella parte superiore del file include comune o singolo file.

In Wordpress nascondi Avvertenze e avvisi aggiungi il seguente codice nel file wp-config.php

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

Questa è la soluzione migliore, quando si tratta di nascondere i log in Wordpress. Grazie!!
Neo Morina,

10

Non rispondo esattamente alla domanda, ma penso che questo sia un compromesso migliore in alcune situazioni:

Ho ricevuto un messaggio di avviso a seguito di un'istruzione printf () in una libreria di terze parti. Sapevo esattamente quale fosse la causa: una soluzione temporanea mentre le terze parti correggevano il loro codice. Accetto che gli avvisi non debbano essere soppressi, ma non ho potuto dimostrare il mio lavoro a un cliente con il messaggio di avviso che appare sullo schermo. La mia soluzione:

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

L'avvertimento era ancora nell'origine della pagina come promemoria per me, ma invisibile al client.


5
Personalmente, userei ob_start()e ob_end_clean()invece. In questo modo le cose non vengono nemmeno inviate al browser (cosa che fa qui).
h2ooooooo,

6
Ecco perché ho incluso "alcune situazioni", "gli avvisi non devono essere soppressi" e "promemoria per me".
DaveWalley,

1
Prima di sottovalutarmi ancora, leggi la mia risposta. Nota "di terze parti", "compromesso" e il commento sopra. Ho aggiunto questa risposta nel caso in cui qualcun altro si trovi nella stessa situazione in cui mi trovavo, e in quella situazione specifica, questo mi ha salvato mentre tutte le altre risposte non sarebbero state altrettanto buone. La prossima volta ci penserò due volte sull'essere utile.
DaveWalley,

Grazie per non aver rimosso questa brillante idea. Sul mio sistema, salvo tutti gli errori e gli avvisi, rispediti dai client e quando un amministratore accede, vengono immediatamente avvisati di tali attività in modo che possano consigliare il personale di manutenzione. Il sito è per giochi educativi, quindi non è un grosso problema se qualcosa va storto per circa un'ora.
chiede il

8

Lo faccio come segue nel mio php.ini :

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

Questo registra solo errori fatali e nessun avviso.


7

Penso che la soluzione migliore sia la configurazione di .htaccess In questo modo non è necessario modificare il codice dell'applicazione. Ecco le direttive per 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

7

È possibile eliminare l'avviso utilizzando error_reporting ma il modo migliore è correggere innanzitutto lo script.

Se non sai come, modifica la tua domanda e mostraci la riga in questione e l'avviso che viene visualizzato.


7
Safaali, dovresti risolvere i problemi, non ignorarli allora.
Sampson,

2
Safaali, visto che hai un certo interesse per PHP, fatti un favore e cerca di sistemare quella sceneggiatura.
Pekka,

0

C'è già una risposta con Error Control Operator ma manca di spiegazioni. È possibile utilizzare l' @operatore con ogni espressione e nasconde errori (tranne errori irreversibili).

@$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()

Per il debug è un metodo rapido e perfetto. Ma non dovresti mai usarlo in produzione né includere permanentemente nella tua versione locale. Ti darà molte irritazioni inutili.

Dovresti invece considerare:

1. Errore nella segnalazione delle impostazioni come indicato nella risposta accettata.

error_reporting(E_ERROR | E_PARSE);

o dalle impostazioni INI di PHP

ini_set('display_errors','Off');

2. Eccezioni di cattura

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

0

Per ignorare tutti gli avvisi, utilizzare questo esempio, nella parte superiore del codice:

error_reporting(0);

E qual è la differenza tra la tua risposta e la risposta accettata?
endo64,
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.