【问题标题】:Problems deleting cookies, won't unset删除 cookie 时出现问题,不会取消设置
【发布时间】:2011-02-20 19:57:54
【问题描述】:

我已经尝试在 php 手册和互联网上搜索有关如何删除 cookie 的信息,并且我已经按照他们所说的完全相同的方式进行了尝试:

setcookie("name", '', 1);

setcookie("name", '', time()-3600);

但是当我在 Firefox 的 cookie 对话框中检查 cookie 时,它​​仍然存在并且具有相同的值。 我使用以下行设置此 cookie:

setcookie("name", $value, time() + 259200, $path);

我在 stackoverflow 上找到了this 问题: ,但没有一个答案能解决问题。正如作者所说,我也尝试将所有参数放入,但没有效果。

有人发现问题了吗?

【问题讨论】:

  • cookie 名称中的点被替换为 _ 字符 - 这可能会导致一些问题
  • 首先,确保 cookie 视图(例如在 Firefox 中)实际上已刷新。然后,做你已经做过的事情,但要注意对于“设置”和“取消设置”或“删除”操作必须相同的所有属性。此外,为了更方便,您可以使用github.com/delight-im/PHP-Cookie 中的$cookie->delete(); 之类的东西。

标签: php cookies unset


【解决方案1】:

这是我使用 cookie 的经验,在关闭浏览器窗口(我们用来查看现有 cookie)之前,该 cookie 可能不会从客户端计算机中删除。所以关闭那个窗口并尝试你的代码。

  • 所有参数在删除创建时都必须存在
  • 时间必须是过去
  • 值必须是''(空)
  • 创建时文件夹路径必须相同

