PHP基础 —— 会话控制

会话控制

cookie

cookie 是用来将网站的资料记录在客户端的技术,这种技术让Web服务器能将一些资料,存放于客户端中

不同浏览器之间的cookie各不相同,互不关联

查看cookie的方法:

  1. 通过浏览器,查看所有的cookie,找到本地127.0.0.1,这代表本地,就可查看,若是其他网页,查看其域名,来找cookie
  2. 直接右击网页 , 然后检查,再找到Application,然后会发现cookie
设置cookie

setcookie();

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. 前缀。
  1. 新建一个会话 —— 会产生一个PHPSESSID的cookie,并分配一个ID值
<?php
    session_start();
    $arr = array("usernames"=>"Yz","email"=>"qq.com");
    foreach($arr as $key => $val)
    {
        $_SESSION[$key] = $val;//一年后过期
    }
?>
  1. 启用一个会话 —— 通过之前产生的cookie PHPSESSID 的ID值,访问数据
<?php
    session_start();
    var_dump($_SESSION);//array(2) { ["usernames"]=> string(2) "Yz" ["email"]=> string(6) "qq.com" }
?>
删除session
  1. session_unset() —— 会释放当前会话注册的所有会话变量。
session_unset ( void ) : void

没有返回值。

不会删除后台数据,只删除客户端的PHPSESSID

<?php
    session_start();//打开会话
    session_unset();//释放会话
?>
  1. session_destroy() —— 销毁一个会话中的全部数据
session_destroy ( void ) : bool

成功时返回 TRUE, 或者在失败时返回 FALSE。

会删除后台数据,以及客户端的PHPSESSID

<?php
    session_start();
    session_destroy();
?>
  1. 使用删除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=注销失败,请稍后重试!');
    }
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值