PHP的setcookie可以使用非数字键吗?如果是这样,为什么这个cookie没有设置?

时间:2016-01-19 13:53:01

标签: php cookies

我正在尝试将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被设置。但是,这范围太广了。

1 个答案:

答案 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);
            }
        }
    }
}