【问题标题】:Where to set session in Codeigniter?在 Codeigniter 中在哪里设置会话?
【发布时间】:2019-06-27 21:00:39
【问题描述】:

我正在阅读 Codeigniter 2.2 教程,但不清楚如何使用会话进行登录。

假设我有一个 login.php,它用数据库检查用户数据。那么如果没问题,那么我应该在控制器中设置会话吗?

  $this->load->library('session');

然后在 admin.php 页面中我应该检查会话是否存在? :

 $this->session->user_data('item'); ??

或者我如何检查该人是否已登录?

谢谢

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    基于docs,要在会话中执行任何自定义操作,您需要加载会话库。如果您打算在整个应用程序中使用会话,我会推荐 autoloading 库。您可以在 config/autoload.php 中执行此操作。

    $autoload['libraries'] = array('session');

    那么您就不必在每个页面上都使用$this->load->library('session');

    加载库后,设置您的自定义信息,可能基于您数据库中的一些信息。所以在你的情况下,这将在 login.php 中:

    $this->session->set_userdata('userId', 'myId'); 其中userId 是会话变量的名称,myId 是值。

    然后,在后续页面 (admin.php) 上,您可以检查该值是否存在。

    if($this->session->userdata('userId') == '') { //take them back to signin }

    【讨论】:

    • 我可能会在核心目录中创建一个基本控制器 MY_Controller.php(可能是管理部分的基本控制器和普通站点的基本控制器)该控制器可以检查您是否是登录。这样你就不需要在每个管理控制器上都有你的逻辑。另外我认为在模型或控制器中包含会话设置逻辑很好。由你决定。很多人喜欢 Skinny Controller 和 Fat Models,反之亦然。
    • @Overachiever 完全正确。创建您自己的 MY_Controller 来扩展 CI 控制器是简化代码并使从一个位置验证所有其他页面变得容易的好方法。
    • 不,不,我没有尝试对会话进行任何自定义操作,我只是想找出一种使用会话检查某人是否已登录的标准方法。
    • CI 会在加载会话库时自动设置几个值:session_id、ip_address、user_agent 和 last_activity。标准方法通常包括添加一条自定义信息,然后验证该信息以及 CI 添加的可能的 last_activity
    • 所以我生成一个随机字符串用作“自定义信息”,然后将其存储在数据库中?如果您说有数百个用户登录和注销,那么这对数据库来说是一个负担。或者这就是它在实践中的做法?
    【解决方案2】:

    设置用户会话

    $the_session = array("key1" => "value1", "key2" => "value2");
    $this -> session -> set_userdata($the_session);
    

    读取用户会话

    $foo = $this -> session -> userdata('key1');
    

    每次使用 CI 会话功能之前,您都需要 $this->load->library('session');。或者你可以在autoload.php中设置$autoload['libraries'] = array('session');

    【讨论】:

    • 所以我必须自己设置会话数组值?它不会自动执行吗?
    • @VeganSv 是的,你定义它。
    【解决方案3】:
    1. 加载会话库

      $this->load->library('session');
      
    2. 设置会话

      $_SESSION['email'] = $data['email'];
      
    3. 取消会话

      $this->session->unset_userdata($_SESSION['email']); // $this->session->sess_destroy();
      

    【讨论】:

    • 在 CodeIgniter StackOverflow 中设置会话
    【解决方案4】:
    $this->load->library('session');
    $this->session->userdata("email")
    

    【讨论】:

    • 提供相关描述/注释以支持您的回答。 @siddharth 舒克拉
    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 2010-10-02
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多