这一节来讲讲Cookie技术,Cookie是客户端的一种会话技术。现在我们举一个例子来说明Cookie的应用场景,从一个生活中的实例来入手。


一个培训班招收了100个学生来培训,但是老师没办法一下子记住所有人的信息,于是就想了一个办法 —— 给每个人发了一个胸牌,要求学生在胸牌上写上自己的名字等信息。下次如果老师逮到某个学生在上课的时候玩手机,只需要查看他的胸牌就能够知道他是谁了。


老师就相当于服务器,学生相当于客户端。因为Http协议是无状态的,所以对于服务器而言,它根本不知道是谁访问了自己。于是服务器为了弥补这个缺陷,就借助一种叫做Cookie的技术,直接了当地告诉客户端:你现在给我在本地保存一个Cookie会话数据,下次你再来访问我的时候,带上这些数据,我就能知道你是谁了。


来一个快速入门的例子,利用ZendStudio创建一个项目,叫Cookie:

image.png

在index.php中创建一个Cookie对象,如何创建Cookie? -- 用 setcookie();

这个函数接收7个参数,一般来说我们学会前面四个参数就可以了。

参数1:保存的cookie变量名称

参数2:变量对应的值

参数3cookie文件的有效期

参数4:有效路径当前目录定义的cookie,可以被当前目录和子目录访问。子目录定义的cookie,无法被上级目录访问。

        

比如我现在创建一个Cookie对象:

 setcookie("gift","四驱双钻",time()+3600,"/");

time()代表获取当前时间的总秒数,后面+3600表示这个cookie在接下来的一个小时都有效。第四个参数是有效路径,“/”代表在整个项目的所有目录,任何文件中都可以访问该cookie。

现在,我们运行一下这个PHP文件。

http://localhost:8082/cookie/

页面一篇空白,那是当然的,因为我们并没有输出什么东西。但是,我们打开浏览的F12调试工具。(以Chrome浏览器为例)

image.png

可以看到浏览器确实已经保存这个cookie了,也就是说,我们的PHP只能通知浏览器去保存这样的一个数据,而不负责帮浏览器来保存。接下来,重新写一个php文件,去读取浏览器的这个cookie。


如何读取cookie,用$_COOKIE[“cookie的名字”]来读取。


image.png


访问之:http://localhost:8082/cookie/1.php

效果:

四驱双钻


看到这里,有的同学会问了,除了字符串,cookie还能保存别的什么东西吗,比如,保存一个数组?


是这样的,基本数据类型,数字,字符串什么的cookie都可以保存,但是数组、或者对象之类,还真保存不了。如果你一定要保存,可以把其转化为JSON字符串或者序列化字符串!到时候,读取cookie的时候,再转回来就是了。


这里提供示例代码:

//声明一个数组对象
$gifts = array("漫画书","GameBoy","红牛");
//转化为JSON格式,保存到Cookie
setcookie("gifts",json_encode($gifts),time()+3600,"/");


读取的时候,再转回来:

var_dump(json_decode($_COOKIE["gifts"]));


具体案例1 

//完成一个记住密码和用户名的功能

//用户提交登录表单,有一个记住密码的复选框,如果该复选框勾选了,那么就代表要记住密码,默认时间为2分钟


login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	
	<form action="index.php" method="get">
		
		<table cellpadding="10" cellspacing="2" border="1">
			
			<tr>
				<td>请输入用户名:</td>
				<td><input type="text" name="uname"></td>
			</tr>
			
			<tr>
				<td>请输入密码:</td>
				<td><input type="password" name="password"></td>
			</tr>
			
			<tr>
				<td><input type="checkbox" name="justLogin">2分钟内免登陆</td>
				<td><input type="submit"></td>
			</tr>
			
		
		</table>
		
	</form>

</body>
</html>


index.php

if(@$_COOKIE["uname"] && @$_COOKIE["password"]){
    if($_COOKIE["uname"] == "root" && $_COOKIE["password"] == md5("666")){
        echo "<h1>登录成功</h1>";
        return;
    }
}

$uname = @$_GET["uname"];
$password = md5(@$_GET["password"]);

if($uname == "root" && $password == md5("666")){
    echo "<h1>登录成功</h1>";
    
    //判断是否勾选了两分钟内免登陆
    if(@$_GET["justLogin"]){
        setcookie("uname",$uname,time()+120);
        setcookie("password",$password,time()+120);
        echo "您已经开通2分钟内免登陆功能,下次可直接登录!";
    }
    
}else{
    echo "<h1>登录失败!</h1><a href=\"JavaScript:history.back();\">返回登录页面</a>";
}

image.png