Supprimer les messages d'avertissement en PHP

Réponses:

349

Vous devez vraiment corriger ce qui cause l'avertissement, mais vous pouvez contrôler la visibilité des erreurs avec error_reporting(). Pour ignorer les messages d'avertissement, vous pouvez utiliser quelque chose comme:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
la source
53
E_ALL ^ E_WARNING, permettant tous les rapports d'erreur en plus des avertissements, semble être un meilleur choix d'argument error_reporting.
Mark Amery
1
en général, je suis d'accord, dans mon cas, la génération du message d'avertissement était un comportement voulu car cela faisait partie de mes tests unitaires.
pgee70
121

Vous pouvez mettre un @ devant votre appel de fonction pour supprimer tous les messages d'erreur.

@yourFunctionHere();
PetPaulsen
la source
4
Cela cache simplement l'erreur, cela se produit toujours. Les erreurs ralentissent PHP, il est donc préférable de corriger l'erreur si possible. L'utilisation de @ even ralentit le code lorsqu'il n'y a pas d'erreur. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Parfois (malheureusement), vous n'avez vraiment pas le choix. Par exemple, la fonction PHP parse_url () génère des avertissements pour les URL "gravement malformées" - ce qui est sans doute un bug puisque la fonction retourne false dans ce cas. Vous devez donc tolérer ces avertissements PHP dans la sortie de votre programme (peut être inacceptable pour les applications d'analyseur / validateur), supprimer les avertissements d'une manière ou d'une autre, ou contourner le comportement PHP rompu en écrivant votre propre analyseur / validateur pour les URL. Dans ce cas, je choisis le @.
Peter
1
IMPORTANT: utilisez cette méthode si (1) vous ne pouvez pas résoudre le problème qui génère l'avertissement ni (2) masquer vos avertissements aux utilisateurs finaux via php error_reporting ... Masquer les avertissements de vos développeurs n'est PAS une solution.
Joshua Kissoon
3
Permettez-moi d'expliquer pourquoi cela est essentiel. Certaines fonctions comme dns_get_recordlanceront des avertissements. Votre code peut compenser l'avertissement, mais il les envoie quand même. La désactivation du rapport d'erreurs fonctionne sur le serveur de production, mais pas sur le serveur de développement. Si vous générez du contenu XML, l'avertissement empêchera le navigateur de s'afficher car le serveur envoie du XML mal formé provoqué par l'avertissement. Parfois, vous le souhaitez lors du développement, mais pas pour quelque chose provoqué par un échec de recherche DNS temporaire que vous compensez déjà.
Alice Wonder
2
Permettez-moi d'expliquer pourquoi cela est utile, alors qu'au lieu de tous les messages d'avertissement, c'est vous qui voulez gérer l'avertissement comme une erreur et générer votre propre message d'erreur
Daniel N.
43

Pour supprimer les avertissements tout en laissant tous les autres rapports d'erreur activés:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
la source
28

Si vous ne souhaitez pas afficher les avertissements ainsi que les erreurs, utilisez

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

Rapport d'erreurs - PHP Manual

mohan.gade
la source
18

Si vous souhaitez supprimer les avertissements et certains autres types d'erreur (par exemple, les avis) lors de l'affichage de toutes les autres erreurs, vous pouvez procéder:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
la source
15

dans Core Php pour masquer le message d'avertissement, définissez error_reporting (0) en haut du fichier include commun ou du fichier individuel.

Dans Wordpress, masquer les avertissements et les avis, ajoutez le code suivant dans le fichier 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);
Vijay Lathiya
la source
C'est la meilleure solution pour masquer les journaux dans Wordpress. Je vous remercie!!
Neo Morina
10

Ne répondant pas exactement à la question, mais je pense que c'est un meilleur compromis dans certaines situations:

J'ai reçu un message d'avertissement à la suite d'une instruction printf () dans une bibliothèque tierce. Je savais exactement quelle était la cause - une solution temporaire pendant que le tiers corrigeait leur code. J'accepte que les avertissements ne doivent pas être supprimés, mais je n'ai pas pu démontrer mon travail à un client avec le message d'avertissement s'affichant à l'écran. Ma solution:

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

L'avertissement était toujours dans la source de la page pour rappel, mais invisible pour le client.

DaveWalley
la source
5
Personnellement, j'utiliserais ob_start()et à la ob_end_clean()place. De cette façon, le contenu n'est même pas envoyé au navigateur (ce qu'il fait ici).
h2ooooooo
6
C'est pourquoi j'ai inclus "certaines situations", "les avertissements ne devraient pas être supprimés" et "rappel à moi".
DaveWalley
1
Avant de me voter davantage, veuillez lire ma réponse. Notez "tiers", "compromis" et le commentaire ci-dessus. J'ai ajouté cette réponse au cas où quelqu'un d'autre se trouverait dans la même situation que moi, et dans cette situation spécifique, cela m'a sauvé alors que toutes les autres réponses n'auraient pas été aussi bonnes. La prochaine fois, je réfléchirai à deux fois pour être utile.
DaveWalley
Merci de ne pas avoir supprimé cette brillante idée. Sur mon système, j'enregistre toutes les erreurs et avertissements, renvoyés par les clients et lorsqu'un administrateur se connecte, ils sont immédiatement alertés de toute activité de ce type afin de pouvoir en informer l'équipe de maintenance. Le site est destiné aux jeux éducatifs, donc ce n'est pas un gros problème si quelque chose se passe mal pendant environ une heure.
quitte
8

Je le fais comme suit dans mon php.ini :

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

Cela enregistre uniquement les erreurs fatales et aucun avertissement.

navid
la source
7

Je pense que la meilleure solution est la configuration de .htaccess De cette façon, vous n'avez pas à modifier le code d'application. Voici les directives pour 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
la source
7

Vous pouvez supprimer l'avertissement en utilisant error_reporting mais la meilleure façon est de corriger votre script en premier lieu.

Si vous ne savez pas comment, modifiez votre question et montrez-nous la ligne en question et l'avertissement qui s'affiche.

Pekka
la source
7
Safaali, vous devez résoudre les problèmes, ne pas ignorer ensuite.
Sampson
2
Safaali, vu que vous avez un certain intérêt pour PHP, faites-vous plaisir et cherchez à réparer ce script.
Pekka
0

Il y a déjà une réponse avec Error Control Operator mais il manque d'explication. Vous pouvez utiliser l' @opérateur avec chaque expression et il masque les erreurs (sauf les erreurs fatales).

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

Pour le débogage, c'est une méthode rapide et parfaite. Mais vous ne devriez jamais l'utiliser en production ni inclure de façon permanente dans votre version locale. Cela vous donnera beaucoup d'irritation inutile.

Vous devriez plutôt considérer:

1. Paramètres de rapport d'erreur comme mentionné dans la réponse acceptée.

error_reporting(E_ERROR | E_PARSE);

ou à partir des paramètres PHP INI

ini_set('display_errors','Off');

2. Détection des exceptions

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

Pour ignorer tous les avertissements, utilisez cet exemple, en haut de votre code:

error_reporting(0);
Ada
la source
Et quelle est la différence de votre réponse avec la réponse acceptée?
endo64