Categorías: Tutoriales

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?

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • 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

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

  • 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!

  • 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;
    }
    }
    }
    ?>

Entradas recientes

DeepSeek

2 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

4 semanas hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace