【问题标题】:Can PHP's setcookie take non-numeric keys? If so, why will this cookie not set?PHP 的 setcookie 可以采用非数字键吗?如果是这样,为什么不设置这个cookie?
【发布时间】:2016-01-19 13:53:00
【问题描述】:

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

【问题讨论】:

  • 调试:尝试一个非常简单的带有硬编码 html 页面和 cookie 的 php 脚本?您使用的代码可能存在其他问题。它不会花费很长时间,并将确定 cookie 是否是问题?

标签: php cookies


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2011-03-29
    相关资源
    最近更新 更多