PHP-找出cookie消失的原因
在我的登录系统中,我们设置了一个cookie来让人们登录。我不知道为什么,但看起来饼干会随机消失,所以人们会注销 它可能会坚持一天,一周或几个小时,即使到期时间是罚款 完全不知所措。需要明确的是:不是php会话cookies,而是我们自己的cookies。也不是人们自己擦饼干,因为这个问题也直接发生在我身上 登录代码示例:PHP-找出cookie消失的原因,php,cookies,setcookie,Php,Cookies,Setcookie,在我的登录系统中,我们设置了一个cookie来让人们登录。我不知道为什么,但看起来饼干会随机消失,所以人们会注销 它可能会坚持一天,一周或几个小时,即使到期时间是罚款 完全不知所措。需要明确的是:不是php会话cookies,而是我们自己的cookies。也不是人们自己擦饼干,因为这个问题也直接发生在我身上 登录代码示例: $info = $this->db->run("SELECT `password` FROM `users` WHERE (`username` = ?
$info = $this->db->run("SELECT `password` FROM `users` WHERE (`username` = ? OR `email` = ?)", [$username, $username])->fetch();
if ($info)
{
// now check password matches
if (password_verify($password, $info['password']))
{
$this->user_details = $this->db->run("SELECT ".$this::$user_sql_fields." FROM `users` WHERE (`username` = ? OR `email` = ?)", [$username, $username])->fetch();
$this->check_banned();
$lookup = base64_encode(random_bytes(9));
$validator = base64_encode(random_bytes(18));
// update IP address and last login
$this->db->run("UPDATE `users` SET `ip` = ?, `last_login` = ? WHERE `user_id` = ?", array(core::$ip, core::$date, $this->user_details['user_id']));
$this->new_login($lookup,$validator);
if ($stay == 1)
{
$secure = 0; // allows cookies for localhost dev env
if (!empty($this->core->config('cookie_domain')))
{
$secure = 1;
}
setcookie('gol_session', $lookup . '.' . $validator, $this->expires_date->getTimestamp(), '/', $this->cookie_domain, $secure, 1);
}
return true;
}
处理他们保持登录状态的代码:
if (isset($_COOKIE['gol_session']))
{
if(strpos($_COOKIE['gol_session'], '.') !== false)
{
$cookie_info = explode('.', $_COOKIE['gol_session']);
$session_check = $this->db->run("SELECT `id`, `device-id`, `user_id`,`validator` FROM `saved_sessions` WHERE `lookup` = ? AND `expires` > NOW()", array($cookie_info[0]))->fetch();
if ($session_check && hash_equals($session_check['validator'], hash('sha256', $cookie_info[1])))
{
// login then
$this->user_details = $this->db->run("SELECT ".$this::$user_sql_fields." FROM `users` WHERE `user_id` = ?", array($session_check['user_id']))->fetch();
$this->check_banned();
// update IP address and last login
$this->db->run("UPDATE `users` SET `ip` = ?, `last_login` = ? WHERE `user_id` = ?", array(core::$ip, core::$date, $this->user_details['user_id']));
// update their stay logged in cookie with new details
$lookup = base64_encode(random_bytes(9));
$validator = base64_encode(random_bytes(18));
$update_session_sql = "UPDATE
`saved_sessions`
SET
`lookup` = ?,
`validator` = ?,
`expires` = ?,
`date` = ?
WHERE
`id` = ? AND `user_id` = ?";
$update_session_db = $this->db->run($update_session_sql, array($lookup, hash('sha256', $validator), $this->expires_date->format('Y-m-d H:i:s'), date("Y-m-d"), $session_check['id'], $session_check['user_id']));
$check_update = $update_session_db->rowcount();
// database was updated, so we can update the cookie
if($check_update == 1)
{
$secure = 0; // allows cookies for localhost dev env
if (!empty($this->core->config('cookie_domain')))
{
$secure = 1;
}
setcookie('gol_session', $lookup . '.' . $validator, $this->expires_date->getTimestamp(), '/', $this->cookie_domain, $secure, 1);
}
$this->register_session();
return true;
}
else
{
setcookie('gol_session', "", time()-60, '/');
setcookie('gol-device', "", time()-60, '/');
return false;
}
可以使用完整登录/保持登录代码。Cookie在客户端进行控制。当然,它们可以被删除,很多人都可以,手动或使用其他方式。特别是“仅为本次会话保留cookie”经常会带来惊喜,尽管浏览器设置确实很有意义。这种情况发生在我身上,也发生在我网站的大多数用户身上。我可以肯定地告诉你,我没有删除我自己的cookie。没有必要对此表示粗鲁。我不确定你希望从这样的评论中得到什么答案?这些cookies不是php会话cookies,它们是我们自己的,正如我所提到的,这发生在我身上,我没有删除它们,我也没有在浏览器中设置任何东西来删除它们。如果您将我的问题理解为粗鲁的评论,我深表歉意,这不是我的本意。我试图表示惊讶的是,您只回答了一般方面的问题,而没有回答在浏览器会话结束时删除cookie的特定浏览器功能。这与php会话cookie无关。我在办公室的电脑上体验到了这种效果,这些电脑只是在晚上暂停使用,因此它们的浏览器会保持打开状态几天或几周,直到浏览器最终重新启动。但我同意,当然这也很值得研究其他方面。