2012-02-23 56 views
0

我使用此代码设置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 

} 

虽然饼干的所有三个在我的浏览器设定,它仍然运行if()声明。通过消除过程,我发现中间cookie !isset($_COOKIE['secret'])似乎会导致if()语句运行,即使在我的浏览器中设置了Cookie secret。脚本说,当我看着我的浏览器并且它已被设置时,它没有被设置。你能想出任何理由为什么PHP说它没有设置?

+0

你的代码适合我。该块在第一次访问时被执行,因为$ _COOKIE没有被setCookie中的值填充。在进一步调用时,该块不再执行。你有没有机会安装cookie拦截器? – Basti 2012-02-23 14:53:49

+1

你用什么工具来判断这个cookie是否存在?萤火虫?看起来很奇怪...... – 2012-02-23 14:54:54

回答

0

使用

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

这不回答我的问题,为什么我的代码不工作?当它适用于其他两个饼干时。 – Frank 2012-02-23 14:50:54

+1

'array_key_exists($ _ COOKIE,'secret')=== isset($ _ COOKIE ['secret'])'并且OP不想'检查它是否为空。问题仍然存在 – Basti 2012-02-23 14:52:32

+1

@Basti抱歉是不一样的,如果array_key_exists检查密钥是否存在,isset检查值是否存在,当值为null时,isset将返回false。 – silly 2012-02-23 14:58:28

7

setcookie只定义要与HTTP标头的其余部分一起发送cookie,他们可以在与$_COOKIE下一个页面加载访问。使用您的代码,HTTP头不会被发送。

你只需要setcookie当cookie没有设置。像:

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

那么如何解决这个问题呢? – Frank 2012-02-23 14:54:12

+0

请勿使用$ _COOKIE来存储您的信息。分离变量$ token,$ secret和$ key。并使用$ _COOKIE中的值加载它们。如果$ _COOKIE为空,则手动初始化它们并调用setCookie。 – Basti 2012-02-23 14:58:11

+0

或者如果用户没有设置cookie,请执行'setCookie'并使用'header()'重新将用户重定位到同一站点。 – Basti 2012-02-23 14:59:21