首先我们要在autoload.php中自动加载session,当然也可以在控制器中直接
调用,我们这里举一个例子,我们现在数据库中插入几条随机的数据,然后我们前台登陆数据库模版:
简单来讲:
- 前端文件
- 数据库模版
- 控制器
1、首先写一个前端的登陆文件:
前端文件:
<form method="post" action="<?php echo site_url('admin/privileges/signin');?>" >
<tr>
<td>姓名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<input type="submit" value="登陆" class="button" />
</tr>
</form>
分析: form的action为控制器的地址,那接下来我们先写数据库模版吧。
数据库模版呢,我们直接调用用户表就可以了
2、模版文件
<?php
class User_model extends CI_Model
{
public function _user($username,$password)
{
$query = $this->db
->where('admin_name',$username)
->where('password',md5($password))
->get('ci_admin');
if ($query->num_rows > 0)
{
return $query->row();
}
return false;
}
}
首先我们使用
来查询数据库
$query = $this->db
->where('admin_name',$username) //查询的条件1
->where('password',md5($password)) //查询的条件2
->get('ci_admin'); //要查询的数据表
//其实上面的写法就类似于
// select * from ci_admin where admin_name = $username AND password = $password;
继续往下看,有一个if判断,那么这个判断是什么意思呢?
if ($query->num_rows > 0) // 这里的 num_rows()是返回结果集中行的数目
{
return $query->row();
}
return false;
num_rows()是返回结果集中行的数目,也就是说,上面的查询语句,返回的查询结果行数是不是大于0,如果大于0的话,那么就是正确的,如果小于0或者等于0,那么就是错误的。
一般使用num_rows会返回一个查询后的结果,就是查询的结果是几行。
接下来写控制器文件:
3、控制器文件:
public function __construct()
{
parent::__construct();
$this->load->model('user_model');
$this->load->helper('captcha', 'form');
$this->load->library('form_validation');
}
public function signin()
{
$this->form_validation->set_rules('username', '用户名', 'required');
$this->form_validation->set_rules('password', '密码', 'required');
if ($this->form_validation->run() == FALSE)
{
$data['url'] = site_url('admin/privileges/login');
$data['message'] = validation_errors();
$data['wait'] = 3;
$this->load->view('message.html', $data);
}
else
{
$res = $this->user_model->_user(
$this->input->post('username'),
$this->input->post('password')
);
if ($res !== false)
{
$session_user = array(
'username' => $this->input->post('username'),
);
$this->session->set_userdata('username',$session_user);
redirect('admin/main');
}
else
{
$data['url'] = site_url('admin/privileges/login');
$data['message'] = "账户或密码填写错误,请返回重新填写";
$data['wait'] = 3;
$this->load->view('message.html', $data);
}
}
}
详细解释:
首先我们使用form_validation函数来获取用户输入的信息,那么直接判断输入是否正确,输入错误则返回登陆页面,如果输入正确,则往下继续走:
$res = $this->user_model->_user(
$this->input->post('username'),
$this->input->post('password')
);
这里呢,直接调用数据库模型文件,user_model.php中的_user方法,因为我们定义数据库模型方法的时候,在方法后面加了两个参数进入,所以我们这里也要写两个参数进去:
public function _user($username,$password)
接着下面看,是有个判断的,这个判断呢:就是判断,我们传给数据库模型的两个参数是否是正确的,如果是正确的,那么,我们就把用户名写进session中,跳转到后台主页,如果不对,则返回登陆页面
if ($res !== false)
{
$session_user = array(
'username' => $this->input->post('username'),
);
$this->session->set_userdata('username',$session_user);
redirect('admin/main');
}
这里的session是将用户输入的username保存到在session中的username中,也就是说,这里保存在session中的username是可以被所有地方调用的,如果直接保存$session_user是无法被其他方法调用的。
上述是保存session的写法:
这样写也就是把$session_user的值赋给了'username'
$this->session->set_userdata('username',$session_user);
在其他方法调用的话:
$this->session->userdata('username');
那如果有页面需要登陆后才可以访问的话,可以在这个控制器的上方写一个构造函数来判断是否有session如果没有,那么自动跳转到登录页面:
public function __construct()
{
parent::__construct();
if(! $this->session->userdata('username'))
{
redirect('admin/privileges/login');
}
}
这里的 'username'
if(! $this->session->userdata('username'))
其实就是我们在之前登陆的时候保存在session的值,他是可以在任何地方调用的。
那么有了登陆我们是不是也要有退出呢,我们直接写一个方法,前端调用就好了:
public function logout()
{
$this->session->unset_userdata('username');
/* $this->session->sess_destroy(); */
$data['url'] = site_url('admin/privileges/login');
$data['message'] = '退出成功,正在返回登陆页面...';
$data['wait'] = 3;
$this->load->view('message.html', $data);
}
unset_userdata是删除当前的session,sess_destory是删除所有的session。我们直接删除当前登陆的username,这样就可以了。
前端写一个接口直接连接到控制器即可,不在乎怎么写,只要是地址能连接到控制器的退出方法即可。
<a href="<?php echo base_url('admin/privileges/logout') ?>" target="_top" class="fix-submenu">退出</a>