cookie & session

cookie与session类似,掌握其中一个的用法,那么另外一个掌握起来也就不难。

首先说cookie吧

cookie由服务器创建,以文件形式保存在客户端的硬盘上。服务器与客户端交互的时候,就是依靠读取硬盘上的cookie,然后匹配后,判断是否为同一用户。

一、创建cookie

用setcookie(name,value,time,...),创建的cookie会保存在一个超全局数组($_COOKIE)当中.

<?php   
header("Content-type:text/html;charset=utf-8");
setcookie('name','beyond',time()+3600);
setcookie('email','1355036599@qq.com',time()+3600); 
echo '<a href="test_2.php">点击查看cookie</a>';
var_dump($_COOKIE);
?>

 输出:

array
  'name' => string 'beyond' (length=6)
  'email' => string '1355036599@qq.com' (length=17)

 注意:cookie时间的单位是秒(s),time()+60,表示的是该cookie的有效时间时从创建到失效的时间是60秒。在创建cookie时千万不要忘记时间,不然设置的cookie会立即失效。 

二、查看cookie

在其他页面或者本页面查看cookie时。查看cookie的整体属性的时,可如上例直接输出$_COOKIE;若要查看cookie的单个属性值时,比如name属性,则可用$_COOKIE['name'];输出的便是beyond,而不会输出email及其值。

三、删除cookie

常用的方法是:重新创建一个cookie或者说是重新赋值,但是新创建的cookie当中的属性名(name)都相同,只不过属性值(value)为空,时间time()为过去。

比如setcookie(‘name’,‘’,time()-3600);这就相当于删除cookie。

还有一种方法是用php的unset()函数,想要删除cookie的什么属性,就unset($_COOKIE['属性名'])。

再说session

和cookie正好相反,session由服务器创建,以文件形式保存在服务器端的硬盘上。服务器与客户端交互的时候,就是依靠读取硬盘上的session,然后匹配后,判断是否为同一用户。

一、创建session

在创建session之前,要先启动会话,用sesstion_start()函数。注意session_start()函数之前不要包含是任何文本输出。

然后家可以创建session了。session的创建与cookie有点不同,不像cookie用setcookie来创建,session直接用$_SESSION['name']=value来实现创建。创建session同样都保存在$_SESSION超全局数组中。

//test_1.php
<?php   
header("Content-type:text/html;charset=utf-8");
session_start();
$_SESSION['name']='beyond';
$_SESSION['email']='1355036599@qq.com';
echo '<a href="test_2.php">点击查看session</a>';
var_dump($_SESSION);
?> 

 输出:

array
  'name' => string 'beyond' (length=6)
  'email' => string '1355036599@qq.com' (length=17)

 二、查看session

//test_2.php
<?php
header('Content-type:text/html, charset=utf-8');
session_start();//若无此语句,则下一语句将会报错。
var_dump($_SESSION);
?>

和cookie几乎一样,都是用$_SESSION[]来访问,要访问name属性值,可用$_SESSION[name'];直接用$_SESSION是直接访问全部session。

注意:在设置属性的页面,因为已有session_start(),所以访问的时候可以不用再加session_start();但是在其他页面访问该页面的session时,必须要先使用session_start(),否则$_SESSION中将无任何数据,并弹出错误。

三、删除session

删除session可以用php的unset()函数,要删除什么内容直接删除即可,比如删除name==>unset($_SESSION['name'])。

也可以使用session_unset()函数,释放(删除)所有session。

另外一种方法是使用session_destroy()函数,此函数会删除所有session.

unset($_SESSION['name'])和session_destroy()都可以删除session,但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie,即在原页面依旧可以访问$_SESSION。 如果需要再次使用会话变量, 必须重新调用sesstion_start()函数。

以session_destroy()为例。

//test_3.php
<?php   
header("Content-type:text/html;charset=utf-8");
session_start();
$_SESSION['name']='beyond';
$_SESSION['email']='1355036599@qq.com';
echo '<a href="test_4.php">点击</a>';
var_dump($_SESSION);

//方法一
//unset($_SESSION['name']);

//方法二
//session_unset();

//方法三
session_destroy();

var_dump($_SESSION);
?> 

 输出:

array
  'name' => string 'beyond' (length=6)
  'email' => string '1355036599@qq.com' (length=17)

array
  'name' => string 'beyod' (length=6)
  'email' => string '1355036599@qq.com' (length=17)

 注意:此时使用了session_destroy()函数删除session,而$_SESSION中依旧保存着原session的所有值。如果是在其他页面访问该页面的session时,就会显示空。比如下面的代码,和上面的test_3.php配合。

//test_4.php
<?php
header('Content-type:text/html, charset=utf-8');
session_start();//若无此语句,则下一语句将会报错。
var_dump($_SESSION);
?>

 输出:

array
  empty

注意几个函数的区别。

拓展:

其实session与cookie是有一定的联系的,请看下一段代码

//test_5.php
<?php   
header("Content-type:text/html;charset=utf-8");
session_start();
$_SESSION['name']='beyond';
$_SESSION['email']='1355036599@qq.com';
var_dump(session_name()); //用于获取当前会话名称
var_dump($_COOKIE);
?> 

 输出:

string 'PHPSESSID' (length=9)

array
  'PHPSESSID' => string 'mbncbb0qam7mtfug27sdq9e273' (length=26)

 可见创建的session会在cookie当中生成一个PHPSESSID的字符串,那么也就是说,我们可以利用删除cookie的PHPSESSID(也就是session_name())来删除session。

如下段代码:

//test_6.php
<?php   
header("Content-type:text/html;charset=utf-8");
session_start();
$_SESSION['name']='beyond';
$_SESSION['email']='1355036599@qq.com';
setcookie(session_name(),'',time()-3600,'/');
header('location:test_4.php');
?> 

 test_4.php输出结果:

array
  empty

证明删除session成功。

注意的是:用setcookie删除session时,参数增加了一个'/',代表的是path(路径),'/'表示的是在localhost(127.0.0.1)整个目录。同样的,用这种方法,删除session后,在原页面依旧可以访问$_SESSION,且值不为空。在其他界面为空。

原文地址:https://www.cnblogs.com/-beyond/p/5621705.html