Cómo corregir el error de "Encabezados ya enviados" en PHP




redirect php (9)

Este mensaje de error se activa cuando se envía algo antes de enviar los encabezados HTTP (con setcookie() o header() ). Las razones comunes para generar algo antes de los encabezados HTTP son:

  • Espacio en blanco accidental, a menudo al principio o al final de los archivos, como este:

     <?php
    // Note the space before "<?php"
    ?>
    

Para evitar esto, simplemente omita el cierre ?> - No es obligatorio de todos modos.

  • Marcas de orden de bytes al principio de un archivo php. Examine sus archivos php con un editor hexadecimal para averiguar si ese es el caso. Deben comenzar con los bytes 3F 3C . Puede eliminar de forma segura BOM EF BB BF desde el inicio de los archivos.
  • Salida explícita, como llamadas a echo , printf , readfile , readfile , code before <? etc.
  • Una advertencia emitida por php, si la propiedad display_errors php.ini está establecida. En lugar de estrellarse en un error de programación, php corrige el error en silencio y emite una advertencia. Si bien puede modificar las configuraciones error_reporting o error_reporting , debería solucionar el problema.
    Las razones comunes son los accesos a elementos no definidos de una matriz (como $_POST['input'] sin usar empty o isset() para probar si la entrada está establecida), o usar una constante indefinida en lugar de un literal de cadena (como en $_POST[input] , tenga en cuenta las citas que faltan).

Activar el búfer de salida debería hacer que el problema desaparezca; toda la salida después de la llamada a ob_start(); se almacena en la memoria intermedia hasta que libera el búfer, por ejemplo, con ob_end_flush .

Sin embargo, aunque el búfer de salida evita los problemas, realmente debe determinar por qué su aplicación genera un cuerpo HTTP antes del encabezado HTTP. Eso sería como tomar una llamada telefónica y hablar sobre su día y el clima antes de decirle a la persona que llama que tiene el número equivocado.

Cuando ejecuto mi script, recibo varios errores como este:

Advertencia: No se puede modificar la información del encabezado: los encabezados ya enviados por (la salida comenzó en /some/file.php:12 ) en /some/file.php en la línea 23

Las líneas mencionadas en los mensajes de error contienen llamadas de header() y setcookie() .

¿Cuál podría ser la razón de ésto? ¿Y como arreglarlo?


PROBLEMAS COMUNES:

(Copiado de: source )

====================

1) no debe haber ninguna salida (es decir, echo.. o códigos HTML) antes del header(.......); mando.

2) eliminar cualquier espacio en blanco (o nueva línea ) antes de las etiquetas <?php and after ?> .

3) REGLA DE ORO! - compruebe si ese archivo php (y también, si include otros archivos) tiene UTF8 sin codificación BOM (y no solo UTF-8 ). Eso es un problema en muchos casos (porque el archivo codificado en UTF8 tiene un carácter especial al inicio del archivo php, que su editor de texto no muestra) !!!!!!!!!!!

4) Después del header(...); debes usar exit;

5) siempre use referencia 301 o 302:

header("location: http://example.com",  true,  301 );  exit;

6) Active el informe de errores. Y dile el error.

7) Si ninguno de los anteriores ayuda, use la redirección de JAVSCRIPT (sin embargo, es un método altamente no recomendado), puede ser la última oportunidad en casos personalizados ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

Es por esta línea:

printf ("Hi %s,</br />", $name);

No debe imprimir / hacer eco de nada antes de enviar los encabezados.


Un consejo simple: ¡Un espacio simple (o carácter especial invisible) en su script, justo antes de la primera etiqueta <?php , puede causar esto! Especialmente cuando estás trabajando en un equipo y alguien está utilizando un IDE "débil" o se ha metido en los archivos con editores de texto extraño.

He visto estas cosas;)


Tú lo haces

printf ("Hi %s,</br />", $name);

Antes de configurar las cookies, lo que no está permitido. No puede enviar ninguna salida antes de los encabezados, ni siquiera una línea en blanco.


A veces, cuando el proceso dev tiene estaciones de trabajo WIN y sistemas LINUX (hosting) y en el código no ve ninguna salida antes de la línea relacionada, podría ser el formato del archivo y la falta de la línea de Unix LF (salto de línea ). .

Lo que normalmente hacemos para solucionar esto rápidamente es cambiar el nombre del archivo y, en el sistema LINUX, crear un nuevo archivo en lugar del nuevo, y luego copiar el contenido. Muchas veces esto resuelve el problema, ya que algunos de los archivos que se crearon en WIN una vez que se movieron al alojamiento causan este problema.

Esta solución es una solución fácil para los sitios que administramos mediante FTP y, en ocasiones, puede ahorrarle tiempo a los nuevos miembros de nuestro equipo.


En lugar de la línea de abajo

//header("Location:".ADMIN_URL."/index.php");

escribir

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

o

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Definitivamente va a resolver su problema. Me enfrenté al mismo problema, pero lo resolví escribiendo la ubicación del encabezado de la forma anterior.


Recibí este error muchas veces antes. Y estoy seguro de que todos los programadores de PHP al menos una vez obtuvieron este error. Para resolver este error, puede resolver la solución de uso según su nivel de problema:

Posible solución 1:

Es posible que haya dejado espacios en blanco antes o después (al final del archivo después de?>), Es decir,

THERE SHOULD BE NO BLANK SPACES HERE
<?php  

   echo "your code here";

?>
DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.

La mayoría de las veces esto debería resolver su problema. Verifique todos los archivos asociados con el archivo que require .

Nota: A veces, EDITOR (IDE) como gedit (un editor de linux predeterminado) agrega una línea en blanco al guardar el archivo guardado. Esto no debería suceder. Si está utilizando Linux. puede usar el editor VI para eliminar espacios / líneas después de?> al final de la página.

Si este no es su caso, entonces puede usar ob_start para el búfer de salida como se muestra a continuación:

Posible solución 2:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Esto activará el búfer de salida y sus encabezados se crearán después de que la página esté en búfer.


Generalmente este error surge cuando enviamos encabezado después de hacer eco o imprimir. Si este error surge en una página específica, asegúrese de que la página no tenga ningún eco antes de llamar a start_session() .

Ejemplo de error impredecible:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Un ejemplo más:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Conclusión: no genere ningún carácter antes de llamar a session_start() o header() funciones ni siquiera un espacio en blanco o una nueva línea





header