Eliminar warning y errores típicos en PHP
Cuando programamos en PHP existe una serie de errores y warnings que son muy típicos y que para el programador más novel pueden suponer un problema. Aquí recopilamos algunos de los más típicos, pero ya que estamos, me gustaría que todos nos contarais errores y soluciones a los mismos que encontráis a menudo.
Warning: Cannot modify header information – headers already sent by
Que también podemos encontrar como “Warning: session_start(): Cannot send session cache limiter – headers already sent” o “Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by“. Se produce cuando intentamos modificar las cabeceras del paquete HTTP, cuando ya hemos dejado de emitirlas y estamos emitiendo el cuerpo del paquete.
¿Por qué ocurre esto? Podéis verlo dentro del protocolo. Para solucionarlo deberemos ser muy cuidadosos en dos aspectos:
- Nunca comenzar a emitir el cuerpo antes de tiempo, con un sólo espacio en blanco delante de <?php ya habríamos provocado el problema (se empieza a emitir un espacio en blanco como parte del cuerpo).
- No emitir la cabecera en mitad del cuerpo. Es decir, no usar funciones que la puedan modificar como session_start, cuando estamos ya en el cuerpo de nuestro contenido HTTP.
Fatal error: Cannot redeclare nombre_función
En PHP no existe la sobrecarga (aunque podéis imitarlas), por lo tanto las declaraciones de las funciones serán únicas en todo el código. Si estamos trabajando en un proyecto grande y queremos asegurarnos que la función se declara cuando no exista y no se declare cuando sí exista hacemos lo siguiente, usar function_exists de PHP, veamos un ejemplo.
if(!function_exists('mi_funcion')) { function mi_funcion() { /* */ } }
Notice: A session had already been started – ignoring session_start()
La situación es la siguiente, tenemos la sesión iniciada, con session_start() y debido a que cargamos otro componente de la página que no sabe si la sesión está iniciada, volvemos a hacer la llamada. No se trata de un error sino de una notice, pero aún así podemos evitarla:
if (!isset ($_COOKIE[ini_get('session.name')])){ session_start(); }
Notice: Constant MI_CONSTANTE already defined in
Cuando usamos constantes en PHP (para guardar por ejemplo los datos de conexión a la base de datos), es posible que redeclaremos en dos script diferentes la misma variable y salte un aviso. Para evitarlo haremos lo siguiente:
if (defined('PRUEBA')){ echo PRUEBA; }
Notice: Use of undefined constant MI_CONSTANTE – assumed ‘MI_CONSTANTE’
Si a la hora de definir constantes cometemos el error de no usar comillas (me da la sensación de que alguna vez ha estado permitido), PHP no devuelve un error, pero sí un aviso. Os enseño el error y cómo solucionarlo:
define(DB_HOST, "localhost"); // notice define("DB_HOST", "localhost"); // bien
Faltan muchos, ¿cuál quieres comentar?