简体   繁体   中英

PHP – setcookie() not working

I have this page that sets a cookie and echos out a string if you check a checkbox. The string prints correctly, but the cookie never gets set and I have no idea why.

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<label for="checkbox">Option 1:</label>
<input type="checkbox" name="checkbox" id="checkbox"><br>
<input type="submit" name="submit" value="Submit">
</form>
  <?php
if (isset($_POST['checkbox'])) {
  setcookie("cookie", "on", time()+3600*24);
  echo "You checked the checkbox and a cookie was set with a value of:<br>";
}
else {
  setcookie("cookie", "off", time()+3600*24);
  echo "You didn't check the checkbox and a cookie was set with a value of:<br>";
}
echo $_COOKIE['cookie'];
  ?>

Does anyone know why the above code does not work?

PHP superglobals are populated at script start-up time, and then are NOT modified or touched by PHP again for the life of the script. That means $_COOKIE represents the cookies that were sent to the server in the http request that fired up the script. It will NOT show any cookies you've added/changed/deleted during the life of the script. Those changes will only show up on the NEXT request.

The only exception to this is $_SESSION , which is populated when you call session_start() .

If you need those values to be in $_COOKIE immediately, you'll have to add them manually, eg

setcookie('cookie', $value, ....);
$_COOKIE['cookie'] = $value;

According to the PHP Manual at http://php.net/manual/en/function.setcookie.php :

If output exists prior to calling this function, setcookie() will fail and return FALSE . If setcookie() successfully runs, it will return TRUE . This does not indicate whether the user accepted the cookie.

In other words, the function setcookie() is not working because it is inside the page. If you want it to work, you will need to put that function before the page, specifically before any headers.

Do this:

<?php
  if ( isset($_POST['checkbox']) ) {
     setcookie("cookie", "on", time()+3600*24);
     echo "You checked the checkbox and a cookie was set with a value of:<br>";
  } else {
     setcookie("cookie", "off", time()+3600*24);
     echo "You didn't check the checkbox and a cookie was set with a value of:<br>";
  }

  echo $_COOKIE['cookie'];
?>
<!doctype html>
<html>
  <head>...</head>
  <body>
      <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
         <label for="checkbox">Option 1:</label>
         <input type="checkbox" name="checkbox" id="checkbox"><br>
         <input type="submit" name="submit" value="Submit">
      </form>
  </body>
</html>

Cookies don't kick in until after they are set and a new page request is sent. This is because cookies are sent with page requests, they just don't magically appear to a the server.

Your solution is to do a page refresh after setting the cookie.

// set cookie
setcookie("cookie", "off", time()+3600*24);
// not available because this cookie was not sent with the page request.
echo $_COOKIE['cookie'];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM