Codeigniter中的会话变量不起作用

时间:2013-08-27 06:59:03

标签: php html codeigniter

您好我在Codeigniter中创建了一个会话我已经在我的模型中设置了会话变量。但是当我通过Controller在我的视图中调用会话变量时设置会话变量值后,会话变量值变为null。任何帮助???

更新

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

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');
        }
    }

我在session_start();

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

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

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

.....

10 个答案:

答案 0 :(得分:1)

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

删除session_start()。 尝试使用flashdata。 Flashdata是临时会话,主要用于您的类型,我们需要将用户重定向到另一个页面并显示一些成功或错误消息。

  1. 设置flashdata: $ this-&gt; session-&gt; set_flashdata(&#39; item&#39;,&#39; value&#39;);

  2. 获取flashdata: $这 - &GT;会话而&GT; flashdata(&#39;项目&#39);

  3. 以下是文档链接http://www.codeigniter.com/user_guide/libraries/sessions.html#flashdata

答案 1 :(得分:0)

使用autoload applications / config / autoload.php,添加会话liblary并删除session_start();

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

模型传递数据vithout varibles,你可以这样做:

控制器:

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 :(得分:0)

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

模型

    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');
            }
    }

现在,如果您回显<?php echo $this->session->userdata('user_name');?>,它将显示会话用户名。即使在view.hope中,你也可以在任何地方回应它。这将有助于你

答案 3 :(得分:0)

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

为:

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

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

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

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

答案 4 :(得分:0)

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

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

我遇到了同样的问题,并且使用此代码解决了。希望它对您也有用。

答案 5 :(得分:0)

在Model中设置会话变量对于任何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;
        }
    }

...并从Controller处理会话。

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 :(得分:0)

您好我认为您需要更改型号代码 您正在设置会话中的数组并在会话中访问直接user_name

我认为以下代码适合您,

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 :(得分:0)

请按照以下说明操作。

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

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

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

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

感谢。

答案 8 :(得分:0)

这是我的解决方案,希望能帮助..: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 [&#39; libraries&#39;] = array(); =&GT;像这样添加会话 $ autoload [&#39; libraries&#39;] =数组(&#39;会话&#39;);

谢谢..:D

答案 9 :(得分:0)

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