我正在我正在建设的网站上使用最新版本的Codeigniter和tank_auth 1.0.9。
当分别使用set_flashdata()和flashdata()时,重定向没有返回任何内容,但是如果我在配置中将sess_use_database设置为FALSE则可以正常工作。
我已经四处寻找并找不到答案 - 还有其他人遇到过这个问题并修好了吗?
答案 0 :(得分:2)
我遇到了同样的问题并找出了问题所在。如果您在数据库中存储会话,它将无法正常工作。
Tank Auth从主库($this->tank_auth->logout()
)运行此代码:
$this->delete_autologin();
// See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
$this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));
$this->ci->session->sess_destroy();
然后它从auth控制器($this->_show_message()
)运行此代码:
$this->session->set_flashdata('message', $message);
redirect('/auth/');
问题是,由于sess_destroy()
在设置flashdata之前运行,因此没有数据库行可以添加flashdata,因此flashdata永远不会被设置。
此时有一些解决方案:
选项1:
在$this->ci->session->sess_create();
中的$this->ci->session->sess_destroy();
logout()
之后立即添加application/libraries/Tank_auth.php
这是有效的,因为您正在创建一个可以存储flashdata的新空白会话。对此的潜在影响是您正在对数据库执行更多操作(删除+插入)。
选项2:
在$this->ci->session->sess_destroy();
logout()
中注释/删除application/libraries/Tank_auth.php
这是有效的,因为会话未被销毁,允许CI仅执行更新查询以添加flashdata。除非您绝对需要销毁会话,否则这可能比选项1更好。
选项3:
将$config['sess_use_database']
设为FALSE
。
这是因为会话在再次请求时自动创建,而不是在数据库中存储会话时的工作方式。可能不太安全。
最后,由您自行决定哪种方案最适合您的应用。
答案 1 :(得分:0)
如果tank_auth执行任何内部重定向,那么您可能会丢失该重定向请求中的Flash数据。
答案 2 :(得分:0)
完全。 CodeIgniter文档在这里指定: http://codeigniter.com/user_guide/libraries/sessions.html
=============================
Destroying a Session
To clear the current session:
$this->session->sess_destroy();
Note: This function should be the last one called,
and **even flash variables will no longer be available**.
If you only want some items destroyed and not all, use unset_userdata().
=============================
我已经深入研究了system / libraries / Session.php文件并保存了flashdata,触发了sess_write()
方法,该方法只会像你说的那样更新数据库。
答案 3 :(得分:0)
对我来说,更好的解决方法是在show_message()中设置flashdata之前检查以确保会话存在。
function _show_message($message)
{
// Patch for show_message() after logout(). Make sure the session exist before set_flashdata().
if(!$this->session->sess_read())
{
$this->session->sess_create();
}
$this->session->set_flashdata('message', $message);
redirect('/auth/');
}