如何在PHP中更新cookie?

39
如果我用相同的cookie名称两次调用setcookie(),那么会创建两个cookie。
如何更新现有的cookie?

3
你是如何确认自己得到了两个饼干的? - deceze
1
我右键单击->编辑站点首选项->Cookie(Opera),然后我看到许多具有相同名称的Cookie。 - Cookie
6
这个账户(“Cookie”)确实是专门为发布两个关于饼干的问题而创建的。 - Seth B
5个回答

51
您可以使用setcookie()函数更新cookie的值,但是您应该在第四个参数中添加'/',这是'path'参数,以防止创建另一个具有相同名称的cookie。

例如:setcookie('cookie_name', 'cookie_value', time()+3600, '/');

建议的过期时间为第三个参数:

  • $exp_time = time()+3600; /* 1小时后过期 */
  • $exp_time = time()+86400; /* 1天后过期 */

从PHP文档中:如果设置为'/',则cookie将在整个域内可用。默认值是设置cookie的当前目录。 - Mapplesoft
3
为什么这不是被投票选择的答案? - user3050478
将域(第5个参数)设置为与现有cookie匹配同样重要。 - DustWolf

25

你无法更新一个cookie本身,但是可以覆盖它。 否则,您需要查找的是:http://php.net/manual/en/function.setcookie.php

它有效。请务必阅读该页面上的“常见陷阱”部分。

您也可以使用超级全局变量$_COOKIE['cookie_name']来读取cookie。


8
但它不起作用:((set_cookie('fuuuuu', rand(0, 3434543), $exp_date);,刷新后我会得到另一个具有相同名称但不同值的 cookie :| - Cookie
1
它们来自同一个域吗?www或no-www都算。 - Francisc
嗯,我没有设置域参数...但是Cookie是从一个域的页面设置的。 - Cookie
如果我添加路径参数(我添加了“/”),它可以工作,但我不明白这是为什么? - Cookie
4
我们不能使用 $_COOKIE['cookie_name'] 来修改 cookie,修改你的答案。 - Amir Fo
显示剩余3条评论

7
请确保在setcookie调用之前没有echosetcookie通过头部与浏览器进行通信,如果您之前已经调用了echo,则头部+正文已经被发送,服务器就不能再通过头部向浏览器发送setcookie了。这就是为什么您可能会发现它无法正常工作的原因。
在此情况下,php服务器日志文件中应该有如下报告警告的一行:
DEFAULT: PHP Warning:  Cannot modify header information - headers already sent by (output started at /path/to/your/script.php:YY) in /path/to/your/script.php on line XX

5
因此,虽然PHP会在指令下发送两个Set-Cookie: headers,但是只有最后一个应该在浏览器中持久保存。
Netscape cookie规范http://curl.haxx.se/rfc/cookie_spec.html表示:

相同路径和名称的实例将互相覆盖,以最新的实例为准。相同路径但不同名称的实例将添加额外的映射。

然而,避免这种边缘情况可能是明智的。重新构建您的应用程序,使其无需覆盖已发送的cookie。


-3

调用COOKIE并删除用户名值 SETCOOKIE(“username”,'',0,“/”);


只需使用新值设置一个cookie即可,这与“删除”原始cookie是相同的。 - mowgli
如果您仍在寻找解决方案,我已经找到了一个。使用ajax,您必须调用一个新的PHP页面,更改cookie的值并退出,在已经打开的页面上,您可以读取具有新值的cookie。PHP无法在同一页上更改和读取cookie。 - jalal-dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接