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的主要内容,如果未能解决你的问题,请参考以下文章

php,js清除cookie

原生php使用sessioncookie

PHP 中内置函数 setcookie() 和 setrawcookie() 的实际实际差异是啥?

php setcookie中path和domain怎么设置

PHP Curl 和 setcookie 问题

PHP 中的 session_unset 和 unset($_SESSION) 有啥区别? [关闭]