2011-11-02 102 views
0

请看看这个。不能在会话codeigniter中设置用户数据

下面的代码是从我的模型类(使用DataMapper的ORM)

function login() 
    { 

     $u = new User(); 


     $u->where('username', $this->username)->get(); 


     $this->salt = $u->salt; 

     $this->validate()->get(); 


     if (empty($this->id)) 
     { 
      // Login failed, so set a custom error message 
      $this->error_message('login', 'Username or password invalid'); 

      return FALSE; 
     } 
     else 
     { 
      // Login succeeded 
      $data = array 
      (
       'username' => $u->username, 
       'usergroup' => $u->usergroup->get(), 
       'is_logged_in' => true 

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


      return TRUE; 
     } 
    } 

当我这样做,我得到

**Fatal error: Call to a member function set_userdata() on a non-object** 

但是当我做到这一点,而不是

$data = array 
      (
       'username' => $u->username, 
       'usergroup' => $u->usergroup->get(), 
       'is_logged_in' => true 
      ); 
      $obj=& get_instance(); 
      $obj->session->set_userdata($data); 

有用。

请问什么才能正常工作?

在此先感谢。

+0

你先加载Session库? '$ this-> load-> library('session')' – Vikk

+0

严禁。你在哪里使用你的第一个代码? –

+0

你是从图书馆做这个的吗?在这种情况下,'$ this'将不包含CI实例,请参阅http://codeigniter.com/user_guide/general/creating_libraries.html – danneth

回答

0

那么,你没有提供足够的信息。 第一个代码看起来不错,但前提是:

  1. 你实际调用它(你还需要建立在你的configs加密密钥)之前加载会话类。 $this->load->library('session'); $this->session->set_userdata($data);

  2. 上述代码或代码位于控制器,模型或视图中。 $this与CI的超类有关,特别是与Session类的一个实例有关,所以如果你在一个帮助器(函数集合)内部或者在一个库里(你需要先创建一个CI实例)调用它,它不会工作。

+0

所有这一切,让我更加清楚。 – mojotaker

+0

@mojotaker我还是没有看到你加载会话类的地方......它是自动加载的吗? –

+0

是的,它是自动加载的。 – mojotaker

1

你的模型没有扩展CI_Model 之后,你必须构造函数添加到模型 将此代码添加到您的

function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('session'); 
    }