2

可能重复:
Cookie 仅在刷新时显示?

我正在尝试设置一个基本的 PHP cookie,它会记住使用哪种颜色主题。但是,当我对其进行测试时,在设置和颜色主题的显示之间存在一次刷新滞后。

澄清一下:我有一个选择表单,允许用户选择颜色。然后,有一个应用按钮。一旦选择了应用按钮,页面应该会自动设置 cookie 并显示颜色。但是,当应用按钮被按下时,只有 cookie 被设置,并且在用户点击刷新按钮之前不会显示主题。关于如何解决这个问题的任何想法?

$help = $_POST["theme"];
    $color = "#" . $help;
    setcookie("TestCookie", $color, time()+60*60*24);
    $recolor = $_COOKIE["TestCookie"];
    echo '<style type="text/css"> body { background: '.$recolor.' } </style>';

其中 $_POST["theme"] 是选择表单名称。非常感谢!this: Cookie 只在刷新时显示?是我在说什么,但使用 PHP,而不是 C#

编辑:感谢所有回复!我设法通过将背景颜色设置为用户在设置 cookie 时选择的任何内容来解决此问题。因此,当用户最初选择颜色时,并不是 cookie 设置了背景。这是另一个功能。感觉有点便宜,但是好用!

4

5 回答 5

5

$_COOKIE 超全局变量在您请求该页面时具有可用的 cookie,这就是为什么您永远不会看到刚刚保存的值的原因

在http://php.net/set_cookie的手册页上,您可以看到:

一旦设置了 cookie,就可以在下一页加载时使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。

于 2012-07-13T13:44:33.630 回答
3

那是因为 setcookie 没有修改 $_COOKIE 变量。您必须使用setcookie并同时在 $_COOKIE 中设置相关值

于 2012-07-13T13:45:02.780 回答
2

我希望这是因为您正在设置 cookie,然后检查下一行代码中的值 - 您还看不到它,因为此时客户端将发送该页面的请求,其中还不包括 cookie。

您可以尝试使用 a$_SESSION代替 - 只需将您对$_COOKIE$_SESSION 的引用全部交换即可。

如果做不到这一点,请尝试明确检查表单是否刚刚提交,并根据他们刚刚提交的值设置样式。

于 2012-07-13T13:45:06.267 回答
2

添加到ShogunArts.de的 solotion 时,当 you 时setcookie(),这个“命令”必须首先通过 HTTP 标头发送到浏览器。当您尝试访问超级全局时同样适用,$_COOKIE它不会包含 cookie 值,除非浏览器也通过 HTTP 标头返回。

这是发生的事情:

  1. 请求的页面(浏览器还没有 cookie)
  2. setcookie()叫。
  3. 脚本完成执行,现在它将响应浏览器告诉它设置 cookie。
  4. 当浏览器拥有 cookie 后再次访问该页面时,它将与请求一起发送。
  5. 现在 PHP 已经收到一个带有 cookie 的请求,它设置了$_COOKIE超级全局,现在您可以使用您的脚本访问它。
于 2012-07-13T13:49:49.127 回答
1

询问是否设置了 cookie:

if(isset($_COOKIE["TestCookie"])) $recolor = $_COOKIE["TestCookie"]; 
else $recolor = $color;
于 2012-07-13T13:47:56.147 回答