2010-04-17 8 views
28

Ich bin neu in PHP, übte ich PHP setcookie() gerade jetzt und sind gescheitert.setcookie, kann nicht modify header information - Header gesendet bereits

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"]; 

?> 

Aber ich nicht index.php, IE Warnung wie diese ausgeführt werden.

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 

Ich habe meinen IE 6 Cookie ohne Zweifel aktiviert.

Gibt es etwas falsch auf mein Verfahren oben? Vielen Dank.

WinXP OS und XAMPP 1.7.3 verwendet.

Antwort

45

Die Warnung ist klar.

Warnung: Kann nicht modify header information - headers already sent by (Ausgang bei C gestartet: \ xampp \ htdocs \ test \ index.php: 9) in C: \ xampp \ htdocs \ test \ index.php on Zeile 12

Cookies werden im HTTP-Antwortheader gesendet. Da der HTML-Inhalt bereits gestartet wurde, können Sie nicht zum Header zurückkehren und den Cookie hinzufügen.

Von http://php.net/setcookie:

setcookie() einen Cookie definiert zusammen mit dem Rest der HTTP-Header gesendet werden. Wie andere Header müssen Cookies vor jede Ausgabe von Ihrem Skript gesendet werden (dies ist eine Einschränkung des Protokolls). Dazu müssen Sie vor jeder Ausgabe Aufrufe an diese Funktion senden, einschließlich und <head> Tags sowie Leerzeichen.

verschieben, dass setcookie Anweisung vor jedem HTML angezeigt:

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

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

@KennyTM, Eine weitere Frage. Ich habe den Code getestet, es funktioniert gut. Aber als ich eine andere ** viewMore.php ** erstellt habe, die den gleichen Code wie die ** view.php ** verwendet. Aber viewTwo.php befindet sich in ** http: //localhost/testMore/viewMore.php**. (Anderes Verzeichnis) Ich konnte den Cookie-Wert mit viewMore.php nicht "echo", sonst funktioniert die view.php noch gut. Kannst du mir bitte sagen warum? –

+0

@Nano: Setzen Sie den Parameter '$ path' auf'/'. Siehe das Dokument. – kennytm

7

Du schickst einige HTML, bevor Sie den Cookie gesetzt. Der Cookie muss vor dem Senden einer Ausgabe gesetzt werden, da er mit den Antwortheadern gesendet wird. Tun Sie dies:

<?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

Cookies werden in den Header der Übertragung der HTTP-Seite gesendet. Sobald Sie etwas ausgegeben haben, können Sie diese nicht mehr ändern.

Das Problem in Ihrem Fall liegt in Ihnen einige der HTML-Dokument, bevor Sie den Cookie setzen ausgibt.

Es gibt ein paar Möglichkeiten, es zu lösen; von denen eine Einstellung des Cookie vor irgendetwas auf der Seite wie so

<?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> 

Alternativ zum Ausgeben, können Sie Ihre Ausgangspuffer könnten, so dass nichts, bis Sie es ausdrücklich sagen zu

Weiteren
<?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 
?> 

geschrieben wird Informationen zu diesem letzten Ansatz finden Sie in den Funktionen ob_start und ob_end_flush.

Es könnte auch nützlich sein, über setcookie zu lesen.

+0

Du hast meinen Tag gerettet :-) Danke Kumpel – Thamaraiselvam

8

Oder einfach drehen

output_buffering = On 

in Ihrem php.ini

http://digitalpbk.com/php/warning-cannot-modify-header-information-headers-already-sent Siehe für eine vollständige Lösung

+0

Dies ist die einzige Ursache und Lösung! Danke! Keines der oben genannten funktionierte für mich! Manchmal könnte es nützlich sein! aber was hast du gesagt! ist einfach toll! ~ – Hossein

+0

manchmal brauche ich Cookie in while loop innerhalb des Körpers .. so das mein Problem zu lösen. – rusly

1

Hier ist etwas wert der Suche nach ...

ich das gleiche Problem hatte und Gefunden war ein Leerzeichen nach dem Schließen ?> am Ende einer Datei, die ich an der richtigen Stelle vor jedem out enthalten war Put wurde erzeugt. Es hat mich verrückt gemacht!

Verwandte Themen