Codeigniter 3身份验证:无法从会话中回显变量

时间:2017-10-07 08:10:35

标签: php codeigniter session

我正在开发 Codeigniter 3身份验证应用程序。我是CI的新手,所以我遇到了这个基本问题:无法存储/输出会话中的变量(我需要他显示登录用户的数据)。

用户模型

class Usermodel extends CI_Model {
    public function user_login($email, $password)
    {
            $query = $this->db->get_where('users', array('email' => $email, 'password' => $password));
            return $query->row();
    }
} 

登录控制器如下所示:

class Signin extends CI_Controller {

  public function __construct()
  {
      parent::__construct();
  }

  public function index()
  {
      $this->load->view('signin');
  }

  public function signin()
  {  
      $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
      $this->form_validation->set_rules('password', 'Password', 'required');
      $this->form_validation->set_error_delimiters('<p class="error">', '</p>');
      if ($this->form_validation->run())
      {
            $email = $this->input->post('email');
            $password = $this->input->post('password');
          $this->load->model('Usermodel');
          $current_user = $this->Usermodel->user_login($email, $password);
          if ($current_user) {
              $current_user_id = $this->session->set_userdata('user_id', $current_user->id);
              $current_user_email = $this->session->set_userdata('email', $current_user->email);
              // Echo from database
              echo $current_user->id . " | " . $current_user->email;

              //Echo from session
              echo $current_user_id . " | " . $current_user_email;
          } else {
            redirect('signin'); 
          }
      }
      else
      {
        $this->load->view('signin');
      }
  }
}

我能够在控制器中使用此行echo $current_user->id . " | " . $current_user->email;从数据库中打印出已登录的用户ID和电子邮件地址。浏览器显示:1 | razvan_zamfir80@yahoo.com

但是我不能在会话中做同样的事情:echo $current_user_id . " | " . $current_user_email;什么都不输出。

我的错误在哪里?谢谢!

4 个答案:

答案 0 :(得分:1)

好的,我得到了它(来自CI用户指南):

$current_user_id = $this->session->userdata('user_id', $current_user->id);
$current_user_email = $this->session->userdata('email', $current_user->email);

而不是

$current_user_id = $this->session->set_userdata('user_id', $current_user->id);
$current_user_email = $this->session->set_userdata('email', $current_user->email);

答案 1 :(得分:1)

你必须使用

$user_data = $this->session->userdata('user_id');

因为(void

$this->session->set_userdata(...)

什么都不返回。

  • void - 函数不向其调用者提供结果值。

参考:https://github.com/bcit-ci/CodeIgniter/blob/develop/system/libraries/Session/Session.php#L768

/**
 * Set userdata
 *
 * Legacy CI_Session compatibility method
 *
 * @param   mixed   $data   Session data key or an associative array
 * @param   mixed   $value  Value to store
 * @return  void
 */
public function set_userdata($data, $value = NULL){

}

答案 2 :(得分:0)

我也遇到过这样的问题,但我建议你使用像tank-auth,ion-auth或其他任何其他的现有库,这样可以节省你在项目上的时间,除非你是为学习目的而做的。

答案 3 :(得分:0)

设置后,

会话数据将无法使用。它可以在下一个重定向中使用。如果要检查会话是否存在,请设置会话,然后重定向到另一个控制器并检查那里的会话变量。

会话并不意味着像你上面的尝试一样工作。你要小心告诉我们你为什么这样做。