Ошибка приложения Codeigniter 3: не удается сохранить определенное значение столбца в сеансе

#php #codeigniter #session #codeigniter-3

#php #codeigniter #сеанс #codeigniter-3

Вопрос:

Я работаю над приложением для социальной сети с Codeigniter 3, Ion-Auth и Bootstrap 4. Вы можете увидеть репозиторий Github ЗДЕСЬ.

Я хочу сохранить first_name зарегистрированного пользователя в текущем сеансе. Для этой цели в исходный $session_data массив я добавил строку 'user_first_name' => $user->first_name,

 $session_data = [
        'identity'                 => $user->{$this->identity_column},
         $this->identity_column     => $user->{$this->identity_column},
        'email'                    => $user->email,
        'user_id'                  => $user->id,
        'user_first_name'          => $user->first_name, //retrieve from the first_name column
        'old_last_login'           => $user->last_login,
        'last_check'               => time(),
        'ion_auth_session_hash'    => $this->config->item('session_hash', 'ion_auth'),
];
  

Смысл этого в том, чтобы показать приветственное сообщение после входа в систему с идентификатором пользователя:

 Welcome, <?php echo $this->session->userdata('user_first_name'); ?>
  

Я получаю am Undefined property $first_name сообщение, и приветственное сообщение не содержит ничего, кроме «Добро пожаловать» (несмотря на то, что он $this->session->userdata('user_first_name') возвращает идентификатор пользователя).

Чего не хватает?

Комментарии:

1. вы проверили в своей users таблице ion auth, что у вас есть правильные данные?

2. Не хватает одного — номера файла и строки, в которых это происходит.

3. @Vickel да, dara есть.

4. Я думаю, вы не хотите устанавливать сеанс. Например, $this->session->set_userdata('user_first_name', $user->first_name);

Ответ №1:

Краткий обзор того, что $user в Ion_auth_model.php , set_session() использует var_dump, показывает, что это так…

 LINE: 1944 Module Ion_auth_model
object(stdClass)#26 (5) {
  ["email"]=>
  string(21) "frednurk@gmail.com"
  ["id"]=>
  string(1) "8"
  ["password"]=>
  string(60) "$2y$10$MGlESdMfrr/UNd.mdW4Vr.nyTqES0SB6rEnaDBOYocwU7yLXVqNMq"
  ["active"]=>
  string(1) "1"
  ["last_login"]=>
  string(10) "1599322333"
}
  

Который не содержит first_name. Это то, что вы ожидали из-за вашего сообщения об ошибке.

Поиск, где это вызывается, приведет вас обратно к Ion_auth_model.php — вход в систему, где запрос выбора для $user является

 $query = $this->db->select($this->identity_column . ', email, id, password, active, last_login')
                  ->where($this->identity_column, $identity)
                  ->limit(1)
                  ->order_by('id', 'desc')
                  ->get($this->tables['users']);
  

И, как и ожидалось, отсутствует first_name.

Поэтому добавляем first_name в Select вот так…

 $query = $this->db->select($this->identity_column . ', email, id, password, active, last_login, first_name')
                  ->where($this->identity_column, $identity)
                  ->limit(1)
                  ->order_by('id', 'desc')
                  ->get($this->tables['users']);
  

Приводит к тому, что $user становится…

 LINE: 1944 Module Ion_auth_model
object(stdClass)#26 (6) {
  ["email"]=>
  string(21) "frednurk@gmail.com"
  ["id"]=>
  string(1) "8"
  ["password"]=>
  string(60) "$2y$10$MGlESdMfrr/UNd.mdW4Vr.nyTqES0SB6rEnaDBOYocwU7yLXVqNMq"
  ["active"]=>
  string(1) "1"
  ["last_login"]=>
  string(10) "1599322333"
  ["first_name"]=>
  string(3) "Tim"
}
  

И тогда все хорошо.

Заключение

  1. Прочитайте сообщения об ошибках
  2. Выполните отладку, проверив ваши переменные / массив / объекты, чтобы увидеть, что они собой представляют.
  3. Вернитесь и исправьте это.

При отладке у меня есть этот небольшой фрагмент кода, который я использую

 echo '<pre>';
echo 'LINE: '. __LINE__. ' Module '.__CLASS__.'<br>';
var_dump(WHAT_TO_LOOK_AT_GOES_HERE);
echo '</pre>';