setcookie()无法正常工作

时间:2013-03-08 07:47:11

标签: php cookies setcookie

不确定我做错了什么......

以下是用于设置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始终为空

2 个答案:

答案 0 :(得分:1)

... '.$domain');
    ^        ^

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

  

Docs

     

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

由于您无法访问来自.$domain的Cookie,因此未设置Cookie:

  

Docs

     

     

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

将其更改为:

... '.'.$domain);

答案 1 :(得分:0)

RFC 2109开始,必须使用起始点设置domain参数(请参阅http://php.net/setcookie)。请试试,你的代码似乎没问题。请从'.$domain.'删除单引号。