CodeIgniter 登录会话
Posted
技术标签:
【中文标题】CodeIgniter 登录会话【英文标题】:CodeIgniter login session 【发布时间】:2016-10-06 17:22:13 【问题描述】:我是 CodeIgniter 的新手,我试图在我的网站上创建一个登录系统。当我尝试进入页面概览时,它会在登录页面上发送给我,但在我输入正确的电子邮件和密码后,什么也没有发生。
Login.php - 控制器
<?php if ( ! defined('BASEPATH')) exit('No direct script access
allowed');
class Login extends CI_Controller
function __construct()
parent::__construct();
function index()
$this->load->helper(array('form'));
$this->load->view('login');
?>
Overview.php - 控制器
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Overview extends CI_Controller
function __construct()
parent::__construct();
function index()
if($this->session->userdata('logged_in'))
$session_data = $this->session->userdata('logged_in');
$data['username'] = $session_data['username'];
$this->load->view('overview', $data);
else
//If no session, redirect to login page
redirect('login', 'refresh');
function logout()
$this->session->unset_userdata('logged_in');
session_destroy();
redirect('home', 'refresh');
?>
VerifyLogin.php - 控制器
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class VerifyLogin extends CI_Controller
function __construct()
parent::__construct();
$this->load->model('user','',TRUE);
function index()
//This method will have the credentials validation
$this->load->library('form_validation');
$this->form_validation->set_rules('email', 'E-mail', 'trim|required|xss_clean');
$this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');
if($this->form_validation->run() == FALSE)
//Field validation failed. User redirected to login page
$this->load->view('login');
else
//Go to private area
redirect('home', 'refresh');
function check_database($password)
//Field validation succeeded. Validate against database
$username = $this->input->post('username');
//query the database
$result = $this->user->login($username, $password);
if($result)
$sess_array = array();
foreach($result as $row)
$sess_array = array(
'id' => $row->id,
'username' => $row->username
);
$this->session->set_userdata('logged_in', $sess_array);
return TRUE;
else
$this->form_validation->set_message('check_database', 'Invalid username or password');
return false;
?>
Login.php - 视图
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4 well">
<form role="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="loginform">
<fieldset>
<legend>Login</legend>
<div class="form-group">
<label for="name">Email</label>
<input type="text" name="email" placeholder="Your Email" required class="form-control" />
</div>
<div class="form-group">
<label for="name">Password</label>
<input type="password" name="password" placeholder="Your Password" required class="form-control" />
</div>
<div class="form-group">
<input type="submit" name="login" value="Login" class="btn btn-primary" />
</div>
</fieldset>
</form>
<span class="text-danger"><?php if (isset($errormsg)) echo $errormsg; ?></span>
</div>
</div>
谢谢,我希望有人能给我一个解决方案。
【问题讨论】:
因为表单中的操作链接不断发布到Login
控制器中的 index()
方法,该控制器仅显示登录表单。操作链接应发布到VerifyLogin
控制器。
你的控制器VerifyLogin.php应该只有第一个字母大写Verifylogin.php和class Verifylogin extends CI_Controller
@wolfgang1983 我改变了它,它做同样的事情..
@TheDrot 我真的不明白我需要改变什么......对不起,也许你可以告诉我。谢谢!
【参考方案1】:
当您进入登录页面时,由于$_SERVER['PHP_SELF']
,操作将是“Login.php”。
<form role="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="loginform">
$_SERVER["PHP_SELF"] 是一个超级全局变量,它返回当前执行脚本的文件名。
你需要把action改成VerifyLogin
,这样当你提交表单时,Verifylogin.php
中的index()
方法就会执行。
<form role="form" action="VerifyLogin" method="post" name="loginform">
xss_clean
不再是表单验证的一部分,因此请将其删除。 XSS 清理应该用于输出而不是输入。
$this->form_validation->set_rules('email', 'E-mail', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database');
【讨论】:
感谢@TheDrot,一切正常,但它在登录页面上将我重定向,没有错误,而不是在概述页面上。我认为重定向是个问题.. @funkyz0r 所以将redirect('home', 'refresh');
更改为redirect('overview', 'refresh');
,无论您需要重定向到概览页面。
我改变了它,什么都没有……它让我发疯
@funkyz0r logged_in
数组是否存在于会话中?
@funkyz0r 会话库是否正在自动加载?检查 application/config/autoload.php 文件并查看 $autoload['libraries']
数组。以上是关于CodeIgniter 登录会话的主要内容,如果未能解决你的问题,请参考以下文章
如何在登录系统中使用会话并在codeigniter中实现注销