会话控制
cookie
cookie 是用来将网站的资料记录在客户端的技术,这种技术让Web服务器能将一些资料,存放于客户端中
不同浏览器之间的cookie各不相同,互不关联
查看cookie的方法:
- 通过浏览器,查看所有的cookie,找到本地127.0.0.1,这代表本地,就可查看,若是其他网页,查看其域名,来找cookie
- 直接右击网页 , 然后检查,再找到Application,然后会发现cookie
设置cookie
setcookie ( string $name, [ string $value = "" ],[ int $expire = 0], [ string $path = ""], [ string $domain = ""], [ bool $secure = false], [ bool $httponly = false ] ) : bool
$name —— Cookie 名称。
$value —— Cookie 值。 这个值储存于用户的电脑里,请勿储存敏感信息。
$expire —— Cookie 的过期时间(Unix 时间戳,php内部会自动转换)。基本可以用 time() 函数的结果加上希望过期的秒数。 或者也可以用 mktime()。 time()+60*60*24*30 就是设置 Cookie 30 天后过期。
如果设置成零,或者忽略参数, Cookie 会在会话结束时过期(也就是关掉浏览器时)。
$path —— Cookie 有效的服务器路径。默认值是设置 Cookie 时的当前目录
$domain —— Cookie 的有效域名/子域名。
$secure —— 设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。 设置成 TRUE 时,只有安全连接存在时才会设置 Cookie。
$httponly —— 设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。
<?php
setcookie("username","Yz",time()+60*60*24*365);//一年后过期
?>
//时间设置 60 秒 , 60 分钟 ,24小时 ,365天 得到秒数
删除cookie
通过将时间设置为过去时间来删除,每一次设置,当存在时,会覆盖原本存在的cookie
<?php
setcookie("username","Yz",time()-24*60);//
?>
<?php
function move_cookie($name = ""){//当value为空,不能创建出cookie
preg_match("/^\w*/",$name,$arr);
$str = $arr[0];
if($_COOKIE["{$str}"])
{
if(setcookie($name,"",time()-60*60*24*365)){
echo "删除{$name}的cookie成功";
}
else{
echo "删除{$name}的cookie失败";
}
}
else{
echo "不存在{$name}的cookie";
}
}
move_cookie("user[email]");
?>
读取cookie
$_COOKIE 返回cookie数组,包含所有本网页的cookie
<?php
print_r($_COOKIE["username"]);
?>
多维数组存储cookie
设置 $name 时,使用数组格式
setcookie("user[username]","Yz",time()+60*60*24*365)
可以利用数组和循环来存储cookie
<?php
$arr = array("usernames"=>"Yz","email"=>"qq.com");
foreach($arr as $key => $val)
{
var_dump(setcookie("user[{$key}]","{$val}",time()+60*60*24*365));//一年后过期
}
print_r($_COOKIE["user"]);//Array ( [0] => Array [usernames] => Yz [email] => qq.com )
?>
uniqid() —— 产生一个随机的ID
感觉当前Unix时间戳来随机一个ID,可能会重复,因此可以添加一个随机的前缀
uniqid ([ string $prefix = "", [bool $more_entropy = FALSE ] )
$prefix —— 带有空前缀的返回字符串将为13个字符长。如果more_entropy为TRUE,则为23个字符。
返回基于时间戳的唯一标识符作为字符串。也可以添加一些随机数字
<?php
echo uniqid()."<br>"; //5e935a9eba391
echo uniqid(rand(1000,9999))."<br>"; //41025e935a9eba396
echo uniqid(rand(1000,9999),true)."<br>";//29725e935a9eba3974.35273953
echo uniqid("",true)."<br>"; //5e935a9eba3990.12987812
?>
session
Cookie是将资料存储在客户端电脑
Session是将数据存放到服务器上,客户端的session只需要 保存session ID,session ID 相当于身份证
开启session
session_start() —— session_start — 启动新会话或者重用现有会话
session_start ([ array $options = array() ] ) : bool
options
此参数是一个关联数组,如果提供,那么会用其中的项目覆盖 会话配置指示 中的配置项。此数组中的键无需包含 session. 前缀。
- 新建一个会话 —— 会产生一个PHPSESSID的cookie,并分配一个ID值
<?php
session_start();
$arr = array("usernames"=>"Yz","email"=>"qq.com");
foreach($arr as $key => $val)
{
$_SESSION[$key] = $val;//一年后过期
}
?>
- 启用一个会话 —— 通过之前产生的cookie PHPSESSID 的ID值,访问数据
<?php
session_start();
var_dump($_SESSION);//array(2) { ["usernames"]=> string(2) "Yz" ["email"]=> string(6) "qq.com" }
?>
删除session
- session_unset() —— 会释放当前会话注册的所有会话变量。
session_unset ( void ) : void
没有返回值。
不会删除后台数据,只删除客户端的PHPSESSID
<?php
session_start();//打开会话
session_unset();//释放会话
?>
- session_destroy() —— 销毁一个会话中的全部数据
session_destroy ( void ) : bool
成功时返回 TRUE, 或者在失败时返回 FALSE。
会删除后台数据,以及客户端的PHPSESSID
<?php
session_start();
session_destroy();
?>
- 使用删除cookie的方法
//注意路径问题, 默认值是设置 Cookie 时的当前目录
//可以查看配置文件PHP.ini中,session.cookie_path = /
<?php
session_start();
setcookie(session_name(),"",time()-60*60*24*365,'/');
?>
其他
session_name() —— 读取/设置会话名称
session_name ([ string $name ] ) : string
会话名称至少需要一个字母,不能全部都使用数字, 否则,每次都会生成一个新的会话 ID。
返回当前会话名称。如果指定 name 参数,那么此函数会更新会话名称,并且 返回 原来的 会话名称。
提高练习
登录页面 - login.php
<?php
if(isset($_POST['submit'])){//判断是否提交
if( isset($_COOKIE['username']) && $_COOKIE['username'] == 'Yz')//防止重复登录
{
exit("亲爱的{$_COOKIE['username']},您已登录,请不要重复登录 !!!<a href=index.php>返回主页</a>");//重复登录,阻止后续内容
}
if(isset($_POST['username']) && isset($_POST['password']) && $_POST['username'] == 'Yz') // 判断是否传入数据
{
if(setcookie("username",$_POST['username'],time()+60*60*24*365)){//生成cookie,成功就跳转
header("Location:transfer.php?url=index.php&info=登录成功,请稍后!!!");
}
else
{
echo "设置cookie失败";
}
}
else{
header("Location:transfer.php?url=index.php&info=用户名或者秘密输入错误登陆失败");
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>cookie</title>
</head>
<body>
<form action="login.php" method="post">
<!-- 注意当上传数据修改地址时,也要修改这里 -->
username : <input type="text" name="username" id="name">
passdword : <input type="password" name="password" id="pad">
<input type="submit" value="登录" name="submit">
</form>
</body>
</html>
个人主页 - index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="refresh" content="3;URL = <?php echo $_GET['url']?>"/>
<title>用户界面</title>
<style>
h1{
color: #869596;
text-align: center;
}
button{
display: inline-block;
background: red;
height: 50px;
position: absolute;
right: 20%;
}
</style>
</head>
<body>
<h1>
<?php
if( isset($_COOKIE['username']) && $_COOKIE['username'] == 'Yz')
{
echo "亲爱的{$_COOKIE['username']},欢迎回来 !!!";
echo "<a href=loginout.php>注销</a>";
}
else{
echo "<a href='login.php'>请登录</a>";
}
?>
</h1>
</body>
</html>
跳转页面 - transfer.php
<?php
if( !isset($_GET['url']) || !isset($_GET['info']))
{
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="refresh" content="3;URL = <?php echo $_GET['url']?>"/>
<title>正在跳转中...</title>
<style>
h1{
color: #869596;
text-align: center;
}
</style>
</head>
<body>
<h1>
<?php echo $_GET['info'] ?>3秒后自动跳转。。。
</h1>
</body>
</html>
注销页面 - loginout.php
<?php
if( $_COOKIE['username'] && $_COOKIE['username'] == 'Yz')//确认用户
{
if(setcookie("username",$_POST['username'],time()-60*60*24*365)){//删除cookie,注销用户
header('Location:transfer.php?url=index.php&info=注销成功,正在跳转!');
}
else{
header('Location:transfer.php?url=index.php&info=注销失败,请稍后重试!');
}
}
else{
header('Location:transfer.php?url=index.php&info=注销失败,请稍后重试!');
}
?>
网友评论