专业编程基础技术教程

网站首页 > 基础教程 正文

PHP cookie技术

ccvgpt 2024-08-06 12:43:15 基础教程 14 ℃

Cookie(小甜饼)是客户端技术, 服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。

当用户使用浏览器再去访问服务器中的web资源时, 就会带着各自的数据去。

PHP cookie技术

cookie技术理解:

1 cookie是服务器给客户端的, 以Set-Cookie: name=shunping; expires=Wed, 21-Sep-2011 07:53:25 GMT回送客户端http响应,

当浏览器获取到该信息后, 就会将该cookie数据保存到客户端的cookie文件中, 文件名格式:用户名@网站URL

2 cookie保存的就是字符串(包括中文), 默认会对中文进行urlencode进行编码, 而解码采用urldecode进行解码,

3 cookie可以有多个键<==>值对, 可以给不同的键值, 指定不同的有效时间;

在一个文件内可以单独删除过期的cookie键值对, 而保留未过期的cookie键值对


window 7 操作系统存放位置

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies

因为系统默认是隐藏这些文件, 对此我们需要在文件选项中将隐藏选项去掉。

setcookie()函数使用

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false
[, bool $httponly = false ]]]]]] )

name 必要参数, 输入的cookie名字

value 可选参数, 输入的cookie的值, 保存在客户端

expire 可选参数, 是通过在php.ini文件中由session.cookie_lifetime选项设置的值, cookie的有效时间, 是个Unix时间戳,

默认值为0, cookie 将会在会话结束后(一般是浏览器关闭)失效, 单位秒

语法存在下面的特殊值:

0: 默认值;

time()-1: 删除COOKIE通用形式, setCookie('key', '', time()-1);

PHP_INT_MAX: 逻辑上表示永久有效。

path 可选参数。在服务器的有效路径, 也是通过php配置文件指定的值, 在php.ini中由session.cookie_path选项设置的值,

默认值为"/",表示在cookie中要设置的路径在整个域内都有效。

domain 可选参数。有效的域名, 如设置为'.xxxxxx.com', cookie能在此域名下的所有子域都有效;

注意:配置文件为空值(session.cookie_domain =)

当前目录下只能获取同级以及上级Cookie信息, 但是不能获取子目录下的Cookie信息。

secure 可选参数。指明是否仅通过安全的https连接中传送, 默认值false

httponly 可选参数。设置此参数为true, 则cookie不会受脚本语言(如Javascript)所影响, 默认值为false, 此参数是php 5.2.0新加入的

注意:setcookie()函数必须位于<html> 标签之前。

语法上的问题:

1 $_COOKIE仅仅支持获取COOKIE数据而不能设置COOKIE数据

$_COOKIE['key'] = 'value'; 是不可行的

2 $_COOKIE仅仅可以获取当前请求携带的COOKIE数据

导致下面的语法现象, 当前脚本周期设置的COOKIE, 不能使用$_COOKIE获取到值

setCookie('key','value');
var_dump($_COOKIE); //返回值:array(0){}

3 COOKIE数据仅仅支持字符串类型(实际上:int bool float等标量类型自动会转换成字符串)

<?php
$value = mt_rand(1, 9); //随机显示1-9的整数
setCookie('key', $value);
echo gettype($_COOKIE['key']); //显示结果:string
?>
setcookie("array",array("name"=>'hkz')); //不支持数组类型
Warning: setcookie() expects parameter 2 to be string

实例:

<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);
setcookie("TestCookie", $value, time()+3600, "/test", ".example.com", 1);
?>

.example.com .加上兼容性更多的浏览

<?php
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
上例将输出:
three : cookiethree
two : cookietwo
one : cookieone
<?php
setcookie("cookie['three']", "cookiethree");
setcookie("cookie['two']", "cookietwo");
setcookie("cookie['one']", "cookieone");
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
上例将输出:
three : cookiethree
two : cookietwo
one : cookieone
\'three\' : cookiethree
\'two\' : cookietwo
\'one\' : cookieone

因此setcookie("cookie[three]", "cookiethree")下three不适宜加引号;

数组形态的Cookie应用

<?php
setcookie("user[username]","skygo"); //设置为$_COOKIR["user"]["username"]
setcookie("user[password]",md5("12345")); //设置为$_COOKIE["user"]["password"]
setcookie("user[email]","zhangsan@163.net"); //设置为$_COOKIE["user"]["email"];
foreach($_COOKIE["user"] as $key => $value){
echo $key.":".$value."\n";
}
?>


删除Cookie三种方法

<?php
setcookie("Account");
setcookie("isLogin","",time()-1);
setcookie("test","",time()+1800) //0.5小时后失效
?>

删除Cookie和重定向

<?php
setCookie("test","",time()-3600); //删除Cookie
header("Location:http://localhost/dingxiang.php"); //重定向页面
exit();
?>

使用header()函数设置cookie;

header("Set-Cookie:name=$value[;expires=$expires[;path=$path[;domain=$domain[;...]]]");

后面的参数和上面列出setcookie()函数的参数一样.

比如: $value = 'something from somewhere';

header("Set-Cookie:name=$value");

实例:

<?php
//1、设置响应头信息
header('Content-type:text/html; charset=utf-8');
//2、设置响应头,设置cookie参数(username与password)
header('Set-Cookie:username=admin; expires='.gmdate('D, d-M-Y H:i:s',time()+3600).' GMT');
header('Set-Cookie:password=123456; expires='.gmdate('D, d-M-Y H:i:s',time()+3600).' GMT',false); //设置第二个参数,避免覆盖
echo $_COOKIE['username'];
echo $_COOKIE['password'];
?>

实际使用时

Cookie适合完成:

长时间保存, 敏感性相对较低(进行了安全处理的敏感数据)。

例如:存储登陆状态, 记录用户搜索习惯, 未登录时购物车。

使用中, 需要注意:

COOKIE, 可能受限于浏览器, 导致COOKIE的数据量受到限制。

cookie无法保存数组

序列化和反序列化在cookie中的应用

解决方法:把复合数据类型数组转换为字符串, 保存在cookie中, 使用序列化

重新把字符串转换成数组, 进行反序列化处理

<?php
header("Content-type: text/html; charset=utf-8");
$user_info = array("username"=>"老王", "sex"=>"男", "age"=>30);
$user = serialize($user_info);
setcookie('user', $user);
if(isset($_COOKIE['user'])){
echo $_COOKIE['user'];
}
$userinfo = $_COOKIE['user'];
$userinfo = unserialize($userinfo);
var_dump($userinfo);
?>

json在cookie中的应用

json_encode(数组): 把数组转换为json格式的字符串

json_decode(json格式的字符串,[true/false]): 把json格式的字符串转换为对象(默认值:false)或者数组(true)

<?php
header("Content-type: text/html; charset=utf-8");
$user_info = array("username"=>"老王", "sex"=>"男", "age"=>30);
$user = json_encode($user_info);
setcookie('user', $user);
if(isset($_COOKIE['user'])){
echo $_COOKIE['user'];
}
$userinfo = $_COOKIE['user'];
$userinfo = json_decode($userinfo);
var_dump($userinfo);
?>

Tags:

最近发表
标签列表