Я столкнулся с этим вопросом со вчерашнего дня, и все же я не мог этого разрешить. Проблема заключается в том, что сеансы не работают в локальной среде, но когда для целей тестирования я помещаю те же файлы на живой сервер, они работают нормально.
Вот если мой файл config.php :
$config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = 'ci_sessions'; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE; $config['cookie_prefix'] = ''; $config['cookie_domain'] = ''; $config['cookie_path'] = '/'; $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE;
Вот как я сохраняю данные в одном из своих файлов модели
$this->session->set_userdata('user',$result); //$result works fine, it produces right result
На мой взгляд, я попытался получить доступ к этому:
$this->session->userdata['user']['name']; //name here is an element in result array
Я получаю эту ошибку:
Уровень важности: уведомление
Сообщение: Неопределенный индекс: пользователь
Имя файла: home / home.php
Номер строки: 2
К моему удивлению, этот же код работает без ошибок на сервере.
Кроме того , чтобы знать данные, сохраняемые сеансами Codeigniter, я попробовал метод базы данных.
Я изменил код ниже в файле config.php
$config['sess_driver'] = 'database'; $config['sess_cookie_name'] = 'ci_sessions'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = 'ci_sessions'; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300;
Вместо того, чтобы вставлять один ряд данных, он вставляет четыре. См. Снимок экрана из базы данных (последние четыре строки).
Может ли кто-нибудь указать на ошибку? Любая помощь будет оценена.
У вашего вопроса несколько частей, я отвечу каждому по очереди.
userdata()
– метод. То, как вы обращаетесь к нему, относится к нему как к массиву:
$this->session->userdata['user']['name']; // Bad
Как описано в документах , вы должны передать ключ значения, которое вы хотите получить в качестве параметра для метода userdata
:
$user = $this->session->userdata('user'); // Now you can echo $user['name'];
Еще проще использовать новый синтаксис:
$user = $this->session->user; // Now you can echo $user['name'];
Проверьте поля timestamp
. Они показывают 3 разных раза, а это три отдельных события на сайте. Первое происходит в 1501911275
, затем через 6 секунд появляются еще 2 записи, а затем через 139 секунд последняя запись. Они представляют собой 3 отдельных запроса на сайт – возможно, вы посещали разные страницы, или тестирование и перезагрузку.
Что касается того, почему существует несколько записей, это потому, что идентификатор сеанса периодически регенерируется. Точно как часто это происходит, зависит от вашей конфигурации, см. sess_time_to_update
конфигурации sess_time_to_update
. Как часто они уничтожаются, также зависит от вашего sess_regenerate_destroy
(см. sess_regenerate_destroy
в том же разделе документации), но обычно старые записи сеанса сохраняются некоторое время и позже очищаются сбором мусора. Поэтому, пока у вас есть только 1 «текущая» запись сеанса, старые записи могут сохраняться некоторое время.
sess_save_path
Из формулировки вашего вопроса, я думаю, вы хотите использовать драйвер сеанса files
и только попробовали драйвер database
для тестирования. Если это правильно, в конфигурации сеансов файлов есть проблема, которую вы должны исправить.
Согласно документам :
поддерживаются только абсолютные пути для $ config ['sess_save_path'].
Комментарии в config/config.php
также говорят:
ПРЕДУПРЕЖДЕНИЕ: Поддерживаются только абсолютные пути!
Ваша конфигурация указывает, что данные сеанса должны быть сохранены в ci_sessions
, что не является абсолютным путем:
$config['sess_save_path'] = 'ci_sessions'; // Bad
Я не уверен, как будет интерпретироваться, но я думаю, что каталог не будет существовать, и у веб-сервера не будет прав на его создание. Я не могу представить, почему он работает на вашем реальном сервере.
Измените путь на абсолютный путь и убедитесь, что ваш веб-сервер может писать на него. Опять из документов
mkdir /<path to your application directory>/sessions/ chmod 0700 /<path to your application directory>/sessions/ chown www-data /<path to your application directory>/sessions/
(сменить www-data
пользователю, на котором работает ваш веб-сервер). А потом:
$config['sess_save_path'] = '/<path to your application directory>/sessions/';
Если вы прочитаете ссылку класса setuserdata
ожидает, что вторым аргументом будет значение, то в случае, если первым аргументом является ключ, следовательно, ошибка.
с помощью Codeigniter, вы не сможете достичь того, чего хотите, поскольку он использует:
установить следующим образом:
$result=array('name'=>'john doe');
$this->session->set_userdata($result);
или $this->session->set_userdata('name','john doe');
сделайте так:
echo $this->session->userdata(['name']);
с другой стороны, используя vanilla php $_SESSION
вы можете добиться этого так:
set: $_SESSION['user']=$result;
get: echo $_SESSION['user']['name'];
о $ _SESSION в php manual
заметка:
К моему удивлению, этот же код работает без ошибок на сервере.
это связано с настройкой « ENVIRONMENT
, так как на сервере выпуска (live) имеется ограничение на error_reporting
. Это устанавливается в корневой index.php
.
change define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
to: define('ENVIRONMENT', 'production');
и вы также не увидите ошибку на вашем локальном хосте.
Обновить:
Фактически $this->session->set_userdata('name', $name);
работает, но функция userdata () принимает только один аргумент и ожидает, что это будет строка
если вы заглянете в библиотеку сессий (/system/libraries/Session/Session.php), вы найдете ее рядом со строкой 747:
/** * Userdata (fetch) * * Legacy CI_Session compatibility method * * @param string $key Session data key * @return mixed Session data value or NULL if not found */ public function userdata($key = NULL) { if (isset($key)) { return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL; } elseif (empty($_SESSION)) { return array(); } $userdata = array(); $_exclude = array_merge( array('__ci_vars'), $this->get_flash_keys(), $this->get_temp_keys() ); foreach (array_keys($_SESSION) as $key) { if ( ! in_array($key, $_exclude, TRUE)) { $userdata[$key] = $_SESSION[$key]; } } return $userdata; }
Следуйте этим
В config.php
Set $config['sess_save_path'] = NULL;
Как вы сказали $this->session->set_userdata('user',$result); //$result works fine, it produces
$this->session->set_userdata('user',$result); //$result works fine, it produces
выше $result
shoulb, как это
$result = array( 'user' => 'Ab', ..... 'logged_in' => TRUE );
echo $this->session->userdata('user');
или
$user = $this->session->userdata('user'); echo $user;
Кажется, проблема была в PHP версии 7.1, поскольку CI 3.1.6 не поддерживал эту версию PHP.
Я не уверен, что это правильное объяснение, но когда я вернулся к PHP версии 5.6, все стало работать совершенно нормально.
Я думаю, проблема с доступом к данным сеанса с неправильным синтаксисом. Вы можете использовать синтаксис ниже для установки данных сеанса и получения данных сеанса.
Пример для набора данных сеанса
$session_data = array('name' => "kiran"); $this->session->set_userdata('user', $session_data);
Пример получения хранимых данных сеанса
$this->session->userdata('user')['name'];
$config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = NULL; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300;
.htaccess
DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php?/$1 [
L, QSA]