PHP的setcookie()有时需要一个值吗?

时间:2016-05-26 14:52:17

标签: php cookies

我一直在使用以下代码来检测cookie是否已启用,但最近才发现即使浏览器设置为允许cookie也没有成功。这是一个简单的检查是否在处理过程中依赖cookie。

我们最近迁移到PHP版本5.6.21,但current setCookie() documentation没有说明更改setcookie方法,但明确指出如果您没有指定任何内容,则默认值为空值。我们在PHP 5.6.10版本中也有不同的行为。

这是another question对此类似问题的说法,但未提及正在使用的PHP版本。

对于文档的信用,设置cookie的所有示例都传递一个值(删除部分除外),这里是关于传递空白的注释:

  

如果value参数为空字符串,或者为FALSE,并且所有其他参数与之前调用setcookie 相匹配,则将从远程客户端删除具有指定名称的cookie [强调我的]

我对此的解释是,如果cookie 存在(先前没有使用该名称调用setcookie)它应该创建它

代码:

# Before any html is output:
function cookiesEnabled(){
    if(isset($_COOKIE["cookiesEnabled"])){
        return true;
    }else{
        if(isset($_GET["reloaded"])){
            return false;
        }else{
            setcookie("cookiesEnabled" /*,"ANY_VALUE_FIXES"*/);
            $query = "";
            if($_SERVER["QUERY_STRING"]){
                $query = "&".$_SERVER["QUERY_STRING"];
            }
            header("Location: ?reloaded=1".$query);
            exit();
        }
    }
}
# Check prior to any HTML content being echoed
if(!cookiesEnabled()){
    echo "Problem";
} else {
    echo "Success";
}

仅在给出value参数时才会显示“成功”。

我满足于将一个值作为“修复”/“解决方法”填充,我很高兴它似乎有效(并且很容易)但是这个问题提出了了解为什么行为似乎与文档,希望从其他人那里获得确认

我们需要值的PHP版本是5.6.21。我不确定其他服务器设置可能导致此行为。在使用PHP 5.6.10的其他服务器中,“Success”的值参数不是。当我们刚刚将其版本升级到5.6.21时,它也失败了。

PHP是否需要更新其文档以明确声明值是必需的还是引入了编码错误?我也没有任何联系人可以解决,所以感谢你将这种潜在的差异转发给了这些权力。

注意:如果我setcookie喜欢这个setcookie("cookiesEnabled", ""),结果与未传递相同(5.6.10中的成功,而不是5.6.21中),所以至少文档可能 将其默认为“”。

1 个答案:

答案 0 :(得分:0)

我想我会把它归结为版本差异以及我意外落后的幕后编码变化。但是,基于PHP的文档,哪种方法是正确的仍然不清楚。

我相信PHP 5.6.21版本代表一个介绍的bug并创建一个没有值的cookie(以前没有任何值存在)应该仍然可行。如果新行为是永久性的,那么文档肯定需要更新。

据我所知,在PHP 5.6.10之前和之后,不需要传递值来创建一个新的 cookie。

如果有人更熟悉PHP的内部工作,可以说setcookie()的意图而不传递一个值(并且之前不存在该名称),这将是很好的。

由于文档在这两个版本之间没有变化,因此其中一种方法是错误的,我希望这个问题可以让这个问题得到解决。

如果您也遇到过这个问题,感谢您通过评论来启动。