【问题标题】:PHP $_COOKIE returns null BUT Chrome shows cookie with correct valuePHP $_COOKIE 返回 null 但 Chrome 显示具有正确值的 cookie
【发布时间】:2021-03-17 01:08:55
【问题描述】:

我试图在 wordpress 中设置自定义 cookie 没有成功,所以我认为这可能是因为缓存并在我的 localhost apache 上设置了一个小测试并遇到了同样的问题。

在 Chrome 中,cookie "chat_guest" 和 "chat_guest_hash" 是可见的,但在尝试获取它们的值时它返回 "null"。

在示例代码中,我使用 var_dump 来查看它们是否是任何具有值但返回 array(0) { } 的 cookie,并且这些 cookie 仍然显示在 Chrome 中!

<?php



if(!isset($_COOKIE['chat_guest'])) {
    if (!setcookie('chat_guest', "test1", 365 * 3000, "/")) die("?? 1");
    if (!setcookie('chat_guest_hash', "test", 365 * 3000, "/")) die("?? 2");
}

echo var_dump($_COOKIE);
?>

我只是无法理解这一点。有什么想法吗?

【问题讨论】:

  • 您确实记住,cookie 仅在浏览器将它们与下一个请求一起发送回后才会显示在 $_COOKIE 中,并且不会直接出现在您尝试过的同一请求中设置它们 - 对吧……?
  • 当我刷新页面时问题仍然存在
  • expires 参数需要是一个 unix 时间戳,而不是它应该有效的秒数。您使您的 cookie 有效,直到 1970 年 1 月 13 日星期二 17:10:00 +0100 - 所以难怪浏览器“不再”将它发送回服务器……
  • 是和否更精确@misorude "cookie 过期的时间。这是一个 Unix 时间戳,因此是自纪元以来的秒数。换句话说,你很可能会设置这个使用 time() 函数加上你希望它过期之前的秒数。或者你可以使用 mktime()。time()+60*60*24*30 将设置 cookie 在 30 天内过期。如果设置为 0,或者省略,cookie 将在会话结束时过期(当浏览器关闭时)。来源手册php.net/manual/en/function.setcookie.php

标签: php wordpress cookies


【解决方案1】:

您应该像现在一样使用全局 $_COOKIE 标记 - 就像 $_SESSION 或 $_SERVER...虽然您不能那样设置 cookie。 以下是 cookie 在 ~ 一个月内存储的正确方式:

    if (!isset($_COOKIE["chat_guest"])){ //checks if the cookie "chat_guest exists
       setcookie("chat_guest", "test1", time() + (86400 * 30), "/"); 
      //setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
    }

   print_r($_COOKIE); // prints all data stored within the super global $_COOKIE

使用此类 cookie 时记得刷新浏览器

【讨论】:

    【解决方案2】:

    在将响应发送回客户端之前不会设置 cookie,并且在客户端发出下一个请求之前,该 cookie 在您的 PHP 中不可用。

    如果您想立即访问,可以手动设置 $_COOKIE['chat_guest']:

    setcookie('chat_guest', "test1", time() + (86400 * 30), "/");
    $_COOKIE['chat_guest'] = "test1";
    

    【讨论】:

    • 这也设置了过期时间错误,所以不知道为什么会这样。 “您很可能会使用time() 函数加上您希望它过期前的秒数来设置它”来源手册php.net/manual/en/function.setcookie.php
    • @RaymondNijland 是的,我没有注意到过期时间和 double ;到底。我的错。
    • 试图编辑它 - 但我没有足够的声誉 - 请将过期时间编辑为 time() + (86400 * 30)
    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2018-03-30
    • 2019-11-22
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多