确定cookie可以自定义前缀?

浏览:2210 发布日期:2015/03/26 分类:技术分享 关键字: cookie问题
文档

Cookie设置
cookie('name','value'); //设置cookiecookie('name','value',3600); // 指定cookie保存时间还可以支持参数传入的方式完成复杂的cookie赋值,下面是对cookie的值设置3600秒有效期,并且加上cookie前缀think_

cookie('name','value',array('expire'=>3600,'prefix'=>'think_'))数组参数可以采用query形式参数

cookie('name','value','expire=3600&prefix=think_')和上面的用法等效。

后面的参数支持prefix,expire,path,domain和httponly(**3.2.2版本新增**)五个索引参数,如果没有传入或者传入空值的话,会默认取COOKIE_PREFIX、COOKIE_EXPIRE、COOKIE_PATH、COOKIE_DOMAIN和COOKIE_HTTPONLY五个配置参数。如果只传入个别参数,那么也会和默认的配置参数合并。

支持给cookie设置数组值(采用JSON编码格式保存),例如:

cookie('name',array('value1','value2'));


Cookie获取
获取cookie很简单,无论是怎么设置的cookie,只需要使用:

$value = cookie('name');如果没有设置cookie前缀的话 相当于

$value = $_COOKIE['name'];如果设置了cookie前缀的话,相当于

$value = $_COOKIE['前缀+name'];如果要获取所有的cookie,可以使用:

$value = cookie();该用法相当于

$value = $_COOKIE;



代码
function cookie($name='', $value='', $option=null) {
// 默认设置
$config = array(
'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀
'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间
'path' => C('COOKIE_PATH'), // cookie 保存路径
'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名
'secure' => C('COOKIE_SECURE'), // cookie 启用安全传输
'httponly' => C('COOKIE_HTTPONLY'), // httponly设置
);
// 参数设置(会覆盖黙认设置)
if (!is_null($option)) {
if (is_numeric($option))
$option = array('expire' => $option);
elseif (is_string($option))
parse_str($option, $option);
$config = array_merge($config, array_change_key_case($option));
}
if(!empty($config['httponly'])){
ini_set("session.cookie_httponly", 1);
}
// 清除指定前缀的所有cookie
if (is_null($name)) {
if (empty($_COOKIE))
return null;
// 要删除的cookie前缀,不指定则删除config设置的指定前缀
$prefix = empty($value) ? $config['prefix'] : $value;
if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
foreach ($_COOKIE as $key => $val) {
if (0 === stripos($key, $prefix)) {
setcookie($key, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']);
unset($_COOKIE[$key]);
}
}
}
return null;
}elseif('' === $name){
// 获取全部的cookie
return $_COOKIE;
}
$name = $config['prefix'] . str_replace('.', '_', $name);
if ('' === $value) {
if(isset($_COOKIE[$name])){
$value = $_COOKIE[$name];
if(0===strpos($value,'think:')){
$value = substr($value,6);
return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));
}else{
return $value;
}
}else{
return null;
}
} else {
if (is_null($value)) {
setcookie($name, '', time() - 3600, $config['path'], $config['domain'],$config['secure'],$config['httponly']);
unset($_COOKIE[$name]); // 删除指定cookie
} else {
// 设置cookie
if(is_array($value)){
$value = 'think:'.json_encode(array_map('urlencode',$value));
}
$expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
setcookie($name, $value, $expire, $config['path'], $config['domain'],$config['secure'],$config['httponly']);
$_COOKIE[$name] = $value;
}
}
return null;
}

问题分析,简直坑
根本不支持自定义前缀的值,比如如下设置cookie:
cookie('name','value',array('expire'=>3600,'prefix'=>'think_'));

前缀取值的时候是根据配置来取的,如果没设置C('COOKIE_PREFIX')跟这里的调用的参数'think_'一致,根本取不到cookie:
$name = $config['prefix'] . str_replace('.', '_', $name);


最佳答案
评论( 相关
后面还有条评论,点击查看>>