【问题标题】:PHP cookie has a one refresh delay [duplicate]PHP cookie有一个刷新延迟[重复]
【发布时间】:2012-07-13 22:10:14
【问题描述】:

可能重复:
Cookie only displayed on refresh?

我正在尝试设置一个基本的 PHP cookie,它会记住 a 使用的颜色主题。然而,当我对其进行测试时,在设置和颜色主题的显示之间存在一次刷新延迟。

澄清一下:我有一个允许用户选择颜色的选择表单。然后,有一个应用按钮。一旦选择了应用按钮,页面应该会自动设置 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"] 是选择表单名称。非常感谢!这个:Cookie only displayed on refresh? 是我在说的,但是使用 PHP,而不是 C#

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

【问题讨论】:

  • @PeeHaa 他写道,这可能是重复的,但使用 C# 而不是 PHP :)
  • 而且不可能重复。他想知道当他点击应用按钮时如何设置主题的解决方法。
  • 一个简单的解决方法:使用 setcookie 设置 cookie 并同时设置超全局 $_COOKIE;这样它就可以在同一个请求中使用。
  • 是的,这就是我们想要做的。不过,我想我知道一种方法。
  • 真的很简单,如果你这样做 setcookie("TestCookie", $color, time()+60*60*24);你可以做 $_COOKIE['TestCookie'] = $color;紧随其后,它将按您的预期工作。

标签: php cookies


【解决方案1】:

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

在这里的手册页http://php.net/set_cookie 你可以看到:

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

【讨论】:

  • 但是我知道一个网站可以做完全相同的事情,如果用户选择蓝色,则将颜色设置为“蓝色”,并同时设置 cookie,全部使用 PHP
  • 他们可能会通过 javascript 设置 cookie.. 或者如果您确定它是 php-only,他们可能会在设置 cookie 时在 $_COOKIE 超全局变量中添加值
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我预计这是因为您正在设置 cookie,然后检查下一行代码中的值 - 您将无法看到它,因为此时客户端将发送请求对于尚未包含 cookie 的页面。

    您可以尝试使用 $_SESSION 代替 - 只需将您对 $_COOKIE 的引用替换为 $_SESSION。

    如果失败,请尝试明确检查表单是否刚刚提交,并根据他们刚刚提交的值设置样式。

    【讨论】:

    • set cookie() 函数呢?
    • 设置它:$_SESSION["color"] = $color; 并访问它:$recolor = $_SESSION["TestCookie"];
    【解决方案4】:

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

    会发生什么:

    1. 请求的页面(浏览器还没有 cookie)
    2. setcookie() 打来电话。
    3. 脚本执行完毕,现在它将响应浏览器,告诉它设置 cookie。
    4. 当浏览器拥有 cookie 后再次访问该页面时,它会将其与请求一起发送。
    5. 现在 PHP 收到了一个带有 cookie 的请求,它设置了 $_COOKIE 超级全局,现在您可以使用脚本访问它。

    【讨论】:

      【解决方案5】:

      询问是否设置了cookie:

      if(isset($_COOKIE["TestCookie"])) $recolor = $_COOKIE["TestCookie"]; 
      else $recolor = $color;
      

      【讨论】:

      • +1,我很喜欢。我不知道为什么它被否决了。虽然你没有解释什么,但我不认为这个答案is not useful
      • 可能是因为它之前有一个错误(忘记了键末尾的“],导致复制和粘贴问题)。但这正是 OP 想要的。引用:“但是,当按下应用按钮,仅设置 cookie,并且在用户点击刷新按钮之前不会显示主题。关于如何解决这个问题的任何想法?”所以他想在点击时设置主题,不想知道为什么 cookie 仅在刷新后可用。
      • 我解释的意思是你解释了你的答案,你只是转储了一个代码。但是我仍然认为答案非常有用,因为您是唯一真正提供解决方案的人。我会在我的回答中引用它。
      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2014-08-15
      • 2018-04-15
      • 2015-06-01
      • 2022-10-22
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多