PHP Cookie
PHP Cookie
cookie 常用于识别用户。
Cookie 是什么?
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态
如何创建 Cookie?
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法
setcookie(name, value, expire, path, domain);
实例 1
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "runoob"。我们也规定了此 cookie 在一小时后过期:
<?php setcookie("user", "runoob", time()+3600); ?> <html> .....
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
实例 2
您还可以通过另一种方式设置 cookie 的过期时间。这也许比使用秒表示的方式简单。
<?php $expire=time()+60*60*24*30; setcookie("user", "runoob", $expire); ?> <html> .....
在上面的实例中,过期时间被设置为一个月(60 秒 * 60 分 * 24 小时 * 30 天)。
Cookie的配置与应用
Setcookie(string name, string value, int expire,string path, string domain, intsecure); 其中name是cookie变量名称标识,你在php中将能象使用普通变量名相同来用他引用
cookie变量。value是cookie变量的初始值,expire 表示该cookie变量的有效时间;path 为该cookie变量的相关路径;domain 表示cookie变量的网站;secure 则需在 https的安全传输时才有效。
SetCookie("Cookie", "cookievalue",time()+3600, "/forum", ".365shequ.com", 1);
名称,必须 值,必须 毫秒time()+3600=1小时 保存路径 保存的域 HTTPS
PHP读取Cookie
使用超全局变量$_COOKIE数组可以读取到当前客户端中保存的Cookie新建PHP文件set_cookie.php
代码为
print_r($_COOKIE);
echo $_COOKIE['foo'];
检查Cookie是否已经设置成功
为Cookie设置过期时间
第三个参数为unix的时间戳
0 默认值,关闭浏览器即失效
time() + 86400 一天
setcookie('foo', 'a', time() + 86400);
设置后请关闭浏览器,再次打开浏览器并访问,检查Cookie是否存在
为Cookie设置路径
setcookie('bar', 'b', time() + 86400, '/uploads');
• 请测试/目录下的PHP页面中是否可以读取到名为bar的Cookie
• 请测试/uploads下的PHP页面中是否可以读取到名为foo的Cookie
• 请新建另一个子目录,测试在子目录中的PHP页面能读取到哪些Cookie
一旦设置了Path,那么该Path下的Cookie只有该Path下的页面可以读取到
为Cookie设置域名
setcookie('key', 'val', time() + 86400, '/uploads', '.your.domain');
设置域为news.php.cn的Cookie,是无法被sports.365jia.cn下的页面读取到的,反之亦然
若想让所有二级域名共享Cookie需要将域设置为.php.cn
Cookie的限制问题
很多浏览器对Cookie的数量是有限制的,大多数浏览器规定一个网站可以设置的Cookie数量是不可以超过50个的,部分浏览器甚至限制为30个
浏览器对Cookie的尺寸也有限制,一般不得超过4K大小
Cookie的安全问题
如果在网吧上网后没有关机,其他人使用你的电脑后是可以查看到你访问的所有的网站历史记录以及网站保存的Cookie内容的,如果重要的数据(用户名、密码、卡号、手机号、身份证号……)保存在Cookie中是非常危险的行为。
因此,重要数据不能存放在Cookie里,如果一定要保存还是得靠服务器
cookie注意事项
不同的电脑无法共享Cookie
同一台电脑中的不同的浏览器也无法共享Cookie
同一个浏览器不同的域名下还是无法共享Cookie
甚至同一个浏览器、同一个域名下,不同路径的Cookie也无法实现共享
如何取回 Cookie 的值?
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
<?php // 输出 cookie 值 echo $_COOKIE["user"]; // 查看所有 cookie print_r($_COOKIE); ?>
在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:
<html> <head> <meta charset="utf-8"> <title> php中文网(php.cn)</title> </head> <body> <?php if (isset($_COOKIE["user"])) echo "欢迎 " . $_COOKIE["user"] . "!<br>"; else echo "普通访客!<br>"; ?> </body> </html>
如何删除 Cookie?
当删除 cookie 时,您应当使过期日期变更为过去的时间点。
删除的实例:
<?php // 设置 cookie 过期时间为过去 1 小时 setcookie("user", "", time()-3600); ?>
如果浏览器不支持 Cookie 该怎么办?
如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据(有关表单和用户输入的内容,在本教程的前面章节中我们已经介绍过了)。
下面的表单在用户单点击 "Submit" 按钮时,向 "welcome.php" 提交了用户输入:
<html> <head> <meta charset="utf-8"> <title> php中文网(php.cn)</title> </head> <body> <form action="welcome.php" method="post"> 名字: <input type="text" name="name"> 年龄: <input type="text" name="age"> <input type="submit"> </form> </body> </html>
取回 "welcome.php" 文件中的值,如下所示:
<html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> 欢迎 <?php echo $_POST["name"]; ?>.<br> 你 <?php echo $_POST["age"]; ?> 岁了。 </body> </html>
慢半拍
实际开发中往往会犯的一个错误就是setcookie后,直接通过$_COOKIE去获取数据
setcookie('foo', 1);
print_r($_COOKIE);
echo $_COOKIE['foo'];
上面的情况下,是无法获取到刚刚设置的Cookie的,这就是我们标题里说的慢半拍的问题.
原理很简单,Cookie实际上最终是保存到浏览器中的,只有当前页面返回到浏览器后,setcookie的值才会保存到浏览器里,在页面第二次访问的时候,PHP才能读取到浏览器的Cookie里的数据
而$_COOKIE中的数据则是每次页面请求的时候从客户端带给服务器的
这就是为什么当时设置,当时取不到的原因
解决慢半拍的一个方法就是存值之后程序立即刷新页面.