Headers already sent error

Hola gente, que tal, estoy tratando de programar un pequeño CMS en php para un sistemita en mi laburo... pero estoy teniendo un gran...

La FAQ Headers already sent error tiene

Pertenece a la categoría:
Pregunta
Hola gente, que tal, estoy tratando de programar un pequeño CMS en php para un sistemita en mi laburo... pero estoy teniendo un gran problema...




Yo tengo un archivo index que carga un módulo llamado "alta". ahí muestro un formulario HTML en el cual el usuario completa varios campos. Cuando el usuario envía el formulario, va por POST hacia un archivo llamado validar.php.




Si en validad.php veo que está todo OK entonces almaceno en la base de datos... si no me gustaría volver al index.php del módulo alta (en donde estaba el formulario) y para eso hago un header("Location:index.php?mod=cargar"); y me tira este error:




*Warning*: Cannot modify header information - headers already sent by (output started at /var/www/html/misitio/hidro/modulos/alta/validar.php:1) in */var/www/html/*misitio*/hidro/modulos/alta/validar.php* on line *45




*Cómo tengo que hacer para hacer funcionar esto.. así hablando muy en general... estuve probando con ob_strart() ... pero no pude solucionar el problema... hay alguna otra manera de redireccionar en php??
Respuesta de Jorge Molina
Ese error aparece cuando "imprimes" algo en pantalla antes de enviar un header.


Esto de "imprimir" se refiere a que:



  1. Hay una línea en blanco
  2. Hay un texto que salio con un echo
  3. O hay un texto en html que se carga antes del header.

Siempre lo mejor es pensar que si es un header de redirección debe ir en una página totalmente en blanco porque si tiene algo antes arrojará error y lo que haya después del header no se verá.




En los casos es que hayan otro tipo de headers (De sesiones o cookies por ejemplo) corre la regla de que no debe haber nada antes o arrojará error.
Volver al árbol de categoríasVolver al árbol de categorías

Comentarios

leonardo sanchez

08/9/2006
Precisamente cuando comenzaba en php utilizaba la funcion header para redireccionar mis paginas pero note que es mas practico utilizar un comando javascript.

El codigo que utilizo es el siguiente...

<script LANGUAGE="JavaScript">
var pagina="url de la pagina"
function redireccionar()
{
location.href=pagina
}
setTimeout ("redireccionar()", 1000); // este es un tiempo para redireccionar.
</script>

Julio César Torres

18/9/2006
Algo parecido es un javascript dentro del codigo de php

echo "<script language='JavaScript'>";
echo "location = 'index.php?mod=cargar'";
echo "</script>";

Jorge Molina

24/9/2006
Debo manifestar que no estoy de acuerdo en que sea mejor con javascript porque:

1.- Dependemos de que este en el pc y funcione bien.
2.- Que no este deshabilitado.
3.- Consumimos recursos de la maquina innecesariamente (Al procesar el javascript
).
4.- En PHP el proceso es más transparente (No hay que esperar casi nada en comparación de havascript, el usuario no puede ver el codigo que lo hace, no puede detenerse el proceso, etc)

Oscar

19/10/2006
Despues del header, debes asegurar que no continua el script.
Este ejemplo es tomado del manual de PHP:

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>

Moisés Gómez Díaz

25/2/2007
Para poder enviar un header despues de haber enviado ya una cabecera puedes modificar tu archivo php.ini a la opcion output_buffering = 4096

Con eso se soluciona tu problema aunque lo que estás haciendo es incorrecto: validar a traves de otro archivo PHP

te recomiendo que hagas lo siguiente

suponiendo que tu modulo se llama alta.php y contiene el siguiente codigo
<form id="form1" name="form1" method="post" action="">
<label>campo_obligatorio
<input name="nombre" type="text" id="nombre" />
</label>
<input type="submit" name="Submit" value="Enviar" />
</form>


Puedes añadir antes del form algo asi:
<?php
if(empty($_POST['Submit'])) {
//aqui valido que $_POST['nombre'] exista con un if, hay muchas maneras de validar, por pereza hago ahorita
if(empty($_POST['nombre'])) print "ERROR FALTAN DATOS";
else {
//aqui hago mi insert, $myconeccion->query("INSERT INTO bla!");
//y lo redirecciono a un lugar donde solamente le diga que se inserto correctamente o a donde yo quiera
header("Location:index.php?msg=correcto")
}
}
?>

Nota que el action lo dejo como "", asi toma por default el mismo nombre del script para procesar la forma.
y que redirecciono si y solo si, el insert se hizo correctamente, sino solo sigue desplegando la misma forma.

Ricardo Niño

29/5/2007
Es raro y no se decir porque pero un script que me funciona en un servidor windows no me marca ese error de los headers, y uno con linux ubuntu al intentar correr el mismo script me marcaba el error de los headers. Buscando por aqui y por alla, casualmente me encontre con esta linea de codigo y todo funciono correctamente.

@ob_start("ob_gzhandler");

Hay que ponerla inmediatamente despues de abrir tu primera etiqueta <?php, es decir es la primera instruccion a realizar.

Espero les ayude

emmanuel

08/6/2009
posibles errores
yo he tenido el mismo problema y la una de las soluciones es revisar que no hubiese errores de sintaxis ni codigos html antes del header si vas a usar una pagina especial para llenar base de datos no es necesario usar las etiquetas head html y body por que son totalmente inesesarias.
http://fresprog.blogspot.com mas info sobre desarrollo web.

nailec

04/7/2009
Headers already sent error
excelente y gran ayuda ricardo...mil gracias hermano

HenryJim

28/12/2010
Ni siquiera un espacio
Probe y definitivamente ni siquiera permite un espacio en el editor antes del header, me parece muy mal que sea tan delicado, me llevo tiempo encontrar el error

Celia

06/7/2011
Fantastico
La verdad tengo programando un sistema y como batalle para redireccionar hasta que lei el post de utilizar location
echo "<script language='JavaScript'>";
echo "location = 'work_archivo.php'";
echo "</script>";

Super Gracias

carles

15/5/2012
Un poco tarde la respuesta
Otra posible solución, es codificar TODOS los archivos en utf8 sin Bom .. a mi me ha sacado del apuro jeje

Saludos

Macker

04/6/2012
Otra prosible solucion
Por si a alguno le ha pasado ademas, si siguen con los errores header already sent, y estan seguros de haber eliminado todos los espacio en blanco. Pueden tambien probar con verificar que no se ha guardado el archivo en UTF-8, si es asi deberian cambiarlo a UTF-8 sin BOM, esto se debe a que se envian algunos valores exadecimales que no vemos normalmente en un editor de texto y creemos que no hay nada alli, esto lo podemos hacer desde notepad++ por ejemplo.

Saludos y espero a alguien le sirva.
FAQ relacionadas
Volver al árbol de categoríasVolver al árbol de categorías