我正在我的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);
答案 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'];