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

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

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


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

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

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.


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.


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

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.


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

0

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

error_reporting(0);

Et quelle est la différence de votre réponse avec la réponse acceptée?
endo64
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.