2009-11-24 15 views
9

Possible Duplicate:
Headers already sent by PHPerror de PHP: No se puede modificar la información de cabecera - cabeceras ya enviado

así que tengo esta salida en mi página .. no entender por qué tengo que aparecer. Soy nuevo en php, así que tal vez es algo fácil de arreglar

-Tengo un archivo header.php, que incluye toda la información importante, así como el titular de la página. Este header.php está incluido en cada página.

-Lo tengo comprobando el valor de la sesión para asegurar que el usuario tenga permiso para estar en una página determinada. Si el usuario no puede estar allí, los devuelvo a la página de inicio de sesión

Aquí es donde aparece el error. Esto es lo que tengo:

include_once ("header.php"); 

if ($_SESSION['uid']!='programmer') 
{       
header('Location: index.php'); 
echo 'you cannot be here'; 
exit; 
} 

El índice que está redirigiendo a también tiene la cabecera. Entonces, ¿estas referencias múltiples de encabezado me dan este error? ¡No veo otra manera de hacer esto y me está volviendo loco!

+2

¿Qué hay en el archivo "header.php"? –

+0

banner, config incluye para conectarme a db, y algunos jquery. Archivo muy importante. – Marcus

+1

¿Por qué se llama 'header.php'? ¿Por qué no 'init.php' o algo así? – ceejayoz

Respuesta

32

No puede usar header() una vez que el texto ha sido enviado al navegador. Como su header.php incluye presumiblemente salidas HTML, no se puede usar header().

Puede resolver esto en un par de maneras:

  • Mover la sentencia if por encima de la cabecera incluyen (esto no funcionará, como usted ha indicado en los comentarios que header.php establece la sesión de fluido y otra vitales cosas).
  • Llame al ob_start() en la parte superior de la secuencia de comandos para almacenar la salida.
+4

También tenga en cuenta que a menos que En la salida de almacenamiento en búfer, este error se puede encontrar al tener incluso una sola línea en blanco (¿o espacio?) antes de la etiqueta php de inicio, porque incluso el espacio en blanco cuenta como salida a los efectos de determinar si puede enviar encabezados. – Dathan

+0

bien, así que agregué el encabezado include DESPUÉS de la declaración if, y eso eliminó el error, sin embargo, ahora cuando inicio sesión correctamente, me redireccionan al index.php sin importar qué ... ¿por qué es eso? URL: http://nait.jtlnet.com/~fpkj5v0r/index.php Usuario: Contraseña programador : prog123 -esta es ahora mi código: Marcus

+0

Y ya, gracias por el aviso Dathan, leí sobre el error de espacio en blanco, y no parece ser eso. ¡Desearía que fuera asi de fácil! – Marcus

6

Si el archivo header.php "tiene el banner", presumiblemente está produciendo contenido HTML en la página.

No puede emitir encabezados HTTP después de haber generado contenido.

6

No puede enviar ningún encabezado después de enviar cualquier otro contenido. Un culpable muy probable es el espacio en blanco adicional después de su etiqueta de cierre ?> en su header.php. En general, es una buena práctica omitir la etiqueta de cierre por completo en cualquier archivo php de solo script.

Su error debería decirle exactamente qué línea (y qué archivo) está enviando la salida.

1

Muy bien, así que está arreglado ... no estoy seguro de cómo, quizás alguien pueda explicar por qué esto funciona de repente.

Este es mi código:

include_once ("header.php"); 

if ($_SESSION['uid']!='programmer') { 
    if(isset($_SESSION['uid'])) { 
     echo $_SESSION['uid']; 
    }       

    header('Location: index.php'); 
    exit; 
} 

Repito, todo funciona ahora! PHP ... ¿por qué trabajas ahora?

+3

Eso no funcionará es $ _SESSION ['uid'] está configurado. Entonces, el eco ocurrirá antes de la llamada al encabezado, ¡lo cual es algo malo! Entonces, a menos que esté activando el buffer de salida en header.php, esto solo funcionará cuando $ _SESSION ['kid'] no esté configurado. –

+0

@PeterBagnall es correcto, la lógica es defectuosa; primero, está comprobando el valor $ _SESSION ['uid'] cuando cree que existe la posibilidad de que no esté configurado, y ENTONCES verifique si está establecido ... if (isset ($ _ SESSION ['uid'])) { debe ir en la primera instrucción if en su lugar. ** segundo **: la razón por la que podría funcionar es si $ _SESSION ['uid'] = NULL; por lo tanto, no se envían datos al navegador. – Valerie

1

me encontré con un error similar (también aparentemente de la nada) con respecto a una función de redireccionamiento, que solía ser de la siguiente manera:

function Redirect($url) { 
     flush(); // Flush the buffer 
     header("Location: $url"); // Rewrite the header 
     die; 
    } 

Al parecer, también es necesario añadir ob_flush(); para eliminar totalmente el viejo encabezado.La nueva función es:

function Redirect($url) { 
     flush(); // Flush the buffer 
     ob_flush(); 
     header("Location: $url"); // Rewrite the header 
     die; 
    } 

Espero que esto ayude a alguien más a tener este problema.

+0

No veo cómo funcionaría esto a menos que se utilizara ob_start() ... que no indicó en su código. Según PHP: flush() intenta ** empujar la salida actual hasta el navegador ** con algunas advertencias. Una vez que los datos de contenido se envían al navegador, no hay forma de volver atrás y editar los encabezados. http://php.net/manual/en/function.flush.php – Valerie

Cuestiones relacionadas