PHP:setcookie() 和 unset() 不删除 cookie
Posted
技术标签:
【中文标题】PHP:setcookie() 和 unset() 不删除 cookie【英文标题】:PHP: setcookie() and unset() not deleting the cookie 【发布时间】:2016-03-10 06:41:35 【问题描述】:好的,所以我得到了一个非常标准的 cookie 设置。我在某个事件上设置了 cookie,并在其中保存了一些垃圾。在特定的 $_GET 调用中,我想完全删除它,我尝试结合使用 unset()
和 setcookie()
来实现。我为此用途编写了一个名为 delCookie()
的特定函数。
现在奇怪的是:如果我用 if 子句捕获的 $_GET
变量调用 delCookie()
变量,cookie 会按预期消失。 (在此处删除 cookie 之前,我不会访问它。)
但是
如果我在将 cookie 内容写入 sqlite3
数据库之后调用 delCookie()
,(我访问 cookie)它不会被删除。
任何想法为什么?以及任何不需要我将删除信号保持在不访问 cookie 的情况下重新加载页面的解决方案想法? (或者这甚至是一个错误?)
#相关代码(不分先后):
119 /**
120 * @brief 'Deletes' the cookie 'bought'. It basically sets its expiration date to 1 hour in the past, so the browser w ill collect it.
121 */
122 function delCookie()
123 global $cookieDel;
124 echo "eating ...<br />";
125 unset($_COOKIE['bought']);
126 if(!setcookie('bought', FALSE, time()-3600))
127 echo "Error 2";
128 else
129 $cookieDel = TRUE;
130
131
132 /**
133 * @brief Writes a purchase to the database 'bought.db' in the following order:TIME:DATE | ITEMS(separated by a ',') | NAME(of the buyer) | TOTAL(amount of money spent). [consider writing the store brand aswell?]
134 */
135 function toDatabase($items, $amount)
136 $database = new SQLite3('bought.db');
137 $fixString = preg_replace('/<br \/>/', ', ', $items);
138
139 $SQLret = $database->query('INSERT INTO bought(date, items, name, total) VALUES("'.date('y/m/d_H:m').'", "'.$fixString.'", "test", '.$amount.');');
140
【问题讨论】:
delCookie() 函数是什么样的?另外,您可以发布其余的相关代码吗? 在写入 db 和调用 delCookie() 之间是否有任何输出到浏览器?这可能是原因。 是的,但我没有访问 cookie。 (并且删除该输出并不能解决它) 是的,但是移除回显并不能解决问题,页面重新加载后 cookie 仍然存在。 您是否也删除了delCookie()
中的echo
?
【参考方案1】:
对$_COOKIE
中的值使用unset()
不会不会删除它。它只是将它从$_COOKIE
超全局中删除,但 cookie 仍然存在于用户的机器上。要真正删除 cookie,您需要设置一个具有相同名称的 cookie,并将过期日期设置为过去。然后你仍然必须等到 after 发送页面的 HTTP 标头,因为它取决于浏览器来实际删除 cookie。然后在下一页请求中,cookie 将出现在请求标头中。只有这样你才能检查cookie是否真的被删除了。
【讨论】:
那么为什么isset($_COOKIE['bought'])
评估为 true 即使我之前做了一个unset($_COOKIE['bought'])
?
^ 当然无需重新加载页面。但是正如您在函数delCookie()
中看到的那样,我将cookie 的过期日期设置为过去1 小时,并将其发送回客户端,并在此处将其删除。现在,如果我在删除它之前不访问 cookie 服务器端,它会按预期被删除客户端。但是,如果 id 在设置过期日期之前访问 cookie 值服务器端而不是过去,它不会被删除。为什么?以上是关于PHP:setcookie() 和 unset() 不删除 cookie的主要内容,如果未能解决你的问题,请参考以下文章