我使用PHP制作的当前登录脚本正在工作,但是当我尝试登录并取消选中“记住我”它登录时,但未设置所需的cookie,但是,如果我选中“记住”框,则会登录并设置cookie。 所以问题是,是什么导致它发生? 我的PHP代码:
<?php
/* Mysql data */
$MysqlUsername = "root";
$MysqlPassword = "";
$MysqlHostname = "localhost";
$MysqlDatabase = "teamgamersnet";
$Salt = "TGN2012";
$Username = $_POST['Username'];
$Password = $_POST['Password'];
$Remember = $_POST['Remember'];
$Cookie = "TGN";
$IP = $_SERVER['REMOTE_ADDR'];
if (empty($Username) || empty($Password)) { die("Please fill in all the fields"); }
$hash = hash('sha256',strtolower($Username).$Password.$Salt);
$Sql = new mysqli($MysqlHostname, $MysqlUsername, $MysqlPassword, $MysqlDatabase);
if ($Sql->connect_error){ echo $Sql->connect_error; }
$sUser = $Sql->real_escape_string($Username);
$sPass = $Sql->real_escape_string($Password);
$xPass = $Sql->real_escape_string($hash);
$CheckUser = $Sql->query("SELECT * FROM `users` WHERE `Username` = '".$sUser."'");;
if ($CheckUser->num_rows == 0) { header("Location: /?p=Login&wrongusr=true"); die(); }
$xCheckUser = $CheckUser->fetch_array(MYSQLI_ASSOC);
if ($xCheckUser['Activated'] == "false") { header("Location: /?p=Login&activate=true"); die(); }
if(strtolower($Username) == strtolower($xCheckUser['Username'])) {
if($hash == $xCheckUser['Password']) { // Check if password is correct
if(isset($Remember)){ // Set a looong cooke to remember
setcookie ($Cookie."User", htmlspecialchars($Username), time() + 99999999);
setcookie ($Cookie."Pass", $hash, time() + 99999999);
header("Location: /?login=true");
}
else
{ // Set a standard cookie
setcookie ($Cookie."User", htmlspecialchars($Username), time() + 3600);
setcookie ($Cookie."Pass", $hash, time() + 3600);
header("Location: /?login=true");
}
}
else
{
header("Location: /?p=Login&wrongpwd=true"); // Send them to home page
}
}
?>
答案 0 :(得分:2)
您的问题的答案不是由于PHP本身,而是(我认为)归结为您的网络服务器。有关cookie及其设置方式的一些信息: - 它们基于时间戳 - 更重要的是,服务器设置的时间戳! - 它们将根据上述时间戳自动过期。
我强烈建议仔细查看服务器发送的HTTP标头并检查过期日期,因为我无法在本地重现您的错误,但之前的生产过程类似。 转到您的页面,取消选中记住我,并检查服务器发送给您的标题。你会发现这样的事情: Set-Cookie:TGNPass = 一些哈希; expires = Sat,17-Nov-2012 22:27:44 GMT
到期日期/时间就是你所追求的。检查它是否是您所期望的(即从现在起一小时),如果没有,则需要调整服务器的时区设置。这可以使用http://php.net/manual/en/function.date-default-timezone-set.php轻松完成。
答案 1 :(得分:0)
如果您的服务器时间与客户端时间不匹配,则从http://php.net/manual/en/function.setcookie.php有时time()+ 3600会失败。我会尝试time()+ 7200和time()+ 14400并检查你的cookie以查看它们实际设置的内容。