2014-09-13 3 views
0

Кто-нибудь здесь знаком с сессиями CodeIgniter? У меня есть скрипт входа, который является функциональным. При успешном входе в систему создается сеанс. Пользователь перенаправляется на домашнюю страницу. На новой странице должно отображаться имя пользователя, поскольку оно хранилось в переменных сеанса, но ничего не показывает.сеансы codeigniter не переносятся со страницы на страницу

Код из сценария входа:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Login extends CI_Controller { 

    /** 
    * Index Page for this controller. 
    */ 
    public function index() { 
     $this->load->library('session'); 
     $BB_DATA = array(); 
     if(isset($_POST['login'])) { 
      // SELECT username, password FROM Bacon or bacon-like product. <-- Fuck you #nobanchancom 
      if(!empty($_POST['username']) && !empty($_POST['password'])) { 
       $q = sprintf('SELECT user_pk, username, pwhash, salt FROM tbl_user WHERE `username`=%s LIMIT 1;', $this->db->escape($_POST['username'])); 
       $records = $this->db->query($q); 
       $username = $_POST['username']; // i added this 
       if($records->num_rows() == 1) { 
        $record = $records->row(); 
        $test_hash = hash_password($record->salt . $_POST['password']); 
        if($record->pwhash === $test_hash) { 
         $new_salt = generate_salt(); 
         $new_hash = hash_password($new_salt . $_POST['password']); 
         $q = sprintf('UPDATE tbl_user SET `pwhash`="%s", `salt`="%s" WHERE `user_pk`="%s" LIMIT 1;', $new_hash, $new_salt, $record->user_pk); 
         if($updates = $this->db->query($q)) { 
          $BB_DATA['messages']['information'][] = "Login successful."; 

          //add custom data to session 
          $this->session->set_userdata('username', "$username"); 

          //$this->session->set_userdata('some_name', 'some_value'); 
          // redirect to /users/home/ 
          redirect(site_url() . 'users/home/'); exit(); 
         } else { 
          $BB_DATA['messages']['critical'][] = "You have logged in successfully, but an error has occurred during login."; 
         } 
        } else { 
         $BB_DATA['messages']['critical'][] = "That username/password does not match."; 
        } 
       } else { 
        $BB_DATA['messages']['warning'][] = "That username/password does not exist."; 
       } 
      } else { 
       $BB_DATA['messages']['warning'][] = "You must enter a username/password."; 
      } 
     } 
     if(isset($_POST['register'])) { 
      // Redirect to /register/ 
      redirect(site_url() . 'register/'); 
     } 
     $this->load->view('login', $BB_DATA); 
    } 
} 

/* End of file login.php */ 
/* Location: ./application/controllers/login.php */ 

А то вот код для пользователей посадки страницу:

<?php 
class Users extends CI_Controller { 

    public function home() 
    { 
     $this->session->userdata('username'); 
     require_once(APPPATH . 'views/header.inc.php');//header 
      include(APPPATH . 'views/breadcrumbs.inc.php');//top breadcrumbs 

      echo ' <h1>Welcome'.$username.',</h1>'; 
      //$username = $this->session->userdata('username'); 
      echo $this->session->all_userdata(); 
      //echo $username; 
      include(APPPATH . 'views/breadcrumbs.inc.php');//bottom breadcrumbs 
      require_once(APPPATH . 'views/footer.inc.php');//footer 
    } 



} 

?> 

В сценарии входа в систему, я называю codeigniters сеанс Library-

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

позже, считая, что все пошло правильно, я добавляю переменную $ username в данные сеанса. Пользователь перенаправляется, а оттуда

$ this-> session-> userdata ('username'); следует установить переменную. Это не.

Предложения?

ПРИМЕЧАНИЕ: Итак, я использовал print_r(array_values($this->session->all_userdata())); для печати всех значений в массиве. Она содержала:

Array ([0] => 4c46f32b249ed55e8439152d63365fed [1] => 75.134.164.245 [2] => Mozilla/5.0 (Windows NT; Win64; 64; с.в.: 26.0) Gecko/20100101 Firefox/26,0 Waterfox/26,0 [3] => 1410568024 [4] => [5] => ottomatic)

так мне интересно, почему это добавить его в [5], а не 'имя пользователя'?

+0

Нет, что не будет инициализировать переменную, вам нужно выполнить $ username = $ this-> session-> userdata ('username'). Также убедитесь, что библиотека сеансов загружена в диспетчере пользователей перед чем-либо –

+0

, пожалуйста, см. Мое редактирование. Кроме того, согласно документации, вы не называете сессионную библиотеку в каждом контроллере. Codeigniter обрабатывает свои собственные сеансы после первого вызова. Или это устарело и никогда не обновлялось? – user3175451

+1

Вы видите 5 как индекс, потому что используете array_values ​​(), а не только print_r'ing самого массива. Если библиотека сеансов не загружена автоматически (в config/autoload.php), вам необходимо загрузить ее на каждом контроллере, в котором вы собираетесь его использовать. –

ответ

0

Благодаря нескольким советам в правильном направлении от @ xd6_, я увидел, что происходит.

Я неправильно прочитал документацию - вам нужно загружать сеансы на каждую страницу, если она не находится в массиве /config/autoload.php.

Как только это было сделано, я был в состоянии получить доступ к элементу массива по имени, как

$ UserName = $ this-> session-> UserData ('имя пользователя');

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