【问题标题】:php $_COOKIE issetphp $_COOKIE isset
【发布时间】:2012-03-13 23:45:46
【问题描述】:

我正在使用此代码设置 cookie,然后查看它们是否存在

setcookie("token", "value", time()+60*60*24*100, "/");
setcookie("secret", "value", time()+60*60*24*100, "/");
setcookie("key", "value", time()+60*60*24*100, "/");

if (!isset($_COOKIE['token']) || !isset($_COOKIE['secret']) || !isset($_COOKIE['key'])) {

// do something because one of the cookies were not set

}

即使在我的浏览器中设置了所有三个 cookie,它仍然运行 if() 语句。通过消除过程,我发现中间的 cookie !isset($_COOKIE['secret']) 似乎会导致 if() 语句运行,即使在我的浏览器中设置了 cookie secret。当我查看浏览器并已设置时,脚本说它尚未设置。你能想到 php 说它没有设置的任何原因吗?

【问题讨论】:

  • 您的代码对我有用。该块在第一次访问时执行,因为 $_COOKIE 尚未填充来自 setCookie 的值。在进一步调用时,不再执行该块。你有没有安装过 cookie 拦截器?
  • 您使用什么工具来判断该 cookie 是否存在?萤火虫?看起来很奇怪...

标签: php cookies


【解决方案1】:

setcookie 只定义了一个 cookie 与其余的 HTTP 标头一起发送,并且可以在下一页加载时使用 $_COOKIE 访问它们。使用您的代码,不会发送 HTTP 标头。

当未设置 cookie 时,您只需要 setcookie。喜欢:

if (!isset($_COOKIE['token'])) {
    setcookie("token", "value", time()+60*60*24*100, "/");
}

【讨论】:

  • 不要使用 $_COOKIE 来存储您的信息。已分隔变量 $token、$secret 和 $key。并使用 $_COOKIE 中的值加载它们。如果 $_COOKIE 为空,手动初始化它们并调用 setCookie。
  • 或者如果用户没有设置 cookie,请执行 setCookie 并使用 header() 再次将用户重新定位到同一站点。
  • 如果您想立即访问它,也可以在设置后将 cookie 强制放入数组中...setcookie("token", "value"); 然后$_COOKIE['token'] = "value";
【解决方案2】:

使用

if(true === array_key_exists('secret', $_COOKIE) && strlen($_COOKIE['secret']) > 0) {
}

【讨论】:

  • 这不能回答我的问题,为什么我的代码不能工作?当它适用于其他两个 cookie 时。
  • array_key_exists($_COOKIE, 'secret') === isset($_COOKIE['secret']) 并且 OP 不想检查它是否为空。问题仍然存在
  • @Basti sorry不一样,如果array_key_exists检查key是否存在,isset检查value是否存在,当value为null时isset返回false。
  • 你是对的。 array_key_exists 还假定 $_COOKIE 是一个数组。如果不是,array_key_exists 将失败并显示警告。但我们可以放心地假设 $_COOKIE 对于每个脚本都是数组类型。我们还可以假设 $_COOKIE 中的值是字符串,因为它们是在 HTTP-Request 中传递的。因此,当使用 $_COOKIE 时,这两个调用实际上是相同的,除非您事先修改 $_COOKIE。
  • 讨厌附和这么古老的东西,但对于后代,array_key_exists 在示例中是倒退的。应该是array_key_exists('secret', $_COOKIE)
【解决方案3】:

作为我的测试,我们不能同时使用cookies。如果你设置cookies。你需要重新加载页面来获取这些。 像这样放

if (!isset($_COOKIE['token'])) {
    setcookie("token", "value", time()+60*60*24*100, "/"); //这是第一次设置cookie
}

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2012-12-15
    • 1970-01-01
    • 2017-04-10
    • 2017-12-16
    • 2012-01-22
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多