2013-08-27 52 views
12

嗨,我已经在Codeigniter中创建了一个会话,我在模型中设置了会话变量。但是,当我通过Controller在视图中调用会话变量时设置会话变量值后,会话变量值变为空。任何帮助?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'); 
     } 
    } 

我已经叫session_start();控制器下construct();

,这是我如何访问会话变量我认为

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

..... 
+0

你能否粘贴你的代码? – Bora

+1

你的代码在哪里 –

+0

你有'session_start()'在所有相关文件的顶部,我拿? – 2013-08-27 07:01:20

回答

0

使用自动加载的应用程序/配置/ autoload.php,添加会话liblary和除去在session_start();

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

型号合格后数据vithout可变因素,你可以做这样的:

控制器:

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; 
    } 
} 
+0

我试过这个,但没有工作... – Abbasi

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这将帮助你

0

你并不需要使用PHP的核心session_start(); 请确保您有加载Session库在autoload.php

为:

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

,或者你可以手动加载会议库:作为

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

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

0

请使用此代码笨

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

我有同样的问题设置会话,它得到了解决使用本code.Hope你的作品呢!

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

...从控制器处理会话。

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 != "") { ?> 
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; 
    } 

} 
0

请按照下面的说明。

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

当您在codigniter中使用会话时,您没有在文件的开头添加session_start(),因为codigniter核心系统会自动处理该操作。

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

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

谢谢。

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 ['libraries'] = array(); =>添加这样的会话 $ autoload ['libraries'] = array('session');

三江源..:d

1

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

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

  1. 集flashdata: $这个 - >会话级> set_flashdata( '项目', '值');

  2. get flashdata: $ this-> session-> flashdata('item');

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

0

用户默认的PHP会话,像session_start()$_SESSION,这是为我工作。在php codeignatore