【问题标题】:Codeigniter 3 authentication: can't echo variable from sessionCodeigniter 3 身份验证:无法从会话中回显变量
【发布时间】:2017-10-08 23:34:37
【问题描述】:

我正在开发一个 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-&gt;id . " | " . $current_user-&gt;email; 这一行从数据库中打印出登录的用户ID 和电子邮件地址。浏览器显示:1 | razvan_zamfir80@yahoo.com

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

我的错误在哪里?谢谢!

【问题讨论】:

标签: php codeigniter session


【解决方案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. set_userdata 不返回任何内容,因此从其返回中设置变量是无稽之谈。 2.你设置的变量($current_user_id$current_user_email)无论如何都不会被使用,因为你立即redirect。 3. 在 Codeigniter 3 中,推荐的 SET 会话数据的方式是直接到$_SESSION 超级全局,即$_SESSION['user_id'] = $current_user-&gt;id;
【解决方案2】:

你必须使用

$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){

}

【讨论】:

  • gogout功能呢?如何在 CI3 中销毁会话?
  • @RazvanZamfir: $this-&gt;session-&gt;sess_destroy();
【解决方案3】:

我也遇到过此类问题,但我建议您使用现有的库,如 tank-auth、ion-auth 或任何其他库,这样可以节省您的项目时间,除非您是出于学习目的。

【讨论】:

  • 我已经尝试过 Ion-auth。但我没有找到任何关于如何使用它的有用教程。
【解决方案4】:

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

会话并不像您在上面尝试的那样工作。您能告诉我们您为什么这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2016-01-23
    • 2014-02-21
    • 2023-03-13
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多