9.3 在PHP中生成cookie
cookie是存放在客户端的一组数据,它由服务器端的脚本程序生成、读写,并且以文件的形式存放在远程客户端,作用主要是用来识别用户身份。PHP中的session也通过cookie来区分不同的用户,它可以很容易地为每一个用户在服务器端建立一个临时的数据通道,通过这个通道,服务器实现了对不同用户的区分或者验证了不同用户的身份。
cookie在Web开发中向来扮演着比较重要的角色,它是Web开发中历史悠久并且经常使用的技术之一,在PHP中体现得更为明显。在设计用户身份验证的系统中,往往都会使用cookie。PHP中可以通过函数方便地使用cookie,本节将向读者介绍如何在PHP程序中使用cookie。
9.3.1 生成cookie
函数setcookie()可以在PHP程序中生成cookie。由于cookie是HTTP头标部分的内容,因此必须在输出任何数据之前调用setcookie(),这个限制和函数header()类似。函数setcookie()的语法如下。
bool setcookie( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
setcookie共有6个参数,分别如下所述。
name:表示cookie的名称。
·value:表示该cookie的值,保存在客户端,因此不要保存敏感或机密的数据。这个参数为空字符串时,表示撤销客户端中该cookie的资料。
·expire:表示该cookie有效的截止时间,即过期时间,该参数必须是整型。
·path:表示该cookie有效路径。
·domain:表示该cookie有效的域名。
·secure:表示在https的安全传输时才有效。
本函数除了第1个参数之外,其他参数都是可以省略的。如下示例代码即在客户端生成了一个名为testcookie、值为ilovephp的cookie。
<?php setcookie("testcookie", "ilovephp"); ?>
使用函数setcookie()给一个cookie设定的值只能是数字或字符串,不能是数组或其他复杂的数据结构。
9.3.2 获取cookie
当cookie设置后,可以通过PHP预定义变量$_COOKIE来获取cookie。不过,只能在其他页面使用这个变量来获取设置过的cookie,因为PHP中被设置的cookie并不会在本页生效,除非该页面被刷新。代码9-8演示了设置一个cookie后,在页面打印出该cookie的值。
代码9-8 显示cookie的值9-9.php
01 <?php 02 setcookie("testcookie", “ilovephp ”); // 设置cookie 03 echo "cookie's value: ".$_COOKIE['testcookie']; // 输出指定的cookie 04 ?>
【代码解析】 通过浏览器访问9-9.php并刷新,会看到如图9-7所示的输出结果。这里之所以要刷新页面后才能看到cookie的值,是因为cookie的值不会在调用setcookie()之后立即出现在变量$_COOKIE中,而是在客户端再次请求该页面时,cookie随请求一起发送至服务器,这时cookie才能存入到变量$_COOKIE中。
代码9-9生成数组cookie,这样可以设置多个cookie,并将其作为数组单元。提取cookie时,所有值都放在一个数组中。
代码9-9 设置多个cookie 9-9.php
01 <?php 02 // 设置多个cookie ,存放在数组mycookie 中 03 setcookie("mycookie['three']", "cookiethree"); // 设置mycookie['three'] 04 setcookie("mycookie['two']", "cookietwo"); // 设置mycookie['two'] 05 setcookie("mycookie['one']", "cookieone"); // 设置mycookie['one] 06 07 // 刷新页面后,将所有cookie 显示出来 08 if(isset($_COOKIE['mycookie'])) 09 { 10 foreach ($_COOKIE['mycookie'] as $name => $value) 11 { 12 echo "$name : $value <br />\n"; // 循环输出各个cookie 的值 13 } 14 } 15 ?>
【代码解析】通过浏览器访问程序9-9.php,第一次会看到一个空白页面,然后刷新该页面,就会看到如图9-8所示的输出结果。这段代码第10~13行通过循环从变量$_COOKIE中取出了所有cookie。
图9-7 显示cookie的值
图9-8 显示多个cookie的值
9.3.3 设置cookie的有效期
cookie有生命周期,即cookie只在一段时间内是有效的。通常,当用户退出IE或者Mozila浏览器时,cookie就会被删除。如果希望延长或者缩短cookie的有效期,可以向函数setcookie()传递第3个参数来设置cookie的有效期。如下示例代码演示了为cookie设置不同的失效时间。
setcookie('cookie_one','i_am_cookie1',time() + 60*60); // 设置cookie 1 小时后失效 setcookie('cookie_two','i_am_cookie2',time() + 60*60*24); // 设置cookie 1 天后失效 // 设置cookie 于2012 年1 月1 号中午12 点失效 setcookie('cookie_three','i_am_cookie3',mktime(12,0,0,1,1,2012));
这个用来接收cookie失效时间的参数是第7章介绍的UNIX时间戳,即一个秒数,因此才会像上述代码那样,通过计算得到cookie的失效时间。
如果未指定cookie的失效时间,或者指定为0,那么cookie将在会话结束时失效,通常是关闭浏览器后失效。如下代码设置了cookie对失效时间为0,即使用默认的失效时间。
setcookie('mycookie','delicious',0);
9.3.4 解决cookie的失效问题
cookie失效主要有两种原因,一种是用户关闭了浏览器对cookie的支持,一种是浏览器本身不支持cookie技术。
当网站中使用了cookie,也必须使用cookie才能运行时,可以检查当前浏览器是否支持cookie或开启cookie后再根据检查的情况运行下一步代码。
(1)使用JavaScript检查浏览器是否开启cookie支持,代码如下。
<script type="text/javascript"> // 检查浏览器是否开启cookie if(window.navigator.cookieEnabled == false){ // 显示检查信息 alert(" 请打开浏览器的cookie 支持, 再浏览本页"); // 导航至其他页面 window.navigate('notcookie.htm'); } </script>
(2)使用PHP检查浏览器是否开启cookie支持,代码如下。
<?php // 注册一个cookie 值 setcookie("test","data"); // 读取已经设置的cookie 值 if($_COOKIE["test"]!="data"){ // 如果不能读取或读取的cookie 值与设置的值不同, 显示提示信息, 中断脚本 echo " 请打开浏览器的cookie 支持, 再浏览本页."; exit(); } ?>
9.3.5 设置cookie的有效路径
通常,客户端的cookie只会回送给那些和设置这个cookie的程序在同一目录(或下级目录)的页面。例如,一个由http://www.somesite.com/index.php设置的cookie,会被所有到www.somesite.com的请求回送至服务器,因为index.php在服务器的根目录下。而由http://www.somesite.com/users/list.php设置的cookie随着请求,客户端的cookie会被回送到users目录下的其他页面,比如可以将cookie回送到http://www.somesite.com/users/login.php,但不能回送至http://www.somesite.com/orders/info.php。
如果需要客户端的请求把cookie传回到不同的路径下,可以通过向函数setcookie()传入第4个参数,通过该参数设置cookie在服务器端的有效路径。最灵活的方式是设置cookie的有效路径为/,它表示用setcookie()设置的cookie在整个服务器域名内有效;如果设置为/mypath/,那么该cookie只在域名的/mypath目录及其子目录下有效。如下代码实现了设置cookie的有效路径为一个指定的目录。
secookie('mycookie','delicious',0,'/ck_path/');
这样设置后,当请求/ck_path/目录下的页面或程序时,该cookie会被从客户端传回,而当请求/ot_path/时,该cookie不会从客户端传回至服务器。
9.3.6 删除cookie
cookie在使用完后,有些情况下为了安全方面的考虑,需要删除cookie值。在PHP中,没有专门用于删除cookie的函数,但是可以使用setcookie()和setrawcookie()函数把已知cookie的值设置为空,达到删除的效果。再就是使用删除数组单元的方法删除cookie。如下代码演示了删除cookie的不同方法。
<?php // 使用不同方法设置cookie setcookie("name"," 小王"); setrawcookie("sex"," 男"); $_COOKIE["age"] = 18; setcookie("school"," 大学"); // 使用不同方法删除cookie setcookie("name",""); // 使用setcookie() 函数删除cookie setrawcookie("sex",""); // 使用setcookie() 函数删除cookie $_COOKIE["age"]=""; unset($_COOKIE["school"]); // 遍历$_cookie foreach($_COOKIE as $key=>$value){ echo "$key=>$value<br>"; } ?>
上述代码使用了如下所述4种方法删除cookie。
·使用setcookie()和setrawcookie()函数设置为空值的cookie,其在$_COOKIE里的单元也会被删除。
·使用unset()函数删除cookie,与使用函数删除的效果是一样的。
·使用“$_COOKIE["age"]="";”方式,只是删除了cookie的值,但是其在$_COOKIE中单元的键名依然存在。
共有条评论 网友评论