php实现的Cookies操作类实例

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • php设置session值和cookies的学习示例

    第一步:先在本地写一个登陆页面和一个内容页面(登陆了才能进去)吧.代码大致如下: 下面是login.php,用于请求登陆的,通过post传递参数,如果登陆成功就会注册session. 复制代码 代码如下: <?phpsession_start(); if (isset($_POST['username'])) {    $username = $_POST['username'];    $password = $_POST['password']; if ($username == 'admi

  • php中用数组的方法设置cookies

    复制代码 代码如下: <?php         function set_cronology($name,$value,$duration=7){                 $duration=time()+(3600*24*$duration);                 $max_stored_values=5;                 if(isset($_COOKIE[$name])){                         foreach($_COOKI

  • php读取javascript设置的cookies的代码

    下面给代码: 复制代码 代码如下: <script language="JavaScript" type="text/javascript"> function setmycookie(name) //主要里面的参数 { $name = "thename"; $namev = test.num.value; var date = new Date(); $livetime = 5*24*3600*1000; date.setTime(

  • PHP CURL获取cookies模拟登录的方法

    要提取google搜索的部分数据,发现google对于软件抓取它的数据屏蔽的厉害,以前伪造下 USER-AGENT 就可以抓数据,但是现在却不行了.利用抓包数据发现,Google 判断了 cookies,当你没有cookies的时候,直接返回 302 跳转,而且是连续几十个302跳转,根本抓不了数据.因此,在发送搜索命令时,需要先提取 cookies 并保存,然后利用保存下来的这个cookies再次发送搜索命令即可正常抓数据了.这其实和论坛的模拟登录一个道理,先POST登录,获取cookies并

  • php利用cookies实现购物车的方法

    本文实例讲述了php利用cookies实现购物车的方法.分享给大家供大家参考.具体分析如下: php购物车是在电子商务网站会用到的,一种像超市购物车一样的,选好商品了,先放到自己的购物车里面等好了再到柜台结算,本款php购物车完全按照这个原理来实例的,感兴趣的朋友可以来看看,该实例利用了cookie来实现,代码如下: 复制代码 代码如下: <?php /**  * 购物车类 cookies 保存,保存周期为1天 注意:浏览器必须支持cookie才能够使用  */ class cartapi {

  • 解析php通过cookies获取远程网页的指定代码

    复制代码 代码如下: function Steal($url, $post_data = ""){//$header[] = "Accept: text/vnd.wap.wml,*.*";   $user_agent = "Mozilla/4.0";  $follow_loc = 1;  $cookie_file ="./tmp/cook.txt";  $ch = @curl_init();  @curl_setopt($ch

  • php cookies中删除的一般赋值方法

    php cookies中删除的一般赋值方法 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 php,您能够创建并取回 cookie 的值 语法 复制代码 代码如下: setcookie(name, value, expire, path, domain); ** * 设置cookie * n 名称 * c 值 * e 有效期 0 默认 一个月 1 关闭立即失效 */ function w_coo

  • 怎样使用php与jquery设置和读取cookies

    HTTP协议是一种无状态协议,这意味着你对网站的每一个请求都是独立的,而且因此无法通过它自身保存数据.但这种简单性也是它在互联网早期就广泛传播的原因之一. 不过,它仍然有一种方法能让你用cookies的形式来保存请求之间的信息.这种方法使你能够更有效率的进行会话管理和维持数据. 有两种处理cookies的方式-服务端(php,asp等)和客户端(javascript).在这个教程中,我们将学习到以php和javascript这两种方式如何去创建cookies. Cookies and php s

  • PHP用户指南-cookies部分

    PHP用户指南-cookies部分 在这课教程我们将学习怎样利用 PHP 处理cookies,我将试着使事情尽可能简单地去解释cookies的一些实际应用. 什么是cookies及作用?  cookies是由web服务器产生的并且存在客户端的一些信息.它嵌在html信息中,由服务器端指定,在客户端及服务器端间传递信息 .它通常用来:用户网页个性化,计数器,储存被浏览站点的信息等. cookies和php 在 PHP中用cookies是相当容易的.可以使用setcookie函数设置一个cookie

  • PHP中cookies使用指南

    综述  Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie是由Web服务器保存在用户浏览器上的小文件,它可以包含有关用户的信息(如身份识别号码.密码.用户在Web站点购物的方式或用户访问该站点的次数).无论何时用户链接到服务器,Web站点都可以访问Cookie信息.  怎样设置cookies?  在PHP中可以使用setcookie函数设置一个cookie.cookie是 HTTP标头的一部分, 因此设置cookie功能必须在任何内容送到浏览器之前.这种

随机推荐