Eliminar mensajes de advertencia en PHP

Respuestas:

349

Realmente deberías arreglar lo que sea que esté causando la advertencia, pero puedes controlar la visibilidad de los errores con error_reporting(). Para omitir los mensajes de advertencia, puede usar algo como:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
fuente
53
E_ALL ^ E_WARNING, habilitar todos los informes de errores además de las advertencias, parece una mejor opción de argumento para error_reporting.
Mark Amery el
1
en general estoy de acuerdo, en mi caso, generar el mensaje de advertencia era un comportamiento intencionado porque era parte de las pruebas de mi unidad.
pgee70
121

Puede poner una @ delante de su llamada de función para suprimir todos los mensajes de error.

@yourFunctionHere();
PetPaulsen
fuente
44
Esto solo oculta el error, todavía está sucediendo. Los errores hacen que PHP se ralentice, por lo que es mejor corregir el error si es posible. El uso de @ incluso ralentiza el código cuando no hay un error. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
A veces (desafortunadamente) realmente no tienes otra opción. Por ejemplo, la función PHP parse_url () genera advertencias para URL "gravemente malformadas", lo cual podría decirse que es un error ya que la función devuelve falso en este caso. Por lo tanto, debe tolerar estas advertencias de PHP en la salida de su programa (puede ser inaceptable para las aplicaciones de analizador / validador), suprimir las advertencias de alguna manera, o evitar el comportamiento roto de PHP escribiendo su propio analizador / validador para URL. En este caso, elijo la @.
Peter
1
IMPORTANTE: utilice este método si (1) no puede solucionar el problema que genera la advertencia ni (2) ocultar sus advertencias a los usuarios finales a través de php error_reporting ... Ocultar advertencias de sus desarrolladores NO es una solución.
Joshua Kissoon
3
Déjame explicarte por qué esto es crítico. Algunas funciones como dns_get_recordlanzarán advertencias. Su código puede compensar la advertencia, pero aún así los arroja. Desactivar el informe de errores funciona en el servidor de producción, pero no en el servidor de desarrollo. Si está generando contenido XML, la advertencia hará que el navegador no se procese porque el servidor está enviando XML con formato incorrecto causado por la advertencia. A veces, desea eso en desarrollo, pero no por algo causado por una falla temporal de búsqueda de DNS que ya compensa.
Alice Wonder
2
Permítanme explicar por qué esto es útil, cuando en lugar de todos los mensajes de advertencia, es usted quien quiere manejar la advertencia como un error y generar su propio mensaje de error
Daniel N.
43

Para suprimir las advertencias y dejar todos los demás informes de errores habilitados:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
fuente
18

Si desea suprimir las advertencias y algunos otros tipos de error (por ejemplo, avisos) mientras muestra todos los demás errores, puede hacer lo siguiente:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
fuente
15

en Core Php para ocultar el conjunto de mensajes de advertencia error_reporting (0) en la parte superior del archivo de inclusión común o archivo individual.

En Wordpress, oculte las advertencias y avisos y agregue el siguiente código en el archivo 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
fuente
Esta es la mejor solución, cuando se trata de ocultar registros en Wordpress. ¡¡Gracias!!
Neo Morina
10

No responde exactamente la pregunta, pero creo que este es un mejor compromiso en algunas situaciones:

Recibí un mensaje de advertencia como resultado de una declaración printf () en una biblioteca de terceros. Sabía exactamente cuál era la causa: una solución temporal mientras el tercero reparaba su código. Estoy de acuerdo en que las advertencias no deben suprimirse, pero no pude demostrar mi trabajo a un cliente con el mensaje de advertencia que aparece en la pantalla. Mi solución:

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

La advertencia todavía estaba en la fuente de la página como un recordatorio para mí, pero invisible para el cliente.

DaveWalley
fuente
55
Personalmente, usaría ob_start()y en su ob_end_clean()lugar. De esta manera, las cosas ni siquiera se envían al navegador (lo que hace aquí).
h2ooooooo
66
Es por eso que incluí "algunas situaciones", "las advertencias no deberían suprimirse" y "recordatorio para mí".
DaveWalley
1
Antes de votarme menos, lea mi respuesta. Tenga en cuenta "tercero", "compromiso" y el comentario anterior. Agregué esta respuesta en caso de que alguien más esté en la misma situación en la que yo estaba, y en esa situación específica, esto me salvó, mientras que todas las demás respuestas no habrían sido tan buenas. La próxima vez lo pensaré dos veces antes de ser útil.
DaveWalley
Gracias por no eliminar esta brillante idea. En mi sistema, guardo todos los errores y advertencias, enviados por los clientes y cuando un administrador inicia sesión, son alertados inmediatamente de dicha actividad para que puedan asesorar al equipo de mantenimiento. El sitio es para juegos educativos, por lo que no es un problema si algo sale mal durante una hora más o menos.
necesita el
8

Lo hago de la siguiente manera en mi php.ini :

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

Esto registra solo errores fatales y sin advertencias.

navid
fuente
7

Creo que la mejor solución es la configuración de .htaccess De esa manera, no tiene que alterar el código de la aplicación. Aquí hay directivas para 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
fuente
7

Puede suprimir la advertencia usando error_reporting, pero la mejor manera es arreglar su script en primer lugar.

Si no sabe cómo, edite su pregunta y muéstrenos la línea en cuestión y la advertencia que se muestra.

Pekka
fuente
77
Safaali, deberías solucionar los problemas, no ignorarlos.
Sampson el
2
Safaali, ya que tiene cierto interés en PHP, hágase un favor y busque arreglar ese script.
Pekka
0

Ya hay una respuesta con el operador de control de errores, pero carece de explicación. Puede usar el @operador con cada expresión y oculta los errores (excepto los Errores 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()

Para la depuración es un método rápido y perfecto. Pero nunca debe usarlo en producción ni incluirlo permanentemente en su versión local. Le dará mucha irritación innecesaria.

Deberías considerar en su lugar:

1. Configuración de informes de errores como se menciona en la respuesta aceptada.

error_reporting(E_ERROR | E_PARSE);

o desde la configuración PHP INI

ini_set('display_errors','Off');

2. Excepciones de captura

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

Para ignorar todas las advertencias, use este ejemplo, en la parte superior de su código:

error_reporting(0);
Ada
fuente
¿Y cuál es la diferencia de su respuesta con la respuesta aceptada?
endo64