我正在尝试将cookie设置为登录脚本的一部分,但cookie似乎永远不会设置。我已经使用大量调试点检查了代码,调用了st cookie,并且setcookie响应为true但是在检查时没有cookie存在。我通过使用chrome来查看我的cookie进行了双重检查 - 这个应用程序没有。
此前的步骤检查已发送的标头,以便我知道这不是问题。
<?php
// ...
public function set_cookie($cookie,$value,$time=0){
$cookieCONF = core::get()->factory()->get_config('cookie',array('path'=>'/','domain'=>'.'));
core::get()->debug()->log("COOKIE[{$cookie}]", $value, FALSE, 7);
if($time!==0){
$time= time()+$time;
}
if(!is_array($value)){
setcookie($cookie, $value, $time, $cookieCONF['path'], $cookieCONF['domain']);
}else{
foreach($value as $val=>$ue){
core::get()->debug()->log("{$cookie}[{$val}]", $ue, FALSE, 8);
if(setcookie("{$cookie}[{$val}]", $ue, $time, $cookieCONF['path'], $cookieCONF['domain'])){
core::get()->debug()->log('COOKIE RESULT',"SET {$cookie}[{$val}]={$ue}", FALSE, 8);
}else{
core::get()->debug()->log('COOKIE RESULT',"NOPE {$cookie}[{$val}]={$ue}", FALSE, 8);
}
}
}
}
回显出被调用函数的值:
setcookie("user[k]", "295f<SNIP>98f2", $time, "/~username/folder/", "localhost");
(实际使用中除了用户和文件夹的路径信息外)。
这是调试行,显示setcookie()返回true(成功)。
[15] => Array
(
[message] => COOKIE RESULT
[ref] => SET user[k]=295f<SNIP>98f2
)
所以,除非数字键有限,否则我不知道我无法理解为什么这些cookie会拒绝设置。
我做错了什么?
修改
Cookie可以使用非数字键。
将代码更改为
setcookie("user[k]", "295f<SNIP>98f2", $time);
导致Cookie被设置。但是,这范围太广了。
答案 0 :(得分:0)
Cookie可以使用非数字键。
将代码更改为:
setcookie("user[k]", "295f<SNIP>98f2", $time);
导致Cookie被设置。同样地:
setcookie("user[k]", "295f<SNIP>98f2", $time, "/~username/folder/");
也没关系。
发现localhost无法明确设置,因为域必须至少有两个点。
所以这里的问题不是代码 - 它是设置cookie但浏览器拒绝它。
因此,将localhost设置为null可以明确解决问题。
public function set_cookie($cookie,$value,$time=0){
$cookieCONF = core::get()->factory()->get_config('cookie',array('path'=>'/','domain'=>'.'));
core::get()->debug()->log("COOKIE[{$cookie}]", $value, FALSE, 7);
if($time!==0){
$time= time()+$time;
}
if($cookieCONF['domain']=='localhost'){
$cookieCONF['domain']=null;
}
if(!is_array($value)){
setcookie($cookie, $value, $time, $cookieCONF['path'], $cookieCONF['domain']);
}else{
foreach($value as $val=>$ue){
core::get()->debug()->log("{$cookie}[{$val}]", $ue, FALSE, 8);
if(setcookie("{$cookie}[{$val}]", $ue, $time, $cookieCONF['path'], $cookieCONF['domain'])){
core::get()->debug()->log('COOKIE RESULT',"SET {$cookie}[{$val}]={$ue}", FALSE, 8);
}else{
core::get()->debug()->log('COOKIE RESULT',"NOPE {$cookie}[{$val}]={$ue}", FALSE, 8);
}
}
}
}