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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
May 15 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python实现简单的计时器功能函数
2015/03/14 Python
在Python中使用列表生成式的教程
2015/04/27 Python
Python类的用法实例浅析
2015/05/27 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python datetime 如何处理时区信息
2020/09/02 Python
电大自我鉴定范文
2013/10/01 职场文书
生产车间主任的个人自我鉴定
2013/10/25 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
英语演讲稿范文
2014/01/03 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
2014年政教处工作总结
2014/12/20 职场文书
新兵入伍决心书
2015/09/22 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
Redis基本数据类型Set常用操作命令
2022/06/01 Redis