PHP - setcookie()无效

Tim*_*Tim 6 php cookies

如果您勾选复选框,我有这个页面设置一个cookie并回显一个字符串.字符串打印正确,但cookie永远不会设置,我不知道为什么.

<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'];
  ?>
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么上面的代码不起作用?

Mar*_*c B 13

PHP超级全局在脚本启动时填充,然后在脚本的生命周期内不再被PHP修改或触及.这意味着$_COOKIE代表在启动脚本的http请求中发送到服务器的cookie.它不会显示您在脚本生命周期中添加/更改/删除的任何Cookie.这些更改只会显示在NEXT请求中.

唯一的例外是$_SESSION,当你打电话时填充session_start().

如果您需要立即将这些值放在$ _COOKIE中,则必须手动添加它们,例如

setcookie('cookie', $value, ....);
$_COOKIE['cookie'] = $value;
Run Code Online (Sandbox Code Playgroud)


小智 8

根据 PHP 手册在 http://php.net/manual/en/function.setcookie.php

如果在调用此函数之前存在输出,则setcookie()将失败并返回FALSE。如果setcookie()成功运行,它将返回 TRUE。这并不表示用户是否接受了 cookie。

换句话说,函数 setcookie()不起作用,因为它在页面内。如果你想让它工作,你需要把这个函数放在页面之前,特别是在任何标题之前。

做这个:

<?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>
Run Code Online (Sandbox Code Playgroud)


Joh*_*nde 5

Cookie 在设置并发送新页面请求后才会生效。这是因为 cookie 是随页面请求一起发送的,它们只是不会神奇地出现在服务器上。

您的解决方案是在设置 cookie 后刷新页面。

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