Tengo algunas líneas de script en el encabezado de un archivo mezclado con php:

    <script>$( "#company" ).autocomplete({
        source: "<?php echo  $absolute_site . "autocomplete/autocompletecompany.php" ?>"....
.............
<script>

Más adelante en el archivo, pase un comando php:

 header("Location: index.php?act=edit&peopleID=$last_peopleID")

Pero consigo

Advertencia: no se puede modificar la información del encabezado; los encabezados ya se enviaron

Y la advertencia se refiere a la línea php en el script.

¿Cómo hacer esto sin recibir la advertencia? ¡Gracias!

EDITAR Después de leer el Cómo corregir el error "Encabezados ya enviados" en PHP pregunta (y respuestas) y la respuesta de Okneloper a mi pregunta original, modifiqué el título y propongo la solución que he usado, con la esperanza de que esta pregunta ya no sea un duplicado y pueda ser útil para alguien más que ha incurrido en el mismo problema.

SOLUCIÓN

Mi archivo de formulario incluía: la parte php

 if (isset ($_POST["submit"]) ){ 
           .... all the sql commands including the:
           header("Location:pathtopage")
} 

Y la presentación del formulario html:

<form> ...my form </form>

El problema fue porque el archivo de plantilla estaba llamando al archivo de formulario en el cuerpo, es decir, después de los encabezados. Para evitar esto, en el archivo de formulario, coloco toda la salida del formulario en una función.

 function output_form(){
  <form> ...my form </form>      
 } 

En el archivo de plantilla, como primera línea incluí el archivo de formulario. Luego, más adelante en el cuerpo (donde quiero imprimir mi formulario) llamé a la función de salida del formulario.

<?php include ('formfile.php'); /* no spaces before <!!!! */ ?>

Más tarde en el cuerpo

<?php form_output(); ?>

Espero que esto pueda ayudar!

php
0
codeispoetry 27 ene. 2016 a las 20:18

2 respuestas

La mejor respuesta

Debe enviar encabezados antes de realizar cualquier salida o habilitar el almacenamiento en búfer de salida en la parte superior del script:

ob_start();

Los encabezados se envían antes del cuerpo de la respuesta, por lo que si ha iniciado la salida del cuerpo, los encabezados no se pueden cambiar ni agregar.

1
Okneloper 27 ene. 2016 a las 17:23

Los encabezados ya están enviados, lo que significa que no puede modificarlos. Si desea personalizar los encabezados, debe hacerlo antes de que se envíen (parte superior de la página).

Si está intentando redirigir en PHP, use javascript. Así es como lo haces en línea:

function redirect($url){
    $string = '<script type="text/javascript">';
    $string .= 'window.location = "' . $url . '"';
    $string .= '</script>';
    echo $string;
}

//later in the page
redirect('example.com/my/url/here/01.');
1
Tuesdave 27 ene. 2016 a las 17:22