setcookie, Cannot modify header information - headers already sent

Nano HE picture Nano HE · Apr 17, 2010 · Viewed 96.8k times · Source

I am new to PHP, I practised PHP setcookie() just now and failed.

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

?>

But I failed to run index.php, IE warning like this.

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

I enabled my IE 6 cookie no doubt.

Is there anything wrong on my procedure above? Thank you.

WinXP OS and XAMPP 1.7.3 used.

Answer

kennytm picture kennytm · Apr 17, 2010

The warning is clear.

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

Cookies are sent in the HTTP response header. Since the HTML content already started, you cannot go back to the header and add the cookie.

From http://php.net/setcookie:

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.

Move that setcookie statement before any HTML appears:

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

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