无法访问现有的php cookie

时间:2013-04-18 07:00:29

标签: php

我正在我的localhost上开发一个使用cookies的网站。我有一个函数可以生成一个随机的25个字符的字符串,该字符串将存储在数据库中,并在用户的浏览器中设置为引用cookie。

我搜索了互联网和这个网站,但无法找到我的问题的解决方案。

下面是相关代码的概述


function generateRandomString($length){
    $string = "";
    $possible = "012346789abcdefghijklmnopqrstuvwABCDEFGHIJKLMNOPQRSTUVW";
    $maxlength = strlen($possible);
    if($length > $maxlength){
        $length = $maxlength;
    }
    $i = 0; 
    while($i < $length){ 
        $char = substr($possible, mt_rand(0, $maxlength-1), 1);
        if(!strstr($string, $char)){ 
            $string .= $char;
            $i++;
        }
    }
    return $string;
}

$uCookie = generateRandomString(25);

setcookie('uHash', $uCookie, time()+60*60*24*30);

$stmt = $dbh->prepare('
    UPDATE User 
    SET u_UserCookie = :cookie 
    WHERE u_UserId = :id
'); 

$stmt->execute(array(
    ':cookie' => $uCookie,
    ':id' => $user_id
));

现在,当我尝试echo($_COOKIE['uHash']);时,我得到一个空字符串。

奇怪的是,当我检查我的Chrome首选项时,cookie确实存在

Name:    uHash
Content:    134uHnEPrCmBNGqeAjhRSUiJL
Domain: localhost
Path:   /~path/to/login
Send for:   Any kind of connection
Accessible to script:   Yes
Created:    Wednesday, April 17, 2013 4:21:27 PM
Expires:    Friday, May 17, 2013 4:21:27 PM

字符串'134uHnEPrCmBNGqeAjhRSUiJL'也可以在数据库中找到,这样才能正常工作

我是否遗漏了一些关于cookie的基本信息(在本地主机上)?

解决

问题是,根据php.net

',域名必须包含至少两个点(。),因此'localhost'无效,浏览器将拒绝设置cookie'< / BLOCKQUOTE>

所以我这样解决了这个问题


$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('uHash', $uCookie, time()+60*60*24*30, '/', $domain, false);

3 个答案:

答案 0 :(得分:2)

看到此问题: Cookies on localhost with explicit domain

Cookie中的域名必须包含两个点。因此,Localhost无效。

答案 1 :(得分:0)

请确保您尝试访问正确路径/域中的Cookie:

 setcookie ('uHash', $uCookie, time()+60*60*24*30, /path/of/the/website, false);

您需要重定向到发送Cookie的标头才能捕获它。

请参阅setcookie doc

答案 2 :(得分:0)

我们没有所有相关代码,但我想它看起来像这样:

setcookie('uHash', $uCookie, time()+60*60*24*30);
echo $_COOKIE['uHash'];

来自the manual

  

设置好Cookie后,可以在下一页页面上访问这些Cookie   使用$ _COOKIE或$ HTTP_COOKIE_VARS数组加载。

如果您在同一页面上绝对需要它,您可以这样做:

setcookie('uHash', $uCookie, time()+60*60*24*30);
$_COOKIE['uHash'] = $uCookie;
echo $_COOKIE['uHash'];