首页 > 后端开发 > php教程 > php实现的Cookies操作类实例_php技巧

php实现的Cookies操作类实例_php技巧

WBOY
发布: 2016-05-16 20:35:46
原创
1251 人浏览过

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

一、功能:

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

二、用法:

Cookies.class.php类文件如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

<&#63;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&#63; $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])&#63; $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&#63; $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 &#63; ($operation == 'DECODE' &#63; substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

  

    $cryptkey = $keya.md5($keya.$keyc);

    $key_length = strlen($cryptkey);

  

    $string = $operation == 'DECODE' &#63; 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

  

&#63;>

登录后复制

demo.php示例程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<&#63;php

require 'Cookies.class.php';

  

$type = isset($_GET['type'])&#63; 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 class="brush:php;toolbar:false">';

    print_r($result);

    echo '

登录后复制
'; 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.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板