【讨论】:

    【解决方案2】:

    就像正确答案中所说的(我希望它发送一个更新的),要取消设置,用于设置 cookie 的每个参数都是必要的,即使是 securehttponly

    设置

    setcookie("name_cookie", $name_value, 0, '/', $domain, false, true);
    

    取消设置

    setcookie("name_cookie", '', time()-1000, '/', $domain, false, true);
    

    【讨论】:

      【解决方案3】:
      var remember = $.cookie('auto_login');
      if (remember == 'true') {
          var username = $.cookie('username');
          var password = $.cookie('password');
          $('#username').val(username);
          $('#password').val(password);
      }
      
      $('#logsub').click(function (event) {
          if ($('#auto_login').is(':checked')) {
              var username = $('#username').val();
              var password = $('#password').val();
              // set cookies to expire in 14 days
              $.cookie('username', username, {expires: 14});
              $.cookie('password', password, {expires: 14});
              $.cookie('auto_login', true, {expires: 14});
          } else {
              // reset cookies
              $.cookie('username', null);
              $.cookie('password', null);
              $.cookie('auto_login', null);
          }
      });
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案4】:

      我很惊讶没有人提到它(或者我可能错过了它),但是域也很重要!如果你在 sub-domain.example.com 上,并且 cookie 来自 .example.com,那么你需要显式设置 domain 参数,否则它会假定当前域,它不会工作。

      setcookie('cookiename', FALSE, -1, '/', '.example.com');
      

      子域值不会从父域中清除 cookie。

      【讨论】:

        【解决方案5】:

        这对我有用:

        setcookie("brownie","",1,'/');
        unset($_COOKIE["brownie"]);
        

        【讨论】:

          【解决方案6】:

          设置 cookie

          setcookie('cookiename', $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 天

          取消设置 cookie

          setcookie('cookiename', '', time() - 3600, "/");

          不必惊慌。只需复制您用于设置 cookie 的功能,现在减去时间。不要混淆,简单明了。

          【讨论】:

          • 我使用字面上相同的函数调用来删除相同的 cookie,它曾经有效,其他时候无效。
          【解决方案7】:

          如果您删除特定路径的 cookie 并且您的 path 参数以 尾部斜杠 '/' 结尾,那么它将在 Firefox 中工作和 IE,但在 Chrome 和 Opera 中不起作用。如果没有尾部斜线,那么它只能在 Chrome 和 Opera 中使用。

          所以你应该同时使用:

          setcookie('cookiename', '', time() - 60*60*24, $chatPath); // WebKit
          setcookie('cookiename', '', time() - 60*60*24, $chatPath . '/'); // Gecko, IE
          

          【讨论】:

          • 谢谢你!我不敢相信这种情况在 2021 年仍在继续。要删除特定的 cookie,我不得不使用您在数小时后发现的建议。我知道使用以下内容删除特定的 cookie(供未来用户使用)unset($_COOKIE['name']); setcookie("name", '', 1, '/'); setcookie("name", '', 1, '');
          【解决方案8】:

          只需在 global.php 等全局核心函数文件中定义一个自定义函数

          function delete_cookie()
          {
          unset($_COOKIE['cookiename']);
          setcookie('cookiename',NULL,time()-3600, '/');
          return true;
          }
          

          并在html代码的顶部使用这个函数

          include('global.php')
          if(isset($_GET['delete_cookie']))
          {
          delete_cookie(); //if you want to pass the parameters into the function also possible like delete_cookie(param1);
          }
          

          【讨论】:

            【解决方案9】:

            有时您将 cookie 保存在与尝试删除/使用它不同的路径中。

            进入例如。 Chrome cookie 设置并检查 cookie 路径,然后将路径添加到 setcookie 命令中,然后像这样删除它:

            setcookie( "my_cookie_name","",1,'/mypath');
            

            尝试删除或取消设置保存在错误路径中的 cookie 是行不通的,而且会非常令人沮丧。

            【讨论】:

              【解决方案10】:

              我很惊讶还没有人发布这个,但这对我来说非常适合:

              按名称创建或更改 cookie:

              $_COOKIE['myCookieName'] = 'I can be changed to whatever u want';
              

              按名称删除 cookie:

              unset($_COOKIE['myCookieName']);
              

              【讨论】:

                【解决方案11】:

                我也有类似的问题。

                我发现,无论出于何种原因,从 logout.php 中回显某些内容使其实际上删除了 cookie:

                echo '{}';
                setcookie('username', '', time()-3600, '/');
                

                【讨论】:

                • 奇怪,应该完全相反。只有在第一个输出之前才可以删除,而不是在它之后。
                【解决方案12】:

                我建议使用

                ob_start();
                

                一开始我

                【讨论】:

                  【解决方案13】:

                  好吧,我真的不明白,但现在可以了。神奇的代码是:

                  setcookie("name", '', 1, $path);
                  

                  我不是已经试过了吗??!无论如何,它现在有效。感谢您的帮助,人们!

                  【讨论】:

                  • 如果您的 cookie 是 '',它就可以工作。重要的是 cookie 具有与您设置时相同的值。
                  【解决方案14】:

                  The manual states:

                  必须使用与设置相同的参数来删除 Cookie。如果 value 参数是一个空字符串或FALSE,并且所有其他参数都与先前对 setcookie 的调用匹配,则具有指定名称的 cookie 将从远程客户端中删除。这是通过将值设置为“已删除”并将到期时间设置为过去一年来在内部实现的。

                  所以还要确保正确指定$path -- 删除时也是如此。例如,如果 cookie 是在子目录中指定的,您可能无法从父目录或子目录(或两者)中删除它。

                  我不完全确定权限是如何工作的,但您可能希望使用 Web 开发人员工具栏查看您尝试删除的 cookie 的路径

                  【讨论】:

                  • 我正在检查 Firefox Cookies 对话框,我用来设置 cookie 的路径与我用来取消设置它的路径相同。但是我尝试取消设置 cookie 的地址与我设置 cookie 的路径不同。我还发现如果到期日期在未来,我可以更改 cookie 的值。如果我使用过去的值,则不会发生任何事情。奇怪吗?
                  • 经过几分钟的测试,我无法让它工作!根本没有 cookie 删除。现在我知道了:使用 setcookie 与创建时使用的参数相同,$path,$domain 等等。 setcookie($name,NULL,-1) 还不够!谢谢你的评论!
                  • 终于!!!我安装了一个 Chrome 扩展程序来找出我的应用程序设置的 cookie 的路径 - 然后我终于可以完美地取消它了!绝妙的答案!
                  • 正在为此绞尽脑汁,感谢您的回答。
                  • 太棒了 - 我正在阅读以 JS 为中心的文档,并且连续翻腾了好几个小时 - 然后我找到了这个答案,它在 5 分钟内就可以工作了!
                  【解决方案15】:

                  不过,我也发生过十分之一的情况。我猜这是我们编码方式的问题。

                  这是我的代码

                  setcookie("token", "", time() - 36000, "/");
                  

                  【讨论】:

                  • 到底有什么区别?我也试过使用路径参数,如果你是这个意思?
                  • 不,我的意思是说即使我遇到了和你一样的问题。
                  【解决方案16】:

                  您是否检查过您的脚本是否已经发送了它的 HTTP 标头?

                  if (headers_sent()) {
                    trigger_error("Cant change cookies", E_USER_NOTICE);
                  }
                  

                  【讨论】:

                    【解决方案17】:

                    我尝试过使用

                    setcookie("name", "", -1);
                    

                    在我使用 Apache/PHP5 的服务器上,它清除了 cookie(至少 var_dump($_COOKIE) 显示了一个空数组)。

                    【讨论】:

                      【解决方案18】:

                      您是否尝试过将时间设置为较小的值并使用 cookie 的值?

                      setcookie("name", 'n', 1);
                      

                      【讨论】:

                      • 我发现如果到期日期在未来,我实际上可以更改这些值。那么价值就无所谓了。但是使用'1'作为时间似乎不起作用,时间()-3600也是如此。
                      猜你喜欢
                      • 2015-01-01
                      • 2011-01-30
                      • 2011-07-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多