php $_COOKIE isset
Posted
技术标签:
【中文标题】php $_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 是否存在?萤火虫?看起来很奇怪... 【参考方案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
【讨论】:
以上是关于php $_COOKIE isset的主要内容,如果未能解决你的问题,请参考以下文章