php 重定向后 Codeigniter 会话数据丢失
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14472869/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Codeigniter session data lost after redirect
提问by edelweiss
I am using codeigniter 2.1.0.
我正在使用 codeigniter 2.1.0。
I am trying to do a register/login function using the session library in the codeigniter.
我正在尝试使用 codeigniter 中的会话库执行注册/登录功能。
The register/login with the session library worked fine for localhost, but when I put it live and tried it, the session does not work.
使用会话库注册/登录对于 localhost 工作正常,但是当我将其上线并尝试时,会话不起作用。
My controller login works this way. I check the credentials, once ok I set my session data and redirect to another page.
我的控制器登录就是这样工作的。我检查凭据,一旦确定,我设置会话数据并重定向到另一个页面。
$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'));
at this point here when I print all my session data, they do print out. But at the dashboard controller side, when i attempt to print the session data out, they were not there anymore.
此时,当我打印所有会话数据时,它们确实打印出来了。但是在仪表板控制器端,当我尝试打印会话数据时,它们不再存在。
Any idea why? Thanks in advance for the help.
知道为什么吗?在此先感谢您的帮助。
回答by user2818832
if you are working in CI 3.x and just upgraded your server php version to php 7.x
如果您在 CI 3.x 中工作并且刚刚将您的服务器 php 版本升级到 php 7.x
Go to system/libraries/Session/session.php at Line no 281 and replace ini_set('session.name', $params['cookie_name']);by ini_set('session.id', $params['cookie_name']);
转到第 281 行的 system/libraries/Session/session.php 并替换ini_set('session.name', $params['cookie_name']);为ini_set('session.id', $params['cookie_name']);
回答by Apit John Ismail
I'm not sure what exactly is the problem. Recently I faced this too..
我不确定到底是什么问题。最近我也遇到了这个..
It was working before in my development running php7.0.
它之前在我运行 php7.0 的开发中工作过。
Currently it is only working in my production server running nginx and php 5.6. My development server seems to be not working and keeps on regenerate new row in sessions table. My development server is using php7.1, on homestead virtualbox development environment, usually being used for Laravel projects.
目前它仅在我的运行 nginx 和 php 5.6 的生产服务器中工作。我的开发服务器似乎无法正常工作,并不断在会话表中重新生成新行。我的开发服务器使用的是 php7.1,在 homestead virtualbox 开发环境中,通常用于 Laravel 项目。
I managed to get over this by taking this step.
通过采取这一步,我设法克服了这一点。
1) Go to system/libraries/Session/Session.php
1) 转到 system/libraries/Session/Session.php
2) Comment session_start() by adding //. We want to relocate the sessionn_start().
2) 通过添加 // 注释 session_start()。我们要重新定位 sessionn_start()。
3) Go down to line 315 where it says Security is king, and comment out until line 351
3) 转到第 315 行,那里说安全为王,然后注释掉,直到第 351 行
4) Then go to your main index.php ( the root index.php )
4)然后转到您的主要 index.php (根 index.php )
5) Add session_start() at the top once.
5) 在顶部添加 session_start() 一次。
6) Okay try again. Hopefully it works. My guess is that it is not working with php 7.1 and some update need to be done in this Session.php file.
6) 好的,再试一次。希望它有效。我的猜测是它不适用于 php 7.1,需要在这个 Session.php 文件中进行一些更新。
- My CI Version is 3.1.1
- 我的 CI 版本是 3.1.1
回答by vijay
Go to
去
system/libraries/Session/session.php
系统/库/会话/session.php
at Line no 281 and replace
在第 281 行并替换
ini_set('session.name', $params['cookie_name']);
by
经过
ini_set('session.id', $params['cookie_name']);
回答by TV-C-15
PHP 7 Upgrade - * Known SESSION / COOKIE Bug
PHP 7 升级 - * 已知会话 / COOKIE 错误
This answer addresses the known session/cookie bug - when you upgrade to PHP7 from PHP 5.
此答案解决了已知的会话/cookie 错误 - 当您从 PHP 5 升级到 PHP7 时。
If your CodeIgniter version is @ 3.1.0 or below - and you are upgrading to PHP 7.1 - You will need to update CodeIgniter.
如果您的 CodeIgniter 版本是 @ 3.1.0 或更低 - 并且您要升级到 PHP 7.1 - 您将需要更新 CodeIgniter。
There is a bug with $this->session->set_userdata();- that can be pretty annoying. It will overwrite your session as soon as you redirect or visit another page within your site structure.
有一个错误$this->session->set_userdata();- 这可能很烦人。一旦您重定向或访问站点结构中的另一个页面,它就会覆盖您的会话。
Some other discussions about the bug: https://github.com/bcit-ci/CodeIgniter/issues/4830
关于该错误的其他一些讨论:https: //github.com/bcit-ci/CodeIgniter/issues/4830
*Save some time and see post by See post "dyanakiev commented on Oct 23, 2016"-
*节省一些时间并查看帖子“dyanakiev 于 2016 年 10 月 23 日发表评论”-
"Just to confirm: Everything works perfect with 3.1.1, no more problems with sessions. Good job! "
“只是为了确认:在 3.1.1 中一切正常,会话不再出现问题。干得好!”
See upgrade instructions here: https://www.codeigniter.com/use…/installation/upgrading.html
请参阅此处的升级说明:https: //www.codeigniter.com/use.../installation/upgrading.html
Latest CodeIgniter Download here: https://codeigniter.com/download
最新的 CodeIgniter 在此处下载:https: //codeigniter.com/download
*I can also confirm this as well:
*我也可以确认这一点:
Updating codeigniter to 3.1.6 fixed the session problem immediately - that had occurred after I updated server to PHP 7.1.*
将 codeigniter 更新到 3.1.6 立即修复了会话问题 - 这是在我将服务器更新到 PHP 7.1 之后发生的。*
回答by Binod Kalathil
This is an addition to "edelweiss" answer but I feel like it require more attention and hence posting as answer.
这是“雪绒花”答案的补充,但我觉得它需要更多关注,因此发布为答案。
CI 2.1 is infamous to have session related problems. It is better we replace the built-in Sessions.php file with the one below.
CI 2.1 因存在与会话相关的问题而臭名昭著。我们最好用下面的文件替换内置的 Sessions.php 文件。
The link given by "edelweiss" is broken. The Session.php file he mentions is:
“雪绒花”给出的链接已损坏。他提到的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);
}
}
}
}
回答by Binod Kalathil
Maybe you not automatic load library session.
也许你没有自动加载库会话。
Have you try this in controller dashboard:
您是否在控制器仪表板中尝试过此操作:
$this->load->library('session');
print_r($this->session->all_userdata());
回答by Warren.S
I realize you're trying to debug your issue; but have you tried removing the echo/print before redirecting?
我意识到您正在尝试调试您的问题;但是您是否尝试在重定向之前删除回声/打印?
I'm no 'session' expert, but I've had similar issues where printing out debug information before redirecting would cause session data the die on the next page.
我不是“会话”专家,但我遇到过类似的问题,在重定向之前打印调试信息会导致会话数据在下一页上消失。
Also, @edelweiss is on the money :)
另外,@edelweiss 很有钱:)
回答by elverde
In My case, after some tests (with https and http in localhost) the error comes for that issue and not having properly set the $config['cookie_secure'], so you can try changing in config.php:
在我的情况下,经过一些测试(在本地主机中使用 https 和 http)后,该问题出现了错误,并且没有正确设置 $config['cookie_secure'],因此您可以尝试在 config.php 中进行更改:
$config['cookie_secure'] = FALSE; // if is not under https, or true if you use https
Cheers!
干杯!
回答by Chris
Make sure your app has permissions to create the session files to /tmp (where file sessions are stored) if your not using a database for the sessions.
如果您不为会话使用数据库,请确保您的应用程序有权将会话文件创建到 /tmp(存储文件会话的位置)。
More than likely you need to look at php.ini on the production server and verify the session save handler is defined http://devzone.zend.com/413/trick-out-your-session-handler/explains this rather well.
您很可能需要查看生产服务器上的 php.ini 并验证会话保存处理程序是否已定义http://devzone.zend.com/413/trick-out-your-session-handler/很好地解释了这一点。
回答by edelweiss
I saw a similar post and was directed to here to try using his sessions.php
我看到了一个类似的帖子,并被引导到这里尝试使用他的 session.php
And it works for me!
它对我有用!


