【问题标题】:setcookie does not work the second time aroundsetcookie 第二次不起作用
【发布时间】:2011-10-04 12:07:01
【问题描述】:

我正在编写一个脚本,该脚本允许在我的网站的移动视图和桌面视图之间切换。我完成它的方法是在用户单击“桌面”时在系统上放置一个 cookie,并在用户单击“移动”时删除 cookie。

系统第一次工作时放置 cookie 并发生重定向。如果 cookie 存在,我的脚本还会读取 index.php 上的 cookie 以提供桌面视图。当用户再次点击“移动”时,我会删除 cookie 并运行 USER AGENT 检查。

第二次,当我点击“桌面”链接时,cookie 未设置,脚本无法执行。这可能是什么错误?

感谢您的宝贵时间

编辑:我正在通过 setcookie("mobile", "web",time()+31536000, "/"); 来创建 cookie;

通过setcookie("mobile", "",time()-60, "/");删除cookie

从 HTTP Headers 中我可以看到第一次执行脚本时传递了 Set-Cookie 参数,但是在我删除 cookie 并再次尝试后,没有传递 setcookie 参数。

【问题讨论】:

  • 脚本执行失败时,是否记录了错误?你能提供来源吗?这里没有足够的信息来确定原因或解决方案。
  • 没有错误记录,因为如果案例不存在,脚本将重定向到适当的视图。我查看了 HTTP 标头,发现与第一次执行相比,第二次没有传递 Set-Cookie 参数。
  • 这是一个 PHP Web 应用程序,目前正在我的本地机器上开发。没有相同的在线 URL。
  • 把逻辑倒过来有用吗? setcookie("版本", "移动", time()+31536000, "/"); setcookie("版本", "桌面", time()+31536000, "/");这样您就可以跟踪他们喜欢的页面版本,而无需明确删除 cookie。
  • 感谢@GregSchoen。我尝试做同样的事情,但没有成功。

标签: php cookies setcookie


【解决方案1】:

1:你是否正确设置了cookie的长度?确保使用

将其设置为未来
setcookie("Cookie", $value, time()+3600);

2:我也建议不要删除 cookie,为什么不将其设为真或假。这可能会解决您与删除有关的错误。

就我个人而言,setCookie 的用法与您的(移动网站)类似,我从来没有遇到过任何问题,但我总是只使用 mobileEnabled,然后将其设置为 true 或 false,如果它不存在,则 PHP 默认为它们的任何值正在使用,如果确实存在,则意味着客户端有偏好并使用他们设置的任何内容。

【讨论】:

  • cookie的长度设置为未来一年
  • setcookie("mobile", "web",time()+31536000, "/");
  • 我的第二个建议怎么样? cookie 代码看起来正确。
  • 我尝试将值更改为 "" 而不是通过将 cookie 时间更改为 time() - 60 来删除 cookie,但没有运气。
  • 我查看了 HTTP 标头,发现 Set-Cookie 参数没有像第一次执行那样第二次传递。觉得这很奇怪。
【解决方案2】:

首先,您应该将代码添加到您的问题中,以便我们了解您是如何设置 cookie 的。所以我在胡乱猜测,说你没有设置 cookie 的路径。

来自php.net documentation

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

第四个参数是 $path 并且默认是设置 cookie 的当前目录。这意味着,我不得不再次猜测,如果你在一个目录中 /desktop 并且你设置了 cookie仅适用于该目录。一旦发生重定向并且您在其中,让我们猜测 /mobile 您的 cookie,虽然已设置,但不适用。如果您希望 cookie 在所有路径(即域)中可见,则已将路径明确设置为 /。当然,除非您将 cookie 设置在根目录,但您很幸运。

【讨论】:

  • 他已经设置了路径,见上面我帖子的评论。
  • 太好了,现在我明白了。不过在这个问题上会更好
  • 谢谢阿德里安。我已将问题修改为现在具有代码和 HTTP 信息。设置 cookie 后,当我观看 Firefox 的 Cookie 控制台时,我看到 Path 设置为 '/'
【解决方案3】:

来自 php.net:

setcookie() 定义了一个 cookie 与其余的 HTTP 标头一起发送。与其他标头一样,cookie 必须在脚本的任何输出之前发送(这是协议限制)。

您是否确定您的网站在删除和编写新的内容时不会生成任何输出 曲奇饼?检查一些(用于调试) echo() 语句。我也遇到过这种情况...

:: 编辑因为评论 ::

<?PHP

// write cookie
setcookie("TestCookie", "some value", time()+3600);

// expire coockie (delete)
setcookie("TestCookie", "some value", time()-1);

// write cookie
setcookie("TestCookie", "some value", time()+3600);

【讨论】:

  • 感谢 Layticia,cookie 被设置在一个单独的文件中,它只包含 4 行,'setcookie' 和 'header redirection'。我正在检查 index.php 中的 cookie 以执行用户代理查看。尝试使用“echo”进行调试,cookie 似乎可以很好地重置/删除。出现问题的地方是再次设置具有相同名称/值的cookie。
  • 我现在已经通过简单的测试进行了尝试。由于 块,我在初始答案中添加了代码。这种方式就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2014-01-31
  • 2015-06-21
  • 1970-01-01
  • 2020-04-16
  • 2011-11-10
  • 2019-11-25
相关资源
最近更新 更多