2015-03-19 2 views
0

У меня в моей БД разные роли пользователя. Когда пользователь регистрируется, он может вставлять в БД более одной роли. Но когда я сохраняю его в сеансе, он сохраняет только одну роль. В некотором примере у пользователя есть 2 роли - ученик и клиент, но он отображается только как ученик.Как заставить пользователя иметь более одной роли в сеансе

Мой контроллер Войти является:

<?php 
 
class Home extends CI_Controller { 
 
//some code 
 
public function login() 
 
    { 
 
      
 
\t  $this->load->model('user_model'); 
 
     $user=$this->user_model->login(); 
 
     if(count($user) > 0) \t 
 
     { 
 
       $this->load->library('session'); 
 
      
 
       $data = array(
 
        'username' => $user['username'], 
 
        'user_id' => $user['user_id'], 
 
        'is_logged_in' => TRUE 
 
       
 
       ); 
 

 
      $this->session->set_userdata($data); 
 
     
 
      $user_role=$this->user_model->user_role(); 
 

 
      $role=$this->session->set_userdata($user_role); 
 

 
      $user_role = $this->session->userdata('role_id'); 
 

 

 
      if($user_role == 1) 
 
      { 
 
        
 
       redirect('student/index'); 
 
      } 
 
//and so on for other roles 
 
    } 
 
} 
 
}

В моей модели я использую "row_array". Если я использую result_array(), есть уведомление: «undefined index username, user_id в Controller». Моя модель:

public function login() 
 
    { 
 
\t   
 
     $this->db->where('username', $this->input->post('username')); 
 
     $this->db->where('password',sha1($this->input->post('password'))); 
 
     $result=$this->db->get('users'); 
 
\t \t 
 
\t \t return $result->row_array(); 
 
\t \t \t 
 
    } 
 
public function user_role() 
 
{ 
 
    
 
    $this->db->select('role_id'); 
 
    $this->db->where('user_id', $this->session->userdata['user_id']); 
 
    $result=$this->db->get('user_roles'); 
 
     return $result->result_array(); 
 
    
 
}

+1

Вам либо нужно, чтобы '$ user_role' был массивом всех ролей, которые у пользователя есть, либо вы можете определить свои роли по степеням двух и использовать побитовые операторы на них. Итак, student = 1, teacher = 2, admin = 4, как admin, так и teacher = 2 + 4 = 6. Тогда 'if ($ user_role & 1)' (note single &) будет true, если бит студента установлен для этого пользователь. Наверное, проще использовать массив. – Jerry

+0

user_role [] - массив. Я использую их таким образом student = 1, teacher = 2, customer = 3 и так далее. Я перенаправляю их на соответствующие страницы, но моя идея заключается в том, что вы одновременно регистрировались как учитель и клиент, вы должны видеть страницы как для студентов, так и для клиентов. Я сделал это в БД - разные роли пользователя видят разные страницы, но в моем проекте этот пользователь отображается только как учащийся в сеансе. –

+0

Можете ли вы рассказать, почему вы должны хранить роли в сеансе? возможно, мы сможем найти другое решение. – lyhong

ответ

1

Вы можете сохранить массив внутри сессии.
Вы можете сделать это путь

$user_role=$this->user_model->user_role();//lets assume it returns the roles array 
$this->session->set_userdata('roles'$user_role);//now you can set it inside roles varibale which contains the role array 

//now to get the value from session use this 

$roles=$this->session->userdata('roles'); 
//now roles contains the array of roles 
//check your current roles info in the $roles array 

надеюсь, вы понимаете.

+0

да, но моя функция user_role() возвращает $ result-> row_array(); Если я изменил его как $ result-> result_array(); он не работает. –

+0

Он будет работать сейчас. Но вам нужно сохранить его на сеанс, как и я. Поскольку ваши текущие роли будут в массиве, вам нужно найти свой текущий идентификатор роли внутри массива. Вы не можете проверить простой 'if ($ user_role == 1) ' –

+0

Как я могу проверить свою сессию, когда она является массивом, если в ней сохранены 2 роли. - var_dump() что в моем примере? –

Смежные вопросы