Я использую codeigniter 2.1.0.
Я пытаюсь выполнить функцию register / login, используя библиотеку сеансов в кодеигниторе.
Регистр / логин с библиотекой сеансов отлично работал для локального хоста, но, когда я вставлял его в эфир и пробовал, сеанс не работает.
Мой логин контроллера работает таким образом. Я проверяю учетные данные, как только я установил свои данные сеанса и перенаправил на другую страницу.
$user_data = array( 'username' => $result->user_name, 'email' => $result->user_email, 'userid' => $result->user_id, 'role' => $result->user_role, 'login_state' => TRUE, 'lastlogin' => time(), ); $this->session->set_userdata($user_data); print_r( $this->session->all_userdata()); redirect(base_url('dashboard'));
здесь, когда я распечатываю все свои данные сеанса, они распечатывают. Но на стороне контроллера панели, когда я пытаюсь распечатать данные сеанса, их больше не было.
Любая идея почему? Заранее спасибо за помощь.
Я не уверен, в чем проблема. Недавно я столкнулся с этим тоже ..
Он работал до этого в моем развитии под управлением php7.0.
В настоящее время он работает только на моем рабочем сервере с nginx и php 5.6. Мой сервер разработки, похоже, не работает и продолжает восстанавливать новую строку в таблице сеансов. Мой сервер разработки использует php7.1, в среде разработки виртуальной виртуальной среды homestead, обычно используемой для проектов Laravel.
Мне удалось преодолеть это, сделав этот шаг.
1) Перейти в систему / библиотеки / Session / Session.php
2) Комментируйте session_start (), добавив //. Мы хотим переместить sessionn_start ().
3) Перейдите к строке 315, где указано, что Security является королем, и закомментируйте до строки 351
4) Затем перейдите к основному index.php (корневому index.php)
5) Добавьте session_start () вверху один раз.
6) Хорошо повторите попытку. Надеюсь, это сработает. Я предполагаю, что он не работает с php 7.1, и в этом файле Session.php необходимо выполнить некоторое обновление.
Это дополнение к ответу «edelweiss», но я чувствую, что это требует большего внимания и, следовательно, публикации в качестве ответа.
CI 2.1 позорно относится к проблемам, связанным с сеансом. Лучше заменить встроенный файл Session.php ниже.
Ссылка, приведенная «edelweiss», нарушена. В файле Session.php он упоминает:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); //> makes dw cs4 happy /** * Session class using native PHP session features and hardened against session fixation. * * @package CodeIgniter * @subpackage Libraries * @category Sessions * @author Dariusz Debowczyk, Matthew Toledo * @link http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/ */ class CI_Session { var $flashdata_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message) function CI_Session() { $this->object =& get_instance(); log_message('debug', "Native_session Class Initialized"); $this->_sess_run(); } /** * Regenerates session id */ function regenerate_id() { // copy old session data, including its id $old_session_id = session_id(); $old_session_data = $_SESSION; // regenerate session id and store it session_regenerate_id(); $new_session_id = session_id(); // switch to the old session and destroy its storage session_id($old_session_id); session_destroy(); // switch back to the new session id and send the cookie session_id($new_session_id); session_start(); // restore the old session data into the new session $_SESSION = $old_session_data; // update the session creation time $_SESSION['regenerated'] = time(); // session_write_close() patch based on this thread // http://www.codeigniter.com/forums/viewthread/1624/ // there is a question mark ?? as to side affects // end the current session and store session data. session_write_close(); } /** * Destroys the session and erases session storage */ function destroy() { unset($_SESSION); if ( isset( $_COOKIE[session_name()] ) ) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy(); } /** * Alias for destroy(), makes 1.7.2 happy. */ function sess_destroy() { $this->destroy(); } /** * Reads given session attribute value */ function userdata($item) { if($item == 'session_id'){ //added for backward-compatibility return session_id(); }else{ return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item]; } } /** * Sets session attributes to the given values */ function set_userdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $_SESSION[$key] = $val; } } } /** * Erases given session attributes */ function unset_userdata($newdata = array()) { if (is_string($newdata)) { $newdata = array($newdata => ''); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { unset($_SESSION[$key]); } } } /** * Starts up the session system for current request */ function _sess_run() { session_start(); $session_id_ttl = $this->object->config->item('sess_expiration'); if (is_numeric($session_id_ttl)) { if ($session_id_ttl > 0) { $this->session_id_ttl = $this->object->config->item('sess_expiration'); } else { $this->session_id_ttl = (60*60*24*365*2); } } // check if session id needs regeneration if ( $this->_session_id_expired() ) { // regenerate session id (session data stays the // same, but old session storage is destroyed) $this->regenerate_id(); } // delete old flashdata (from last request) $this->_flashdata_sweep(); // mark all new flashdata as old (data will be deleted before next request) $this->_flashdata_mark(); } /** * Checks if session has expired */ function _session_id_expired() { if ( !isset( $_SESSION['regenerated'] ) ) { $_SESSION['regenerated'] = time(); return false; } $expiry_time = time() - $this->session_id_ttl; if ( $_SESSION['regenerated'] <= $expiry_time ) { return true; } return false; } /** * Sets "flash" data which will be available only in next request (then it will * be deleted from session). You can use it to implement "Save succeeded" messages * after redirect. */ function set_flashdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($flashdata_key, $val); } } } /** * Keeps existing "flash" data available to next request. */ function keep_flashdata($key) { $old_flashdata_key = $this->flashdata_key.':old:'.$key; $value = $this->userdata($old_flashdata_key); $new_flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($new_flashdata_key, $value); } /** * Returns "flash" data for the given key. */ function flashdata($key) { $flashdata_key = $this->flashdata_key.':old:'.$key; return $this->userdata($flashdata_key); } /** * PRIVATE: Internal method - marks "flash" session attributes as 'old' */ function _flashdata_mark() { foreach ($_SESSION as $name => $value) { $parts = explode(':new:', $name); if (is_array($parts) && count($parts) == 2) { $new_name = $this->flashdata_key.':old:'.$parts[1]; $this->set_userdata($new_name, $value); $this->unset_userdata($name); } } } /** * PRIVATE: Internal method - removes "flash" session marked as 'old' */ function _flashdata_sweep() { foreach ($_SESSION as $name => $value) { $parts = explode(':old:', $name); if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flashdata_key) { $this->unset_userdata($name); } } } }
с<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); //> makes dw cs4 happy /** * Session class using native PHP session features and hardened against session fixation. * * @package CodeIgniter * @subpackage Libraries * @category Sessions * @author Dariusz Debowczyk, Matthew Toledo * @link http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/ */ class CI_Session { var $flashdata_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message) function CI_Session() { $this->object =& get_instance(); log_message('debug', "Native_session Class Initialized"); $this->_sess_run(); } /** * Regenerates session id */ function regenerate_id() { // copy old session data, including its id $old_session_id = session_id(); $old_session_data = $_SESSION; // regenerate session id and store it session_regenerate_id(); $new_session_id = session_id(); // switch to the old session and destroy its storage session_id($old_session_id); session_destroy(); // switch back to the new session id and send the cookie session_id($new_session_id); session_start(); // restore the old session data into the new session $_SESSION = $old_session_data; // update the session creation time $_SESSION['regenerated'] = time(); // session_write_close() patch based on this thread // http://www.codeigniter.com/forums/viewthread/1624/ // there is a question mark ?? as to side affects // end the current session and store session data. session_write_close(); } /** * Destroys the session and erases session storage */ function destroy() { unset($_SESSION); if ( isset( $_COOKIE[session_name()] ) ) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy(); } /** * Alias for destroy(), makes 1.7.2 happy. */ function sess_destroy() { $this->destroy(); } /** * Reads given session attribute value */ function userdata($item) { if($item == 'session_id'){ //added for backward-compatibility return session_id(); }else{ return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item]; } } /** * Sets session attributes to the given values */ function set_userdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $_SESSION[$key] = $val; } } } /** * Erases given session attributes */ function unset_userdata($newdata = array()) { if (is_string($newdata)) { $newdata = array($newdata => ''); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { unset($_SESSION[$key]); } } } /** * Starts up the session system for current request */ function _sess_run() { session_start(); $session_id_ttl = $this->object->config->item('sess_expiration'); if (is_numeric($session_id_ttl)) { if ($session_id_ttl > 0) { $this->session_id_ttl = $this->object->config->item('sess_expiration'); } else { $this->session_id_ttl = (60*60*24*365*2); } } // check if session id needs regeneration if ( $this->_session_id_expired() ) { // regenerate session id (session data stays the // same, but old session storage is destroyed) $this->regenerate_id(); } // delete old flashdata (from last request) $this->_flashdata_sweep(); // mark all new flashdata as old (data will be deleted before next request) $this->_flashdata_mark(); } /** * Checks if session has expired */ function _session_id_expired() { if ( !isset( $_SESSION['regenerated'] ) ) { $_SESSION['regenerated'] = time(); return false; } $expiry_time = time() - $this->session_id_ttl; if ( $_SESSION['regenerated'] <= $expiry_time ) { return true; } return false; } /** * Sets "flash" data which will be available only in next request (then it will * be deleted from session). You can use it to implement "Save succeeded" messages * after redirect. */ function set_flashdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($flashdata_key, $val); } } } /** * Keeps existing "flash" data available to next request. */ function keep_flashdata($key) { $old_flashdata_key = $this->flashdata_key.':old:'.$key; $value = $this->userdata($old_flashdata_key); $new_flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($new_flashdata_key, $value); } /** * Returns "flash" data for the given key. */ function flashdata($key) { $flashdata_key = $this->flashdata_key.':old:'.$key; return $this->userdata($flashdata_key); } /** * PRIVATE: Internal method - marks "flash" session attributes as 'old' */ function _flashdata_mark() { foreach ($_SESSION as $name => $value) { $parts = explode(':new:', $name); if (is_array($parts) && count($parts) == 2) { $new_name = $this->flashdata_key.':old:'.$parts[1]; $this->set_userdata($new_name, $value); $this->unset_userdata($name); } } } /** * PRIVATE: Internal method - removes "flash" session marked as 'old' */ function _flashdata_sweep() { foreach ($_SESSION as $name => $value) { $parts = explode(':old:', $name); if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flashdata_key) { $this->unset_userdata($name); } } } }
с<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); //> makes dw cs4 happy /** * Session class using native PHP session features and hardened against session fixation. * * @package CodeIgniter * @subpackage Libraries * @category Sessions * @author Dariusz Debowczyk, Matthew Toledo * @link http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/ */ class CI_Session { var $flashdata_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message) function CI_Session() { $this->object =& get_instance(); log_message('debug', "Native_session Class Initialized"); $this->_sess_run(); } /** * Regenerates session id */ function regenerate_id() { // copy old session data, including its id $old_session_id = session_id(); $old_session_data = $_SESSION; // regenerate session id and store it session_regenerate_id(); $new_session_id = session_id(); // switch to the old session and destroy its storage session_id($old_session_id); session_destroy(); // switch back to the new session id and send the cookie session_id($new_session_id); session_start(); // restore the old session data into the new session $_SESSION = $old_session_data; // update the session creation time $_SESSION['regenerated'] = time(); // session_write_close() patch based on this thread // http://www.codeigniter.com/forums/viewthread/1624/ // there is a question mark ?? as to side affects // end the current session and store session data. session_write_close(); } /** * Destroys the session and erases session storage */ function destroy() { unset($_SESSION); if ( isset( $_COOKIE[session_name()] ) ) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy(); } /** * Alias for destroy(), makes 1.7.2 happy. */ function sess_destroy() { $this->destroy(); } /** * Reads given session attribute value */ function userdata($item) { if($item == 'session_id'){ //added for backward-compatibility return session_id(); }else{ return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item]; } } /** * Sets session attributes to the given values */ function set_userdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $_SESSION[$key] = $val; } } } /** * Erases given session attributes */ function unset_userdata($newdata = array()) { if (is_string($newdata)) { $newdata = array($newdata => ''); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { unset($_SESSION[$key]); } } } /** * Starts up the session system for current request */ function _sess_run() { session_start(); $session_id_ttl = $this->object->config->item('sess_expiration'); if (is_numeric($session_id_ttl)) { if ($session_id_ttl > 0) { $this->session_id_ttl = $this->object->config->item('sess_expiration'); } else { $this->session_id_ttl = (60*60*24*365*2); } } // check if session id needs regeneration if ( $this->_session_id_expired() ) { // regenerate session id (session data stays the // same, but old session storage is destroyed) $this->regenerate_id(); } // delete old flashdata (from last request) $this->_flashdata_sweep(); // mark all new flashdata as old (data will be deleted before next request) $this->_flashdata_mark(); } /** * Checks if session has expired */ function _session_id_expired() { if ( !isset( $_SESSION['regenerated'] ) ) { $_SESSION['regenerated'] = time(); return false; } $expiry_time = time() - $this->session_id_ttl; if ( $_SESSION['regenerated'] <= $expiry_time ) { return true; } return false; } /** * Sets "flash" data which will be available only in next request (then it will * be deleted from session). You can use it to implement "Save succeeded" messages * after redirect. */ function set_flashdata($newdata = array(), $newval = '') { if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($flashdata_key, $val); } } } /** * Keeps existing "flash" data available to next request. */ function keep_flashdata($key) { $old_flashdata_key = $this->flashdata_key.':old:'.$key; $value = $this->userdata($old_flashdata_key); $new_flashdata_key = $this->flashdata_key.':new:'.$key; $this->set_userdata($new_flashdata_key, $value); } /** * Returns "flash" data for the given key. */ function flashdata($key) { $flashdata_key = $this->flashdata_key.':old:'.$key; return $this->userdata($flashdata_key); } /** * PRIVATE: Internal method - marks "flash" session attributes as 'old' */ function _flashdata_mark() { foreach ($_SESSION as $name => $value) { $parts = explode(':new:', $name); if (is_array($parts) && count($parts) == 2) { $new_name = $this->flashdata_key.':old:'.$parts[1]; $this->set_userdata($new_name, $value); $this->unset_userdata($name); } } } /** * PRIVATE: Internal method - removes "flash" session marked as 'old' */ function _flashdata_sweep() { foreach ($_SESSION as $name => $value) { $parts = explode(':old:', $name); if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flashdata_key) { $this->unset_userdata($name); } } } }
Возможно, вы не выполняете автоматическую загрузку библиотеки.
Попробуйте это в панели управления контроллера:
$this->load->library('session'); print_r($this->session->all_userdata());
PHP 7 Upgrade – * Известная ошибка SESSION / COOKIE
В этом ответе рассматривается известная ошибка session / cookie – при обновлении до PHP7 с PHP 5.
Если ваша версия CodeIgniter равна @ 3.1.0 или ниже – и вы обновляетесь до PHP 7.1 – вам нужно будет обновить CodeIgniter.
Существует ошибка с $this->session->set_userdata();
– Это может быть довольно раздражающим. Он перезапишет ваш сеанс сразу после перенаправления или посещения другой страницы в структуре вашего сайта.
Некоторые другие дискуссии об ошибке: https://github.com/bcit-ci/CodeIgniter/issues/4830
* Сэкономьте время и посмотрите сообщение, см. Сообщение «dyanakiev прокомментировал 23 октября 2016 года» –
«Просто чтобы подтвердить: все работает отлично с 3.1.1, больше проблем с сеансами». Хорошая работа! 💃 "
Инструкции по обновлению см. Здесь: https://www.codeigniter.com/use … / installation / upgradeing.html
Последний CodeIgniter Скачать здесь: https://codeigniter.com/download
* Я также могу подтвердить это:
Обновление codeigniter до 3.1.6 немедленно устранило проблему сеанса – это произошло после того, как я обновил сервер до PHP 7.1. *
Убедитесь, что ваше приложение имеет разрешения на создание файлов сеанса в / tmp (где хранятся сеансы файлов), если вы не используете базу данных для сеансов.
Скорее всего вам нужно взглянуть на php.ini на производственном сервере и проверить, что обработчик сеанса безопасности определен http://devzone.zend.com/413/trick-out-your-session-handler/. Это объясняет это довольно хорошо.
Я понимаю, что вы пытаетесь отладить свою проблему; но вы пытались удалить эхо / печать перед перенаправлением?
Я не эксперт «сеанса», но у меня были аналогичные проблемы, когда печать отладочной информации до перенаправления вызывала данные сеанса на следующей странице.
Кроме того, @edelweiss на деньги 🙂
Я видел подобный пост и был направлен сюда, чтобы попробовать использовать его session.php
И это работает для меня!
В моем случае после некоторых тестов (с https и http в localhost) ошибка возникает из-за этой проблемы и неправильно настроила $ config ['cookie_secure'], поэтому вы можете попробовать изменить ее в config.php:
$config['cookie_secure'] = FALSE; // if is not under https, or true if you use https
Ура!
Перед использованием $ _SESSION убедитесь, что session_start (). У меня была эта проблема, я по глупости предположил, что
$ This-> load-> библиотека ( 'сессии');
сделаю это для меня, но нет.
Я столкнулся с той же проблемой, и после долгого исследования я нашел решение.
Моя сессия хранится в db не в файлах, но даже база данных также ограничена для хранения размера, я думаю ..
Это не основная проблема, связанная с кодифицированием, или что-то, что автоматически уничтожается сеансом или что-то еще.
На самом деле это нагрузка количества данных в сеансе, если мы сохраняем больше и больше данных внутри сеанса с помощью Codeigniter («Я не уверен в собственном сеансе, но для codeigniter я могу подтвердить это»), он автоматически уничтожит сеанс.
Итак, что вам нужно сделать, чтобы перейти к тому коду, который вы пишете, чтобы получить данные из db или где-то еще, а затем сохранить в сеансе в userdata, попытайтесь уменьшить нагрузку на сохранение данных внутри сеанса и исключить те данные, которые не требуется на странице с сеанса каждый раз.
Дайте мне знать, если еще есть проблема.
Возможно, это будет поздно. Но я чувствовал, что должен его бросить. Имел такой же вопрос. Я использую codeigniter и wiredesignz hmvc, и я заметил, что ошибка была из htaccess. Попробуйте добавить обратную косую черту после переписывания базового url
Если кто-то застрял с помощью Homestead (как и я), это ошибка CodeIgniter и не присутствует в более новых версиях (я читаю), вы можете обновить версию CI или понизить версию PHP для каждого проекта с помощью Homestead 6+, как в примере:
//Homestead.yaml - map: myproject.test to: /home/vagrant/Code/myproject php: "5.6"
а затем простое homestead provision
.