会话空代码点火器
Posted
技术标签:
【中文标题】会话空代码点火器【英文标题】:Session empty codeigniter 【发布时间】:2012-11-01 16:41:52 【问题描述】:首先,对不起我的英语:D
我尝试在 Codeigniter 上进行简单的登录,但没有成功。我阅读了官方文档并将脚本减少到最低限度。每次我重定向或刷新页面或转到另一个控制器时,我的会话都是空的。如果我只创建一个控制器并进行简单的读取和写入,它会运行良好,直到我刷新或重定向。
这就是我想做的: 1) 第一个控制器是主控制器。使用登录表单加载视图。此表单对方法 validation_form 和 username_check 回调有一个操作。
2)如果用户能够登录,我设置我的用户数据并重定向到受限控制器,这是我的受限区域。
附:我在自动加载中使用库会话,并激活选项数据库。我也有自动加载的数据库库。
主控制器
class Main extends CI_Controller
public function __construct()
parent::__construct();
public function index()
$this->load->view('login_view');
public function validation_form()
$this->load->library('form_validation');
$this->form_validation->set_rules('email', 'Email', 'required|callback_username_check');
if ($this->form_validation->run() == FALSE)
echo 'validation_error';
else
redirect('/restricted');
public function username_check()
$this->load->model('login_model');
$email=$this->input->post('email');
$login=$this->login_model->validate($email);
if ($login != FALSE)
return true;
return false;
登录模式
class Login_model extends CI_Model
public function __construct()
parent::__construct();
public function validate($email)
// Prep the query
$this->db->where('EmailDatore', $email);
// Run the query
$query = $this->db->get('Datore');
// Let's check if there are any results
if($query->num_rows() == 1)
// If there is a user, then create session data
$row = $query->row();
$data = array(
'email' => $row->EmailDatore,
'nome' => $row->Nome,
'cognome' => $row->Cognome,
'validated' => true
);
$this->session->set_userdata($data);
return true;
// If the previous process did not validate
// then return false.
return false;
受限控制器 类受限扩展 CI_Controller
public function __construct()
parent::__construct();
$this->check_isvalidated();
public function index()
// If the user is validated, then this function will run
echo 'Congratulations, you are logged in.';
private function check_isvalidated()
if(! $this->session->userdata('validated'))
redirect('main');
【问题讨论】:
你在哪里调用你的控制器函数 username_check? $this->form_validation->set_rules('email', 'Email', 'required|callback_username_check'); 我刚刚从主控制器的构造中删除了 session_start()。这是一个测试:D 【参考方案1】:我觉得回调函数也可以这样。
public function username_check($str)
$this->load->model('login_model');
$login=$this->login_model->validate($str);
if ($login != FALSE)
return true;
return false;
您的代码是到达模型还是回调失败?它没有到达代码的哪些部分?放置 vardump();或者死();检查。
【讨论】:
这部分一切顺利。模型已加载并且 validate() 返回 true。这个“if ($this->form_validation->run() == FALSE)”为真,我已被重定向到禁区,这很好。但是在受限制的控制器中,会话是空的,所以 $this->check_isvalidated();将我重定向到登录【参考方案2】:模型中的错字,不确定是否还有其他错误,但至少有这个,这意味着你永远不会完成你的成功代码。
if($query->num_rows() == 1)
编辑 - 这里也有错误,你传递了 $data 但填充了 $email。因此模型得到一个空字符串。
public function username_check()
$this->load->model('login_model');
$email=$this->input->post('email');
$login=$this->login_model->validate($email);
if ($login != FALSE)
return true;
return false;
【讨论】:
我也更正了:-$login=$this->login_model->validate($data);在 $login=$this->login_model->validate($email); -添加 ;在线 $this->load->view('login_view') 您没有显示的是发送登录数据的视图。目前看起来您几乎完全跳过了验证,因为您的表单验证直接进入受限页面。从视图到登录到进入受限页面的事件顺序是什么? 我尝试对表单验证进行调试,一切顺利。如果我在我设置一切顺利的同一部分制作我的 all_userdata 的 print_r。但是当我重定向到禁区时,会话中没有任何内容 参见上面的编辑,您向模型发送空字符串时出现另一个错误。以上是关于会话空代码点火器的主要内容,如果未能解决你的问题,请参考以下文章