【问题标题】:setcookie() not workingsetcookie() 不工作
【发布时间】:2013-03-09 05:06:02
【问题描述】:

不知道我做错了什么......

这是用于设置 cookie 的页面: https://www.ni-dieu-ni-maitre.com/test.php

    $domain = "ni-dieu-ni-maitre.com";
$articleid = "test";

$lastviewedarticles = array();

if (isset($_COOKIE["viewed_articles"]) ) {
  $lastviewedarticles = unserialize($_COOKIE["viewed_articles"]);
}

if (!in_array($articleid, $lastviewedarticles)){
    $count = count($lastviewedarticles);
    if($count>=29)
        array_shift($lastviewedarticles);
    $lastviewedarticles[] = $articleid;
}
setcookie('viewed_articles', serialize($lastviewedarticles), time()+60*60*24*30, '/', '.' . $domain);

然后这个页面读取cookie并输出内容: https://www.ni-dieu-ni-maitre.com/test2.php

if ( isset($_COOKIE["viewed_articles"]) ) {
  $lastviewedarticles = unserialize($_COOKIE["viewed_articles"]);
}
echo "cookie is currently:<br>";
print_r($lastviewedarticles);

正如您在测试页面上看到的,cookie 始终为空

【问题讨论】:

  • 仍在寻找解决方案...

标签: php cookies setcookie


【解决方案1】:
... '.$domain');
    ^        ^

您使用单引号,这意味着 php 不会用变量中的相应值替换 $domain

Docs:

注意:与双引号和 heredoc 语法不同,变量和 特殊字符的转义序列在它们时不会被扩展 出现在单引号字符串中。

而且由于您无法从 .$domain 访问 cookie,因此未设置 cookie:

Docs:

cookie 可用的域。将域设置为 'www.example.com' 将使 cookie 在 www 子域中可用 和更高的子域。可用于较低域的 Cookie,例如 'example.com' 将可用于更高的子域,例如 'www.example.com'。旧版浏览器仍在实施已弃用的 » RFC 2109 可能需要前导 .匹配所有子域。

改成:

... '.'.$domain);

【讨论】:

  • 刚刚更新了代码...还是不行:( setcookie('viewed_articles', serialize($lastviewedarticles), time()+60*60*24*30, '/', '.'.$domain);
  • @anarchOi 你能发布print_r 显示的内容吗?你能用var_dump代替print_r吗?
  • @anarchOi 这意味着 cookie 设置正确但值不是您所期望的,请检查 serialize($lastviewedarticles) 返回的内容。
  • 检查我发布的代码,它应该可以工作。我在将它放入 cookie 之前打印了 $lastviewedarticles,它不是空的。另外,如果我在不设置域名的情况下使用 setcookie() 它将起作用。所以它与 setcookie() 没有被正确使用有关。这将起作用 = setcookie('viewed_articles', serialize($lastviewedarticles));
  • @anarchOi 看看你的第一个样本。它总是在cookies中设置空数组(如果没有cookie,它是空数组,所以if语句永远不会执行,所以在cookies中设置了空数组。如果有一个cookie(它是空的,因为你已经在之前的运行中设置)它重新分配 $lastviewedarticles 空数组)。 :)
【解决方案2】:

RFC 2109 开始,domain 参数必须设置有一个起始点(请参阅http://php.net/setcookie)。请尝试一下,您的代码似乎没问题。请删除 '.$domain.' 中的单引号。

【讨论】:

  • 真的吗?所以我很抱歉 - 没有注意到这一点。
  • 是的:Older browsers still implementing the deprecated » RFC 2109 may require a leading . to match all subdomains.
  • 是的,你是对的。在 ietf.org,它被标记为具有历史意义。我的错 - 对不起。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-03-25
相关资源
最近更新 更多