0
点赞
收藏
分享

微信扫一扫

php CI 登陆session 详解

  首先我们要在autoload.php中自动加载session,当然也可以在控制器中直接$this->load调用,我们这里举一个例子,我们现在数据库中插入几条随机的数据,然后我们前台登陆

数据库模版:

php CI 登陆session 详解_CI

简单来讲:

  1. 前端文件
  2. 数据库模版
  3. 控制器

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;
  }
}

首先我们使用$this->db->where()来查询数据库

$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>






举报

相关推荐

0 条评论