Codeigniter 中的会话变量不工作

Posted

技术标签:

【中文标题】Codeigniter 中的会话变量不工作【英文标题】:Session variable in Codeigniter Not Working 【发布时间】:2013-08-29 19:38:14 【问题描述】:

您好,我在 Codeigniter 中创建了一个会话,我在我的模型中设置了会话变量。但是,当我通过控制器在视图中调用会话变量时设置会话变量值后,会话变量值变为空。有什么帮助???

更新

这是我设置会话变量的模型

function login ($username, $password)

    
        $this->db->where('username' , $username);
        $this->db->where('password', $password);

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

        if ($query->num_rows()>0)

        
            foreach ($query->result() as $rows)
            
                $data = array(

                    'user_name' => $rows->username,
                    'logged_in' => TRUE,
                    'validated' => true
                );
            

                $this->session->set_userdata($data);
                //$user = $rows->username;
                //$this->session->set_userdata('user_name', $user);

                return true;
        

        else

        
            return false;
        

    

这是我重定向到视图的控制器

public function verification()

    
        $username = $this->input->post('username');
        $password = $this->input->post('password');


        $result = $this->site_model->login($username, $password);


        //$result = $this->session->set_userdata('validated');

        if ($result)
        
            //$this->admin();
            //$this->session->set_userdata('login_state', TRUE);

            redirect ('site/index');

        
        else
        

            redirect ('site/login');
            //$this->load->view('login');
        
    

我在construct();下的控制器中调用了session_start();

这就是我在视图中访问会话变量的方式

<?php if ($this->session->userdata('user_name') != "")  ?>

.....

【问题讨论】:

