Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.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_Session_Cookies_Pdo - Fatal编程技术网

Php 检查用户会话和cookie

Php 检查用户会话和cookie,php,session,cookies,pdo,Php,Session,Cookies,Pdo,我试图检查用户的会话是否可用,cookie是否可用。因此,如果用户在那里没有会话,请检查cookie是否在那里。如果它们是可用的cookie,请重置会话 当我第一次登录时,它就像我正在设置会话和cookie一样工作,但是当我关闭浏览器并重试时,我就被注销了。我知道发生了什么,出于某种原因,它没有在loginwithcookie中设置会话。我做错了什么 下面是login类的一部分 public function __construct(DB $pdo) { $this->pdo =

我试图检查用户的会话是否可用,cookie是否可用。因此,如果用户在那里没有会话,请检查cookie是否在那里。如果它们是可用的cookie,请重置会话

当我第一次登录时,它就像我正在设置会话和cookie一样工作,但是当我关闭浏览器并重试时,我就被注销了。我知道发生了什么,出于某种原因,它没有在loginwithcookie中设置会话。我做错了什么

下面是login类的一部分

public function __construct(DB $pdo)
{
    $this->pdo = $pdo->pdo;

    if(isset($_GET['logout'])){
        $_SESSION = array();
        session_destroy();
        setcookie('key', $cookieki, time()-3600, '/ff', 'www.dldesigns.me');

        header('Location: index');
    }

    if(!empty($_SESSION['user_sess']) && $_SESSION['logged_in'] === true){
        // check sessions
        $this->loginwithsessions();
    } else if(isset($_COOKIE['key'])) {
        $this->loginwithcookie();
    }

}

public function loginwithsessions()
{
    $query = $this->pdo->prepare('SELECT * FROM `users` WHERE `user_key` = ?');

    $query->bindValue(1, $_SESSION['user_sess']);

    $query->execute();

    $result = $query->fetchAll();

    if(count($result) == 1){
        // session matches database
        $this->user_logged_in = true;
    }
}

public function loginwithcookie()
{
    $query = $this->pdo->prepare('SELECT * FROM `users` WHERE `cookie_key` = ?');

    $query->bindValue(1, $_COOKIE['key']);

    $query->execute();

    $result = $query->fetchAll();
    $fetch = $query->fetch();

    if(count($result) == 1){
        // cookie matches database
        $this->user_logged_in = true;
        $_SESSION['user_sess'] = $fetch['user_key'];
        $_SESSION['logged_in'] = true;
    }
}

public function checklogin()
{
    if(!empty($_SESSION['user_sess']) && ($_SESSION['logged_in'] === true) && (!empty($_COOKIE['key'])) && $this->user_logged_in === true){
        return true;
    } else {
        return false;
    }
}

public function loginwithdata($email, $password)
{
    $query = $this->pdo->prepare('SELECT * FROM `users` WHERE `email` = ?');

    $query->bindValue(1, $email);

    try{

    $query->execute();

    $data = $query->fetch();

    $salt = $data['salt'];
    $userkey = $data['user_key'];
    $hashed_pass = sha1(md5($salt.$password));

    if($this->verify($hashed_pass, $email) === true){

        $_SESSION['user_sess'] = $userkey;
        $_SESSION['logged_in'] = true;
        $this->user_logged_in = true;

        $cookieki = sha1(uniqid(mt_rand(), true));

        setcookie('key', $cookieki, time()+3600, '/ff', 'www.dldesigns.me');

        $update = $this->pdo->prepare('UPDATE `users` SET `cookie_key` = ? WHERE `user_key` = ?');

        $update->bindValue(1, $cookieki);
        $update->bindValue(2, $userkey);

        $update->execute();
        return true;
    } else {
        return false;
    }

    } catch(PDOException $e) {
        die($e->getMessage());
    }
}
下面是我如何检查的

if($login->checklogin() === true){

echo 'user session is' . $_SESSION['user_sess'];
echo '<br />';
echo 'cookie is' . $_COOKIE['key'];

} else {
    echo "not logged in";
}
if($login->checklogin()==true){
回显“用户会话为”。$\u会话[“用户会话];
回声“
”; echo'cookie is.$_cookie['key']; }否则{ 回显“未登录”; }
Use正在使用$cookieki with hin函数,但函数未定义。另外,不要使用md5 function-use(使用更强大算法的crypt包装)。是的,我稍后会添加密码\u散列,但$cookieki不是问题所在,因为它正在设置中。我自己解决了这个问题,我没有从数据库获取用户密钥,因此会话没有值