2010-04-17 11 views
28

Soy nuevo en PHP, practiqué PHP setcookie() en este momento y fallé.setcookie, No se puede modificar la información del encabezado - Encabezados ya enviados

http://localhost/test/index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 
    <?php 
    $value = 'something from somewhere'; 

    setcookie("TestCookie", $value); 
    ?> 
    </body> 
</html> 

http://localhost/test/view.php

<?php 
// I plan to view the cookie value via view.php 
echo $_COOKIE["TestCookie"]; 

?> 

Pero no pude correr index.php, IE advertencia como esta.

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\test\index.php:9) in C:\xampp\htdocs\test\index.php on line 12 

He habilitado mi cookie IE 6 sin duda.

¿Hay algún problema en mi procedimiento anterior? Gracias.

WinXP OS y XAMPP 1.7.3 utilizados.

Respuesta

45

La advertencia es clara.

Advertencia: No se puede modificar la información de cabecera - cabeceras ya enviado por (la producción empezó en C: \ xampp \ htdocs \ test \ index.php: 9) en C: \ xampp \ htdocs \ test \ index.php on línea 12

Las cookies se envían en el encabezado de respuesta HTTP. Dado que el contenido HTML ya se inició, no puede volver al encabezado y agregar la cookie.

De http://php.net/setcookie:

setcookie() define una cookie para ser enviada junto con el resto de las cabeceras HTTP. Al igual que otros encabezados, las cookies deben enviarse a antes de cualquier resultado de su secuencia de comandos (esta es una restricción de protocolo). Esto requiere que realice llamadas a esta función antes de cualquier salida, incluidas las etiquetas <html> y <head>, así como cualquier espacio en blanco.

movimiento que setcookie declaración ante todo el código HTML aparece:

<?php 
$value = 'something from somewhere'; 

setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
.... 
+0

@KennyTM, una pregunta más. Probé el código, funciona bien. Pero cuando creé otro ** viewMore.php ** que usa el mismo código que ** view.php **. Pero viewTwo.php ubicado en ** http: //localhost/testMore/viewMore.php**. (Directorio diferente) no pude 'eco' el valor de la cookie con viewMore.php, de lo contrario, view.php aún funciona bien. ¿Podría decirme por qué? –

+0

@Nano: establezca el parámetro '$ path' en'/'. Ver el documento. – kennytm

7

Está enviando algo de HTML antes de configurar la cookie. La cookie debe establecerse antes de enviar cualquier salida, ya que se envía con los encabezados de respuesta. Haga esto:

<?php 
$value = 'something from somewhere'; 
setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 

    </body> 
</html> 
19

Las cookies se envían en las cabeceras de la transmisión de la página HTTP. Una vez que das algún resultado, ya no puedes modificarlos.

El problema en su caso radica en la salida de parte del documento HTML antes de intentar establecer la cookie.

Hay algunas maneras de resolverlo; uno de los cuales está estableciendo la cookie antes de la salida a cualquier cosa en la página como tal

<?php 
    $value = 'something from somewhere'; 
    setcookie("TestCookie", $value); 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 

    </body> 
</html> 

Como alternativa, puede amortiguar su salida para que nada se escribe hasta que le indique explícitamente que

<?php 
    ob_start(); // Initiate the output buffer 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 

    </head> 
    <body> 
    <?php 
     $value = 'something from somewhere'; 
     setcookie("TestCookie", $value); 
    ?> 
    </body> 
</html> 
<?php 
    ob_end_flush(); // Flush the output from the buffer 
?> 

Para obtener más información sobre este último enfoque, eche un vistazo a las funciones ob_start y ob_end_flush.

También puede ser útil leer sobre setcookie.

+0

Me salvaste el día :-) gracias amigo – Thamaraiselvam

8

O simplemente gire

output_buffering = On 

en su php.ini

Consulte http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent para una solución completa

+0

¡Esta es la única causa y solución! ¡gracias! ninguno de los anteriores funcionó para mí! ¡A veces, en algún lugar, podría ser útil! pero lo que dijiste! ¡es simplemente genial! ~ – Hossein

+0

a veces necesito poner la galleta dentro del bucle dentro del cuerpo ... así que esto también soluciona mi problema ... – rusly

1

aquí hay algo digno de mirar hacia fuera para ...

que tenía el mismo problema y encontré que había un ESPACIO después del cierre ?> al final de un archivo que estaba incluyendo en el lugar correcto antes de cualquier salida poner se estaba generando. ¡Me estaba volviendo loco!

Cuestiones relacionadas