如何在登录系统中使用会话并在codeigniter中实现注销

Posted

技术标签:

【中文标题】如何在登录系统中使用会话并在codeigniter中实现注销【英文标题】:how to use session in login system and implement logout in codeigniter 【发布时间】:2015-11-05 22:49:09 【问题描述】:

codeigniter 的新手正在学习它并坚持使用 codeigniter 的会话。 我正在开发一个登录系统,登录部分运行良好,但现在我必须添加会话和注销并将我的其他页面包含到该会话中,以便我可以限制某人直接访问该页面。那么我如何在我的代码中实现会话和注销。

这是控制器

<?php
class LoginController extends CI_controller
        
            public function index()
        
            $this->load->view('header2');
            $this->load->view('login');
            $this->load->view('footer');
        
            public function checklogin()
        
            $this->form_validation->set_rules('username' ,'Username', 'required|valid_email');
            $this->form_validation->set_rules('password' ,'Password', 'required|callback_verifyUser');

                if($this->form_validation->run() == false)
                    $this->load->view('header2');
                    $this->load->view('login');
                    $this->load->view('footer');
                    
                    else
                    
                        redirect('HomeController/index');
                    
                
                    public function verifyUser()
                    
                        $name = $this->input->post('username');
                        $pass = $this->input->post('password');

                        $this->load->model('LoginModel');

                        if($this->LoginModel->login($name, $pass))
                        
                            return true;
                        
                        else
                        
                            $this->form_validation->set_message('verifyUser','Incorrect Email or Pass');
                            return false;
                        
                        redirect('LoginController/checklogin');
                    
            

模型是这样的

<?php
        class LoginModel extends CI_model
        
            public function login($name, $pass)
            
                $this->db->select('name,pass');
                $this->db->from('members');
                $this->db->where('name',$name);
                $this->db->where('pass',$pass);     

                $query = $this->db->get();

                if($query->num_rows() == 1)
                
                    return true;
                
                else
                
                    return false;
                
            
        

视图是

                  <html>
                    <head>
                    <title></title>
                </head>
                <body>
                <?php echo validation_errors(); ?>
                <?php echo form_open('LoginController/checklogin'); ?>
                UserName: 
                <input type="text" name="username" /><br/>
                password:
                <input type="text" name="password" />
                <input type="submit" value="Login" name="submit" />
                </form>
                </body>
                </html>

登录正常工作需要一个会话并在此注销。

【问题讨论】:

@Deep Parekh 先生,如果您不忙,需要这方面的指导...... How to save and extract session data in codeigniter 的可能重复项 @Meenesh Jain 先生,我尝试了在线示例,但无法理解会话系统我的登录系统运行良好,只想在其上添加一个会话并在此注销。 查看答案和参考链接 在上面的代码中使用该代码集成两个代码 【参考方案1】:

1) 首先包含

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

2) Store dataarray 中您要存储在 session 中:

$data= array(
                   'username'  => 'username',
                   'password'     => 'password',
                   'email'=>'emailid'
                   'logged_in' => 'login id'
               );

3) 在会话存储数据

$this->session->set_userdata($data);

您可以随时使用此数据,例如,如果您想从会话中获取登录 ID,您可以编写:

$loginid= $this->session->userdata('logged_in');

登出时:

$this->session->unset_userdata(array("username"=>"","logged_in"=>"","password"=>"","email"=>""));
$this->session->sess_destroy();
redirect('loginpage');

如果您不想直接访问页面,请创建一个模型并添加此 代码并自动加载该模型。

public function valid_allowed()//check user is login or not
    
        $session = $this->session->userdata('username'); //here you can take loginid, email whatever you store in session
        if(!$session)
        
            redirect('login');
        
    

自动加载模型

转到application->config->autoload.php:这一行:

$autoload['model'] = array('model name');

改变你的模型:

<?php
        class LoginModel extends CI_model
        
            public function login($name, $pass)
            
                $this->db->select('name,pass');
                $this->db->from('members');
                $this->db->where('name',$name);
                $this->db->where('pass',$pass);     

                $query = $this->db->get();

                if($query->num_rows() == 1)
                
                    $row=$query->row();
                    $data=array(
                    'username'=>$row->u_username,
                    'id'=>$row->id,
                    'email'=>$row->email
                    'password'=>$row->u_password);
                    $this->session->set_userdata($data);
                    return true;
                
                else
                
                    return false;
                
            
        

更改您的 verifyUser 函数:

 public function verifyUser()
                        
                            $name = $this->input->post('username');
                            $pass = $this->input->post('password');

                            $this->load->model('LoginModel');
                            $result=$this->LoginModel->login($name, $pass))
                         if(!$result)                   
                         

             $this->form_validation->set_message('verifyUser','Incorrect Email or Pass');
                                return false;
                     redirect('LoginController/checklogin');

                        
                        else
                           
                           redirect('dashboard');   //user is valid so goto dashboard
                        

【讨论】:

先生,我不知道我将这些数据放在我的示例中的什么位置,所以,您能帮我解决这个问题吗...先生... 查看我编辑的代码“更改您的模型”根据您的数据更改数据名称 如果登录完成,然后尝试打印一些会话数据,如用户名或任何要验证的内容.... 如何打印...我的意思是在仪表板上打印它或 echo $username,, echo $id like that sir..? 阅读我已经告诉过的答案。 $username= $this->session->userdata('username');回声$用户名;退出;【参考方案2】:

一旦登录成功,像这样在会话中设置用户ID

$this->session->set_userdata("id",$variable);

这可以在任何地方完成,但对你来说,在模型中做

if($query->num_rows() == 1)
         
    // set session here and then return true.
    return true;

else

    return false;
  

所以当你想检查会话是否存在时,做这样的事情

if(!$this->session->userdata("id"))
    // redirect the user to login page

在您需要登录的所有控制器的构造函数中编写上述代码。确保你不在登录控制器中检查会话数据。

【讨论】:

谢谢你的回答,但你能帮我把这段代码放在我的代码上吗? 我在上面提到过。将其保存在您检查 num_rows() 的模型中 我无法进入 throw login 重定向的东西可能正在工作,但我现在无法登录....跨度> 这样 if($query->num_rows() == 1) $query = $query->row(); $this->session->set_userdata("id",$query->id);返回真; 否则 返回错误; 同样的问题先生...无法使用正确的数据登录。【参考方案3】:

请参阅在 CI 中使用 session 的简单过程

包含此库以执行会话,否则会话将无法工作

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

要在会话中保存数据,您需要创建一个数据数组,然后使用set_userdata() 来保存会话数据

 $newdata = array(
                   'username'  => 'example_user',
                   'email'     => 'someone@some-site.com',
                   'logged_in' => 1
               );

$this->session->set_userdata($newdata);

在会话中有很多事情你应该记住

请参阅参考资料 here 和 here

【讨论】:

【参考方案4】:

如果您不断遇到此错误,只需更新您的会话文件:

系统/库/Session/Session.php

使用最新的在线文件。

【讨论】:

以上是关于如何在登录系统中使用会话并在codeigniter中实现注销的主要内容,如果未能解决你的问题,请参考以下文章

如何修复CodeIgniter-3中没有工作的会话

CodeIgniter 登录会话

CodeIgniter 会话类在 Chrome 中不起作用

我应该在 CodeIgniter 中使用哪个会话库?

SESSION 变量在 Codeigniter php 中的 redirect() 上被重置

手动设置会话过期时间-CodeIgniter