此代码有什么问题?
会话变量“user”具有记录的用户的id。它是在登录过程中设置的。
$this->session->set_userdata("user",$user->id);
此代码始终显示错误页面并执行会话销毁!!!为什么?
if ( !$this->session->userdata("user"))
{
$error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ;
log_message('error', $error);
show_error($error);
}
else
{
$this->session->sess_destroy();
}
如果我评论 $ this-> session-> sess_destroy()它可以正常运行,则会话不会被破坏并且不会显示错误
答案 0 :(得分:1)
您的函数说:“如果用户未登录,请显示错误消息并记录错误,否则请使用sess_destroy()将用户注销”
因此,如果您访问该页面但未登录,则会看到错误。如果您访问该页面,并且您已登录,则该函数会调用sess_destroy并将您注销。
澄清:您的代码仅允许1个用户状态:已注销 - 这是页面上任何输出的唯一方式。如果登录的某人访问该页面,则会立即注销。
if($this->session->userdata('email')){
//the user is logged in
echo "HELLO USER, YOU ARE LOGGED IN!";
}else{
//you don't need session_destroy because
//they won't get here with a session to be destroyed
redirect('/home');
}
进一步澄清:我在全新安装的Codeigniter上对此进行了测试,其行为与我解释的相同。
修改默认欢迎控制器以节省时间:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->library('session');
}
function index()
{
$this->session->set_userdata("user","1234");
echo "userdata set to: ".$this->session->userdata("user"). "<br>";
echo "<a href='welcome/checksess'>check session</a>";
}
function checksess()
{
if ( !$this->session->userdata("user"))
{
$error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ;
log_message('error', $error);
show_error($error);
}
else
{
echo "userdata: ".$this->session->userdata("user"). " about to be destroyed with sess_destroy<br>";
$this->session->sess_destroy();
echo "<a href='checksess'>check session again after sess_destroy (refresh this page)</a>";
}
}
}
/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */
当您访问welcome / index时,它会设置会话数据。当您单击checksess链接时,请检查echo的userdata然后调用sess_destroy。现在,如果刷新checksess,则不设置userdata(因为sess_destroy)并且您看到错误“User do logout without a logged ...”
您提供的代码中没有任何内容可以解释您遇到的行为。