无法访问现有的php cookie

4
我正在本地开发一个使用cookie的网站。我有一个函数,它会生成一个随机的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”

所以我通过以下方式解决了这个问题


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

3
你是否在同一脚本中尝试读取$_COOKIE的值,而该值是在该脚本中设置的? - Barmar
你在使用谷歌浏览器吗? - Freeman Lambda
不,它不在同一页上。Cookie 是在登录页面中设置的,我试图在索引页面上显示 Cookie 值,但没有任何结果。是的,我正在使用 Chrome。 - Maurice
在Chrome中,Cookie受到本地使用的限制。通过127.0.0.1/访问您的网站,而不是通过localhost/来解决Chrome的行为问题。此外,请查看SO上的这个问题:链接 - Freeman Lambda
3个回答

2

奇怪... OP在setcookie()中没有设置域名,但他声称浏览器实际上接受了该cookie。 - Álvaro González

0

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

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

来自手册

一旦设置了cookies,它们可以通过 $_COOKIE 或 $HTTP_COOKIE_VARS 数组在下一页被访问。

如果您确实需要在同一页上使用,您可能可以这样做:

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

不,它不在同一页上。Cookie是在登录页面设置的,我尝试在主页上显示Cookie值,但没有任何结果。 - Maurice

0

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

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

在捕获cookie之前,您需要重定向以发送带有头信息的cookie。

请参见setcookie文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接