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.

Complementar la respuestaComplementar la respuesta
Volver al árbol de categoríasVolver al árbol de categorías

Comentarios
Fueron enviados 8 comentarios a la faq
2 comentarios no revisados
6 comentarios revisados:
Por: leonardo sanchez
08/9/06
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>
Por: Julio César Torres
18/9/06
Algo parecido es un javascript dentro del codigo de php

echo "<script language='JavaScript'>";
echo "location = 'index.php?mod=cargar'";
echo "</script>";
Por: Jorge Molina
24/9/06
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)
Por: Oscar
19/10/06
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;
?>
Por: Moisés Gómez Díaz
25/2/07
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.
Por: Ricardo Niño
29/5/07
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

Volver al árbol de categoríasVolver al árbol de categorías
Alojados en el grupo