用户点击“记住我”复选框后,会话未设置

时间:2015-12-14 16:02:54

标签: php session cookies

我有cookie设置,可以在控制台中看到它。当我关闭浏览器并重新打开它时,它会显示cookie仍然存在,但不会显示会话。所以我试图了解为什么我的代码没有让用户登录。我将提供下面所需的所有文件。

编辑:我应该详细说明一下。因此,当用户关闭他/她的浏览器时,会话应该不再存在,但cookie应该就是这样。所以一旦发生这种情况,我想说好,因为有一个cookie,我们将抓住该用户的cookie在数据库中查找并检索他们的ID。然后使用会话表中的id从users表中查找id并将该用户登录到。

的login.php:

<?php
require_once 'core/init.php';
if(Input::exists()) {
  if(Token::check(Input::get('token'))) {

      $validate = new Validate();
      $validation = $validate->check($_POST,array(
          'username' => array('required' => true),
          'password' => array('required' => true)
      ));

      if($validation->passed()) {
        $user = new User();

        $remember = (Input::get('remember') === 'on') ? true : false;
        $login = $user->login(Input::get('username'), Input::get('password'), $remember);

        if($login) {
          Redirect::to('index.php');
        } else {
          echo '<p>Sorry, logging in failed</p>';
        }
      } else {
        foreach($validation->errors() as $error) {
          echo $error, '<br>';
        }
      }
  }
}
?>

<form action="" method="post">
  <div class="field">
    <label for="username">Username</label>
    <input type="text" name="username" id="username" autocomplete="off">
  </div>

  <div class="field">
    <label for="password">Password</label>
    <input type="password" name="password" id="password" autocomplete="off">
  </div>

  <div class="field">
    <label for="remember">
      <input type="checkbox" name="remember" id="remember">Remember Me
    </label>
  </div>

  <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
  <input type="submit" value="Log In">
</form>

的init.php:

<?php
session_start();
$GLOBALS['config'] = array(
  'mysql' => array(
    'host' =>  '127.0.0.1',
    'username' => 'root',
    'password' => 'root',
    'db' => 'register_login'
  ),
  'remember' => array(
    'cookie_name' => 'hash',
    'cookie_expiry' => 604800
  ),
  'session' => array(
    'session_name' => 'user',
    'token_name' => 'token'
  )
);

spl_autoload_register(function($class) {
  require_once 'classes/' . $class . '.php';
});

require_once 'functions/sanitize.php';

if(Cookie::exists(Config::get('remember/cookie_name')) && !Session::exists(Config::get('session/session_name'))) {
  $hash = Cookie::get(Config::get('remember/cookie_name'));
  $hashCheck = DB::getInstance()->get('users_session', array('hash', '=', $hash));

  if($hashCheck->count()) {
    $user = new User($hashCheck->first()->user_id);
    $user->login();
  }
}
 ?>

User.php:在公共功能登录下的这个文件中,我把echo&#39; ok&#39;和echo&#39; not ok&#39;看看我是否正在通过而且我得到了“没有问题”,所以if不是真的。所以我最好的猜测是$ this-&gt; exists()传递false。它不应该传递虚假。

<?php

class User {
  private $_db,
          $_data,
          $_sessionName,
          $_cookieName,
          $_isLoggedIn;

  public function __construct($user = null){
    $this->_db = DB::getInstance();

    $this->_sessionName = Config::get('session/session_name');
    $this->_cookieName = Config::get('remember/cookie_name');


    if(!$user){
      if(Session::exists($this->_sessionName)) {
        $user = Session::get($this->_sessionName);

          if($this->find($user)) {
            $this->_isLoggedIn = true;
          } else {

          }
        } else {
        $this->find($user);
      }
    }
  }


  public function create($table,$fields = array()){
    if(!$this->_db->insert($table, $fields)){
      throw new Exception('There was a problem creating an account.');
    }
  }


  public function find($user = null) {
    if($user){
      $field = (is_numeric($user)) ? 'id' : 'username';
      $data = $this->_db->get('users', array($field, '=', $user));

      if($data->count()) {
        $this->_data = $data->first();
        return true;
      }
    }
    return false;
  }


  public function login($username = null, $password = null, $remember = false) {
    if(!$username && !$password && $this->exists()) {
      echo 'Ok';
      //Session::put($this->_sessionName, $this->data()->id);
    } else {
      echo 'no ok';
      $user = $this->find($username);
      if($user){
        if($this->data()->password === Hash::make($password, $this->data()->salt)) {
          Session::put($this->_sessionName, $this->data()->id);

          if($remember){
            $hash = Hash::unique();
            $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id));

            if(!$hashCheck->count()) {
              $this->_db->insert('users_session',array(
                'user_id' => $this->data()->id,
                'hash' => $hash
              ));
            } else {
              $hash = $hashCheck->first()->hash;
            }

            Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
          }
          return true;
        }
      }
    }
    return false;
}

  public function exists() {
    return (!empty($this->_data)) ? true: false;
  }


  public function data(){
    return $this->_data;
  }


  public function isLoggedIn(){
    return $this->_isLoggedIn;
  }


public function logout(){

$this->_db->delete('users_session', array('user_id' ,'=' , $this->data()->id));

Session::delete($this->_sessionName);
Cookie::delete($this->_cookieName);
  }
}

session.php文件:

<?php
class Session {

  public static function exists($name) {
    return(isset($_SESSION[$name])) ? true : false;
  }

  public static function put($name, $value) {
    return $_SESSION[$name] = $value;
  }

  public static function get($name) {
    return $_SESSION[$name];
  }

  public static function delete($name) {
    if(self::exists($name)) {
      unset($_SESSION[$name]);
    }
  }

  public static function flash($name, $string = '') {
    if(self::exists($name)){
      $session = self::get($name);
      self::delete($name);
      return $session;
    } else {
      self::put($name, $string);
    }
  }


}

0 个答案:

没有答案