php实现的Cookies操作类实例


Posted in PHP onSeptember 24, 2014

本文实例讲述了PHP实现的Cookies操作类及其用法,分享给大家供大家参考。具体分析如下:

一、功能:

1.保存,读取,更新,清除cookies数据。
2.可设置前缀。
3.强制超时控制。
4.cookies数据可以是字符串,数组,对象等。

二、用法:

Cookies.class.php类文件如下:

<?php 
/** Cookies class 保存,读取,更新,清除cookies数据。可设置前缀。强制超时。数据可以是字符串,数组,对象等。 
*  Date:  2013-12-22 
*  Author: fdipzone 
*  Ver:  1.0 
* 
*  Func: 
*  public  set    设置cookie 
*  public  get    读取cookie 
*  public  update   更新cookie 
*  public  clear   清除cookie 
*  public  setPrefix 设置前缀 
*  public  setExpire 设置过期时间 
*  private authcode  加密/解密 
*  private pack    将数据打包 
*  private unpack   将数据解包 
*  private getName  获取cookie name,增加prefix处理 
*/ 
 
class Cookies{ // class start 
 
  private $_prefix = '';                         // cookie prefix 
  private $_securekey = 'ekOt4_Ut0f3XE-fJcpBvRFrg506jpcuJeixezgPNyALm';  // encrypt key 
  private $_expire = 3600;                        // default expire 
 
  /** 初始化 
  * @param String $prefix   cookie prefix 
  * @param int  $expire   过期时间 
  * @param String $securekey cookie secure key 
  */ 
  public function __construct($prefix='', $expire=0, $securekey=''){ 
 
    if(is_string($prefix) && $prefix!=''){ 
      $this->_prefix = $prefix; 
    } 
 
    if(is_numeric($expire) && $expire>0){ 
      $this->_expire = $expire; 
    } 
 
    if(is_string($securekey) && $securekey!=''){ 
      $this->_securekey = $securekey; 
    } 
 
  } 
 
  /** 设置cookie 
  * @param String $name  cookie name 
  * @param mixed $value cookie value 可以是字符串,数组,对象等 
  * @param int  $expire 过期时间 
  */ 
  public function set($name, $value, $expire=0){ 
 
    $cookie_name = $this->getName($name); 
    $cookie_expire = time() + ($expire? $expire : $this->_expire); 
    $cookie_value = $this->pack($value, $cookie_expire); 
    $cookie_value = $this->authcode($cookie_value, 'ENCODE', $this->_securekey); 
 
    if($cookie_name && $cookie_value && $cookie_expire){ 
      setcookie($cookie_name, $cookie_value, $cookie_expire); 
    } 
 
  } 
 
  /** 读取cookie 
  * @param String $name  cookie name 
  * @return mixed     cookie value 
  */ 
  public function get($name){ 
 
    $cookie_name = $this->getName($name); 
 
    if(isset($_COOKIE[$cookie_name])){ 
 
      $cookie_value = $this->authcode($_COOKIE[$cookie_name], 'DECODE', $this->_securekey); 
      $cookie_value = $this->unpack($cookie_value); 
 
      return isset($cookie_value[0])? $cookie_value[0] : null; 
 
    }else{ 
      return null; 
    } 
 
  } 
 
  /** 更新cookie,只更新内容,如需要更新过期时间请使用set方法 
  * @param String $name  cookie name 
  * @param mixed $value cookie value 
  * @return boolean 
  */ 
  public function update($name, $value){ 
 
    $cookie_name = $this->getName($name); 
 
    if(isset($_COOKIE[$cookie_name])){ 
 
      $old_cookie_value = $this->authcode($_COOKIE[$cookie_name], 'DECODE', $this->_securekey); 
      $old_cookie_value = $this->unpack($old_cookie_value); 
 
      if(isset($old_cookie_value[1]) && $old_cookie_vlaue[1]>0){ // 获取之前的过期时间 
 
        $cookie_expire = $old_cookie_value[1]; 
 
        // 更新数据 
        $cookie_value = $this->pack($value, $cookie_expire); 
        $cookie_value = $this->authcode($cookie_value, 'ENCODE', $this->_securekey); 
 
        if($cookie_name && $cookie_value && $cookie_expire){ 
          setcookie($cookie_name, $cookie_value, $cookie_expire); 
          return true; 
        } 
      } 
    } 
    return false; 
  } 
 
  /** 清除cookie 
  * @param String $name  cookie name 
  */ 
  public function clear($name){ 
 
    $cookie_name = $this->getName($name); 
    setcookie($cookie_name); 
  } 
 
  /** 设置前缀 
  * @param String $prefix cookie prefix 
  */ 
  public function setPrefix($prefix){ 
 
    if(is_string($prefix) && $prefix!=''){ 
      $this->_prefix = $prefix; 
    } 
  } 
 
  /** 设置过期时间 
  * @param int $expire cookie expire 
  */ 
  public function setExpire($expire){ 
 
    if(is_numeric($expire) && $expire>0){ 
      $this->_expire = $expire; 
    } 
  } 
 
  /** 获取cookie name 
  * @param String $name 
  * @return String 
  */ 
  private function getName($name){ 
    return $this->_prefix? $this->_prefix.'_'.$name : $name; 
  } 
 
