Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-找出cookie消失的原因_Php_Cookies_Setcookie - Fatal编程技术网

PHP-找出cookie消失的原因

PHP-找出cookie消失的原因,php,cookies,setcookie,Php,Cookies,Setcookie,在我的登录系统中,我们设置了一个cookie来让人们登录。我不知道为什么,但看起来饼干会随机消失,所以人们会注销 它可能会坚持一天,一周或几个小时,即使到期时间是罚款 完全不知所措。需要明确的是:不是php会话cookies,而是我们自己的cookies。也不是人们自己擦饼干,因为这个问题也直接发生在我身上 登录代码示例: $info = $this->db->run("SELECT `password` FROM `users` WHERE (`username` = ?

在我的登录系统中,我们设置了一个cookie来让人们登录。我不知道为什么,但看起来饼干会随机消失,所以人们会注销

它可能会坚持一天,一周或几个小时,即使到期时间是罚款

完全不知所措。需要明确的是:不是php会话cookies,而是我们自己的cookies。也不是人们自己擦饼干,因为这个问题也直接发生在我身上

登录代码示例:

    $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无关。我在办公室的电脑上体验到了这种效果,这些电脑只是在晚上暂停使用,因此它们的浏览器会保持打开状态几天或几周,直到浏览器最终重新启动。但我同意,当然这也很值得研究其他方面。