文章教程

9.3在PHP中生成cookie

9/17/2020 9:31:19 PM 人评论 次浏览

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中单元的键名依然存在。

教程类别