PHP 的COOKIE
cookie是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie,因此setcookie()函数必须在其它信息被输出到浏览器前调用,这和对header()函数的限制类似。
1.1设置cookie:
可以用setcookie()或setrawcookie()函数来设置cookie。也可以通过向客户端直接发送http头来设置.
1.1.1使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie变量名
value: cookie变量的值
expire: 有效期结束的时间,
path: 有效目录,
domain:有效域名,顶级域唯一
secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
设置多个cookie变量: setcookie(‘var[a]’,‘value’);用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.
1.1.2.使用header()设置cookie;
header(“Set-Cookie: name=
v
a
l
u
e
[
;
p
a
t
h
=
value[;path=
value[;path=path[;domain=xxx.com[;…]]”);
后面的参数和上面列出setcookie函数的参数一样.
比如:
v
a
l
u
e
=
′
s
o
m
e
t
h
i
n
g
f
r
o
m
s
o
m
e
w
h
e
r
e
′
;
h
e
a
d
e
r
(
"
S
e
t
−
C
o
o
k
i
e
:
n
a
m
e
=
value='something from somewhere'; header("Set-Cookie:name=
value=′somethingfromsomewhere′;header("Set−Cookie:name=value");
1.2 Cookie的读取:
直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:
print $_COOKIE[‘TestCookie’];
COOKIE是不是被输出了?!
1.3 删除cookie
只需把有效时间设为小于当前时间,和把值设置为空.例如:
setcookie(“name”,"",time()-1);
用header()类似.
1.4常见问题解决:
- 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
- $_COOKIE受magic_quotes_gpc影响,可能自动转义
3)使用的时候,有必要测试用户是否支持cookie
1.5 cookie工作机理:
有些学习者比较冲动,没心思把原理研究,所以我把它放后面.
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie:TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
这一行实现了cookie功能,收到这行后
Set-Cookie:TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:
TestCookie=something from somewhere;
这一行就是我们用setcookie(‘TestCookie’,‘something from somewhere’,’/’);的结果.也就是用header(‘Set-Cookie: TestCookie=something from somewhere; path=/’);的结果