我有这个页面,它设置一个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'];
?>
有人知道为什么上面的代码不工作吗?
PHP超全局变量在脚本启动时填充,然后在脚本的生命周期内不会被PHP修改或触及。这意味着$_COOKIE
表示在启动脚本的http请求中发送到服务器的cookie。它不会显示您在脚本生命周期中添加/更改/删除的任何cookie。这些更改只会在下次请求时显示。
唯一的例外是$_SESSION
,它在调用session_start()
时填充。
如果你需要这些值立即在$_COOKIE中,你必须手动添加它们,例如
setcookie('cookie', $value, ....);
$_COOKIE['cookie'] = $value;
根据PHP手册http://php.net/manual/en/function.setcookie.php:
如果在调用此函数之前存在输出,setcookie()将失败并返回FALSE。如果setcookie()成功运行,它将返回真正。这并不表示用户是否接受了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>
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'];
最近我也遇到了这个问题。终于找到了正确的解决方案。第三个参数应该是getter然后是当前时间。使用方式如下:
$my_time = 100; //It's in second
setcookie($cookine_name, $cookine_value, time() + $my_time);