  /** pack 
  * @param Mixed $data   数据 
  * @param int  $expire  过期时间 用于判断 
  * @return 
  */ 
  private function pack($data, $expire){ 
 
    if($data===''){ 
      return ''; 
    } 
 
    $cookie_data = array(); 
    $cookie_data['value'] = $data; 
    $cookie_data['expire'] = $expire; 
    return json_encode($cookie_data); 
  } 
 
  /** unpack 
  * @param Mixed $data 数据 
  * @return       array(数据,过期时间) 
  */ 
  private function unpack($data){ 
 
    if($data===''){ 
      return array('', 0); 
    } 
 
    $cookie_data = json_decode($data, true); 
 
    if(isset($cookie_data['value']) && isset($cookie_data['expire'])){ 
 
      if(time()<$cookie_data['expire']){ // 未过期 
        return array($cookie_data['value'], $cookie_data['expire']); 
      } 
    } 
    return array('', 0); 
  } 
 
  /** 加密/解密数据 
  * @param String $str    原文或密文 
  * @param String $operation ENCODE or DECODE 
  * @return String      根据设置返回明文活密文 
  */ 
  private function authcode($string, $operation = 'DECODE'){ 
 
    $ckey_length = 4;  // 随机密钥长度 取值 0-32; 
 
    $key = $this->_securekey; 
 
    $key = md5($key); 
    $keya = md5(substr($key, 0, 16)); 
    $keyb = md5(substr($key, 16, 16)); 
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
 
    $cryptkey = $keya.md5($keya.$keyc); 
    $key_length = strlen($cryptkey); 
 
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', 0).substr(md5($string.$keyb), 0, 16).$string; 
    $string_length = strlen($string); 
 
    $result = ''; 
    $box = range(0, 255); 
 
    $rndkey = array(); 
    for($i = 0; $i <= 255; $i++) { 
      $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
    } 
 
    for($j = $i = 0; $i < 256; $i++) { 
      $j = ($j + $box[$i] + $rndkey[$i]) % 256; 
      $tmp = $box[$i]; 
      $box[$i] = $box[$j]; 
      $box[$j] = $tmp; 
    } 
 
    for($a = $j = $i = 0; $i < $string_length; $i++) { 
      $a = ($a + 1) % 256; 
      $j = ($j + $box[$a]) % 256; 
      $tmp = $box[$a]; 
      $box[$a] = $box[$j]; 
      $box[$j] = $tmp; 
      $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
    } 
 
    if($operation == 'DECODE') { 
      if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
        return substr($result, 26); 
      } else { 
        return ''; 
      } 
    } else { 
      return $keyc.str_replace('=', '', base64_encode($result)); 
    } 
  } 
} // class end 
 
?>

demo.php示例程序如下:

<?php 
require 'Cookies.class.php'; 
 
$type = isset($_GET['type'])? strtolower($_GET['type']) : ''; 
 
if(!in_array($type, array('set','get','update','clear'))){ 
  exit('type not exists'); 
} 
 
$obj = new Cookies('member', 10); // obj 
 
switch($type){ 
 
  case 'set': // 设置 
    $data = array( 
      'name' => 'fdipzone', 
      'gender' => 'male' 
    ); 
    $obj->set('me', $data, 5); 
    echo 'set cookies'; 
    break; 
 
  case 'get': // 读取 
    $result = $obj->get('me'); 
 
    echo '<pre>'; 
    print_r($result); 
    echo '</pre>'; 
 
    echo 'get cookies'; 
    break; 
 
  case 'update': // 更新 
    $data = array( 
      'name' => 'angelababy', 
      'gender' => 'female' 
    ); 
    $flag = $obj->update('me', $data); 
 
    if($flag){ 
      echo 'update cookies success'; 
    }else{ 
      echo 'update cookies false'; 
    } 
 
    break; 
 
  case 'clear': // 清除 
    $obj->clear('me'); 
    echo 'clear cookies'; 
    break; 
}
?>

本文完整实例源码点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP常用的三种设计模式
Feb 17 PHP
php微信开发之关注事件
Jun 14 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
YII框架页面缓存操作示例
Apr 29 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 #PHP
php过滤html标记属性类用法实例
Sep 23 #PHP
php广告加载类用法实例
Sep 23 #PHP
php实现根据url自动生成缩略图的方法
Sep 23 #PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 #PHP
PHP图片库imagemagick安装方法
Sep 23 #PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 #PHP
You might like
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php实现删除空目录的方法
2015/03/16 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
Python基础语言学习笔记总结(精华)
2017/11/14 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
详解Python中的测试工具
2019/06/09 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
python list多级排序知识点总结
2019/10/23 Python
python连接mongodb集群方法详解
2020/02/13 Python
Python sorted对list和dict排序
2020/06/09 Python
python的pip有什么用
2020/06/17 Python
Python 字符串池化的前提
2020/07/03 Python
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
爱护草坪标语
2014/06/24 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
员工安全生产责任书
2014/07/22 职场文书
努力工作保证书
2015/02/28 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
乔迁新居祝福语
2019/11/04 职场文书
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js