SESSION和COOKIE完美解决了http web协议无状态的问题,从而实现数据在不同页面之间的传递(例如通过session存数的数据来判断用户的访问权限)和数据在客户端的持久存储(例如通过cookie存储论坛的用户登录信息,实现下次在本机登陆时不需要输入用户名和密码,可以直接登录)。
当登录网站时启动SESSION会话,会在服务器端随机生成一个SESSION_ID,这个SESSION_ID在本次登录结束之前一直有效,当关闭页面或执行注销操作之后,这个SESSION_ID会在服务器端自动注销。重新登录此页面时候,会重新生成另一个随机且唯一的SESSION_ID.
一、SESSION的使用
1、启动会话
Bool session_start(void)
注意:在这之前不能有任何输出,该函数的参数为空。
2.注册会话
<?php
session_start();//声明启动session
$_SESSION[“user”]=null;
//声明一个user的变量,并赋给空置
?>
3、使用会话
index.php内容:
<?php
session_start();//启动SESSION
$_SESSION[user]="明日科技";//为SESSION变量赋值
include("main.php");
?>
main.php
main.php内容:
<?php
if ($_SESSION['user']=="明日科技"){//判断用于存储用户名的Session会话变量是否为空
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>通过SESSION变量判断页面的访问权限</title>
</head>
<body>
<?php
echo $_SESSION['user']."欢迎您!";
?>
</body>
</html>
<?php
}else{
echo "您没有访问此页面的权限!";
}
?>
在本例中如果访问index.php,则成功输出“明日科技欢迎您!”,如果直接在地址栏中访问main.php则会访问失败。这是因为在index.php中定义了session变量,并在main.php中判断SESSION的值。
4、删除会话
删除单个会话、删除多个会话、结束当前会话。
unset($_SESSION[‘user’])删除session数组中指定的元素;unset($_SESSION),一次注销整个数组,禁止整个会话功能,并且没有办法将其恢复,用户也不能再次注册$_SESSION变量,所以,用户要是删除多个或全部会话,可以采用下面的两种方式;如果一次要删除所有的会话变量,可以将一个空的数组赋值给$_SESSION,代码如下:$_SESSION=array();如果整个会话已经结束,可以使用session_destroy()函数结束当前的会话,session_destroy().
二、SESSION的生命周期
session_set_cookie_params()
setcookie()
例子:
index.php:
?php
$time = 1 * 60;// 设置session失效时间
session_set_cookie_params($time);// 使用函数
session_start();// 初始化session
$_SESSION['username'] = '明日科技';//为SESSION变量赋值
?>
<!--创建超链接,实现SESSION变量在不同页面之间的传递-->
<a href="main.php">查看SESSION是否失效</a>
mai.php:
<?php
session_start();//初始化SESSION变量
echo $_SESSION['username'];//获取SESSION变量的值
?>
session_set_cookie_params()必须在session_start函数之前使用,并且在不同的浏览器之间还会导致一些不同的问题,所以不推荐使用。
在php中setcookie()函数主要用于创建cookie,但是该函数同样可以用于控制session的生命周期。
index.php:
<?php
session_start();//初始化SESSION变量
$time = 1 * 60;// 设置session失效时间
setcookie(session_name(),session_id(),time()+$time,"/");// 使用setcookie手动设置session失效时间
$_SESSION['username'] = "明日科技";//定义SESSION变量的值
?>
<!--创建超链接,实现SESSION变量在不同页面之间的传递-->
<a href="main.php">查看SESSION是否失效</a>
mai.php:
?php
session_start();//初始化SESSION变量
echo $_SESSION['username'];//获取SESSION变量的值
?
上面所讲的是在客户端支持cookie的前提下控制session的生命周期。
一旦客户端禁止cookie呢,session变量就不能再页面之间进行传递。解决的办法有四个:在登录之前告之用户必须打开cookie;修改配置文件php.ini的session.use_trans_sid=1或者编译的时候打开-enable-trans-sid选项,让pph自动夸页面传递session_id;以get和post方式,通过表单元素传递;通过文件或者数据库传递。
上面的第二种方法不常用,其他三种还可以。下面get方式的实例:
Index.php:
<?php
session_start();
?>
<a href="index_ok.php?s_id=<?php echo session_id(); ?>">通过GET方式传递session数据</a>
Index_ok.php:
<?php
session_start();//初始化SESSION变量
echo "本页创建的SESSION_ID:".session_id();//获取当前页面的SESSION_ID
echo "<br>";
echo "获取上一页传递的SESSION_ID:".$_GET['s_id'];//获取上一页传递的ID值
?>
上面实例的结果,当客户端支持cookie时候,得到的两个页面的session_id相同,不知此cookie的时候,得到的两个session_id不同。
二、cookie
创建cookie:
<?php
setcookie("mr",'明日科技');
setcookie("mr", '明日科技', time()+60); //设置Cookie有效时间为60秒
//设置有效时间为60秒,有效目录为“/10.9/”,有效域名为“mrbccd.cn”及其所有子域名
setcookie("mr", "明日科技", time()+3600, "/10.9/",". mrbccd.cn", 1);
echo "读取COOKIE:".$_COOKIE['mr'];//通过$_COOKIE[]读取COOKIE的值
?>
首次运行本实例的时候得不到cookie的值,但是刷新以后可以得到。
读取cookie变量
通过超全局$_COOKIE[]来读取cookie的值。
删除cookie
如果cookie没有设置过期时间那么cookie会在浏览器关闭时自动删除,如果设置了过期时间,那么浏览器会保存cookie数据,即使重新启动计算机,只要没有过期,COOKIE数数据就一直有效。