你能粘贴你的代码吗? 你在所有相关文件的顶部都有session_start(),我接受吗? 你在使用 CI 的会话类吗?还是您手动设置会话变量? (如果您不了解会话课程,请转到此处:ellislab.com/codeigniter/user-guide/libraries/sessions.html 我已经用我的代码更新了我的问题.. 在使用 Session 类时不需要调用 session_start(),它不使用原生 PHP 会话,如果你期望查询只有一个结果,你应该使用 $query-&gt;row() 它会返回一个对象,因此您无需使用 foreach 循环 【参考方案1】:

使用 autoload applications/config/autoload.php,添加 session 库并删除 session_start();

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

模型传递数据没有变量,你可以这样做:

控制器:

public function verification()

     $result = $this->site_model->login();

      if ($result)
          redirect ('site/index');
       else 
          redirect ('site/login');
      

型号:

public function login()

    $this->db->where('username' , $this->input->post('username'));
    $this->db->where('password', $this->input->post('password'));

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

    if ($query->num_rows()>0)

    
        $res = $query->row_array();

        $data = array(
            'user_name' => $res['username'],
            'logged_in' => TRUE,
            'validated' => true
        );


        $this->session->set_userdata($data);
        return true;
     else 
        return false;
    
 

【讨论】:

【参考方案2】:

在控制器中设置会话变量。这对我很有效

型号

    function Login($email,$pass)
         $this->db->where('username' ,$email);
         $this->db->where('password',$pass);
         $query=$this->db->get('users');    
     if ($query->num_rows == 1)            
    return true;     
           
     return FALSE;
    

控制器:

        function varification()
            $this->load->model('login_model');
    $email=$this->input->post('email');
    $pass=$this->input->post('pass');
    $success=$this->login_model->Login($email,$pass);
    if ($success)  
                 $data = array(
                       'user_name' => $rows->username,
                       'logged_in' => TRUE,
                      'validated' => true
                 );
                $this->session->set_userdata($data);
                redirect ('site/index');
     else // incorrect id or password
             redirect ('site/login');
            
    

现在,如果您回显&lt;?php echo $this-&gt;session-&gt;userdata('user_name');?&gt;,它将显示会话用户名。即使在视图中,您也可以在任何地方回显它。希望这会对您有所帮助

【讨论】:

【参考方案3】:

你不需要使用核心php session_start(); 确保你已经在 autoload.php 中加载了会话库

作为:

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

或者您可以手动加载会话库:as

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

有关完整文档,您可以参考:Read Documentation

【讨论】:

【参考方案4】:

请使用此代码在 codeigniter 中设置会话

$this->session->set_userdata('user_session', $user_session_data);

我遇到了同样的问题,使用此代码已解决。希望它也适用于您!

【讨论】:

【参考方案5】:

在模型中设置会话变量对于任何 CMV 框架(如 codeigniter)都不是一个好主意。编辑您的模型的 login() 函数,使其返回一组不错的信息...

function login ($username, $password)
    
        $this->db->where('username' , $username);
        $this->db->where('password', $password);

        $query = $this->db->get('users');
        if ($query->num_rows()>0)
        
            foreach ($query->result() as $rows)
            
                $data = array(
                    'user_name' => $rows->username,
                    'logged_in' => TRUE,
                    'validated' => true
                );
            
            return $data;
        
        else
        
            return false;
        
    

...并处理来自控制器的会话。

public function verification()
    
        $username = $this->input->post('username');
        $password = $this->input->post('password');

        $result = $this->site_model->login($username, $password);

        if ($result == false)
        
            redirect ('site/login');
            //$this->load->view('login');
        
        else
        
            $this->session->set_userdata($result);
            redirect ('site/index');
        
    

另外,为了让视图文件可以使用会话的数据,您需要通过控制器传递它们

$data['user_name'] = $this->session->userdata('user_name');

然后你可以在你的视图文件中做任何事情:

<?php if ($user_name != "")  ?>

【讨论】:

【参考方案6】:

您好,我认为您需要更改模型代码 您正在会话中设置数组并在会话中访问直接用户名

我认为下面的代码对你有用,

function login ($username, $password)


    $this->db->where('username' , $username);

    $this->db->where('password', $password);

    $query = $this->db->get('users')->row();

    if (count($query) > 0)

    

            $this->session->set_userdata('user_name', $query->username);
            $this->session->set_userdata('logged_in', true);
            $this->session->set_userdata('validated', true);

            return true;
    

    else

    
        return false;
    


【讨论】:

【参考方案7】:

请按照以下说明进行操作。

确保您已在 autoload.php 文件中添加会话库,以便会话自动加载。

当你在 codigniter 中使用 session 时,你没有在文件开头添加 session_start() 因为 codigniter 核心系统会自动处理这个。

在控制器而不是模型中设置会话变量是个好主意。

我希望这可以帮助您解决问题。

谢谢。

【讨论】:

【参考方案8】:

这是我的解决方案,希望对您有所帮助.. :D

在你的模型中..我复制粘贴下面的代码,但我改变了一点..

function login ($username, $password)

    
        $this->db->where('username' , $username);
        $this->db->where('password', $password);

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

        if ($query->result())//if any record
        
            $rows = $query->row();

            $data = array(
                    'user_name' => $rows->username,
                    'logged_in' => TRUE,
                    'validated' => true
            );
            $this->session->set_userdata($data);
            return true;    
        
        else
        
            return false;
        

    

在控制器中删除 session_start(),然后在 application/config/autoload.php 中删除

在这个 $autoload['libraries'] = array(); => 像这样添加会话 $autoload['libraries'] = array('session');

谢谢你.. :D

【讨论】:

【参考方案9】:

首先,在 CI 中,您不需要在任何地方使用 session_start()。仅在 config/autoload.php 文件中自动加载会话。

删除那个 session_start()。 尝试使用闪存数据。 Flashdata 是临时会话,主要用于您需要将用户重定向到另一个页面并显示一些成功或错误消息的情况。

    设置闪存数据: $this->session->set_flashdata('item', 'value');

    获取闪存数据: $this->session->flashdata('item');

这里是文档链接http://www.codeigniter.com/user_guide/libraries/sessions.html#flashdata

【讨论】:

【参考方案10】:

用户默认的 php 会话,如 session_start()$_SESSION,它对我有用。在 php codeignatore 中

【讨论】:

以上是关于Codeigniter 中的会话变量不工作的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使 Codeigniter 会话与边缘一起工作?

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

PHP:在视图中显示会话变量:CodeIgniter

Facebook SDK + CodeIgniter 会话

codeigniter 无法访问另一个控制器中的会话数据