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.

Logo PHP

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?

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Pingback: Bitacoras.com

  • Carlos

    Deberías explicar el típico error de “headers already send” cuando se intenta enviar un header con “header” o con “session_start” una vez se ha enviado un carácter. Remarcar también que ese carácter puede ser un espacio o un salto de línea al inicio de un archivo antes de un <?php

    Carlos

  • http://www.jcarazo.com F. Javier Carazo Gil

    @Carlos: tienes razón, ya está incluido ese error… mira que nos ha pasado veces a todos los que empezamos con PHP.

  • wArLeY996

    Y en el mismo comentario de Carlos esta otro error tipico…

    Cuando recien comienza el script segun la configuracion que tenga el php.ini
    es permitido: <?
    cuando no esta configurado te arroja error, por que naturalmente tiene que ser: <?php

    Saludos!

  • Xvier Rivera

    Hola, tengo problema con el Warning, ya no se que estoy haciendo mal: el error me lo manda en: header(“Location: $Target”); ya lei cambie cosas y no funciona no se que es
    alguein puede ayudarme????

    y el codigo es:

    <?php $UsuName= strtoupper( trim($_POST[textname]));
    $UsuPass= trim($_POST[textpsw]);
    $UsuIp= getenv(REMOTE_ADDR);
    $SerIp= getenv(LOCAL_ADDR);
    $totalRows_usuexist= 0;
    $UsuValid1= false;
    $UsuValid2= false;
    $UsuValid3= false;

    if(!empty($UsuName) and !empty($UsuPass)) {;

    $UsuValid1= true;
    require_once('Connections/LacNet.php');

    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
    {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

    $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

    switch ($theType) {
    case "text":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case "long":
    case "int":
    $theValue = ($theValue != "") ? intval($theValue) : "NULL";
    break;
    case "double":
    $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
    break;
    case "date":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case "defined":
    $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
    break;
    }
    return $theValue;
    }
    }

    mysql_select_db($database_almundo, $almundo);
    $query_usuexist = "SELECT * FROM usuarios WHERE usu_login = '$UsuName'";
    $usuexist = mysql_query($query_usuexist, $almundo) or die(mysql_error());
    $row_usuexist = mysql_fetch_assoc($usuexist);
    $totalRows_usuexist = mysql_num_rows($usuexist);

    if ($totalRows_usuexist 0) {;
    if ($UsuPass == $row_usuexist["usu_password"] and $row_usuexist["usu_status"] == 1) {;
    $UsuValid2 = true;
    }
    }
    }
    ?>

  • Juan Hernandez

    Muchas gracias! me fue muy útil este post! saludos