我一直在使用以下代码来检测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中),所以至少文档可能 将其默认为“”。
答案 0 :(得分:0)
我想我会把它归结为版本差异以及我意外落后的幕后编码变化。但是,基于PHP的文档,哪种方法是正确的仍然不清楚。
我相信PHP 5.6.21版本代表一个介绍的bug并创建一个没有值的cookie(以前没有任何值存在)应该仍然可行。如果新行为是永久性的,那么文档肯定需要更新。
据我所知,在PHP 5.6.10之前和之后,不需要传递值来创建一个新的 cookie。
如果有人更熟悉PHP的内部工作,可以说setcookie()
的意图而不传递一个值(并且之前不存在该名称),这将是很好的。
由于文档在这两个版本之间没有变化,因此其中一种方法是错误的,我希望这个问题可以让这个问题得到解决。
如果您也遇到过这个问题,感谢您通过评论来启动。