CI框架实现cookie登陆的方法详解


Posted in PHP onMay 18, 2016

本文实例讲述了CI框架实现cookie登陆的方法。分享给大家供大家参考,具体如下:

第一步:login.php

//登陆方法
 public function login(){
  //如果用户名和密码为空,则返回登陆页面
  if(empty($_POST['username']) || empty($_POST['password'])){
   $data['verifycode'] = rand(1000,9999);//生成一个四位数字的验证码
   //将验证码放入session中,注意:参数是数组的格式
   $this->session->set_userdata($data);
   //注意:CI框架默认模板引擎解析的模板文件中变量不需要$符号
   //$this->parser->parse("admin/login",$data);
   //smarty模板变量赋值
   $this->tp->assign("verifycode",$data['verifycode']);
   //ci框架在模板文件中使用原生态的PHP语法输出数据
   //$this->load->view('login',$data);//登陆页面,注意:参数2需要以数组的形式出现
   //显示smarty模板引擎设定的模板文件
   $this->tp->display("admin/login.php");
  }else{
   $username = isset($_POST['username'])&&!empty($_POST['username'])?trim($_POST['username']):'';//用户名
   $password = isset($_POST['password'])&&!empty($_POST['password'])?trim($_POST['password']):'';//密码
   $verifycode = isset($_POST['verifycode'])&&!empty($_POST['verifycode'])?trim($_POST['verifycode']):'';//验证码
   //做验证码的校验
   if($verifycode == $this->session->userdata('verifycode')){
    //根据用户名及密码获取用户信息,注意:参数2是加密的密码
    $user_info=$this->user_model->check_user_login($username,md5($password));
    if($user_info['user_id'] > 0){
     //将用户id、username、password放入cookie中
     //第一种设置cookie的方式:采用php原生态的方法设置的cookie的值
     //setcookie("user_id",$user_info['user_id'],86500);
     //setcookie("username",$user_info['username'],86500);
     //setcookie("password",$user_info['password'],86500);
     //echo $_COOKIE['username'];
     //第二种设置cookie的方式:通过CI框架的input类库
     $this->input->set_cookie("username",$user_info['username'],3600);
     $this->input->set_cookie("password",$user_info['password'],3600);
     $this->input->set_cookie("user_id",$user_info['user_id'],3600);
     //echo $this->input->cookie("password");//适用于控制器
     //echo $this->input->cookie("username");//适用于控制器
     //echo $_COOKIE['username'];//在模型类中可以通过这种方式获取cookie值
     //echo $_COOKIE['password'];//在模型类中可以通过这种方式获取cookie值
     //第三种设置cookie的方式:通过CI框架的cookie_helper.php函数库文件
     //这种方式不是很灵验,建议大家采取第二种方式即可
     //set_cookie("username",$user_info['username'],3600);
     //echo get_cookie("username");
     //session登陆时使用:将用户名和用户id存入session中
     //$data['username']=$user_info['username'];
     //$data['user_id']=$user_info['user_id'];
     //$this->session->set_userdata($data);
     //跳转到指定页面
     //注意:site_url()与base_url()的区别,前者带index.php,后者不带index.php
     header("location:".site_url("index/index"));
    }
   }else{
    //跳转到登陆页面
    header("location:".site_url("common/login"));
   }
  }
 }
}

第二步:User_model.php

//cookie登陆:检测用户是否登陆,如果cookie值失效,则返回false,如果cookie值未失效,则根据cookie中的用户名和密码从数据库中获取用户信息,如果能获取到用户信息,则返回查询到的用户信息,如果没有查询到用户信息,则返回0
 public function is_login(){
  //获取cookie中的值
  if(empty($_COOKIE['username']) || empty($_COOKIE['password'])){
   $user_info = false;
  }else{
   $user_info=$this->check_user_login($_COOKIE['username'],$_COOKIE['password']);
  }
  return $user_info;
 }
 //根据用户名及加密密码从数据库中获取用户信息,如果能获取到,则返回获取到的用户信息,否则返回false,注意:密码为加密密码
 public function check_user_login($username,$password){
  //这里大家要注意:$password为md5加密后的密码
  //$this->db->query("select * from ");
  //快捷查询类的使用:能为我们提供快速获取数据的方法
  //此数组为查询条件
  //注意:关联数组
  $arr=array(
   'username'=>$username,//用户名
   'password'=>$password,//加密密码
   'status'=>1   //账户为开启状态
  );
  //在database.php文件中已经设置了数据表的前缀,所以此时数据表无需带前缀
  $query = $this->db->get_where("users",$arr);
  //返回二维数组
  //$data=$query->result_array();
  //返回一维数组
  $user_info=$query->row_array();
  if(!empty($user_info)){
   return $user_info;
  }else{
   return false;
  }
}

第三步:其它控制器:

public function __construct(){
  //调用父类的构造函数
  parent::__construct();
  $this->load->library('tp'); //smarty模板解析类
  $this->load->helper('url'); //url函数库文件
  $this->load->model("user_model");//User_model模型类实例化对象
  $this->cur_user=$this->user_model->is_login();
  if($this->cur_user === false){
   header("location:".site_url("common/login"));
  }else{
   //如果已经登陆,则重新设置cookie的有效期
   $this->input->set_cookie("username",$this->cur_user['username'],3600);
   $this->input->set_cookie("password",$this->cur_user['password'],3600);
   $this->input->set_cookie("user_id",$this->cur_user['user_id'],3600);
  }
  $this->load->library('pagination');//分页类库
  $this->load->model("role_model");//member_model模型类
  $this->load->model("operation_model");//引用operation_model模型
  $this->load->model("object_model");//引用object_model模型
  $this->load->model("permission_model");//引用permission_model模型
}

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
php 错误处理经验分享
Oct 11 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
PHP面试题之文件目录操作
Oct 15 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP那些琐碎的知识点(整理)
May 20 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
浅析php静态方法与非静态方法的用法区别
May 17 #PHP
php关闭warning问题的解决方法
May 17 #PHP
XHProf报告字段含义的解析
May 17 #PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
May 17 #PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 #PHP
简单理解PHP的面向对象编程方式
May 17 #PHP
WordPress中的shortcode短代码功能使用详解
May 17 #PHP
You might like
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP反射基础知识回顾
2020/09/10 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
django从后台返回html代码的实例
2020/03/11 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
Linux常见面试题
2013/03/18 面试题
自我评价是什么
2014/01/04 职场文书
爱护公物演讲稿
2014/09/09 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android