美文网首页
PHP基础 —— 会话控制

PHP基础 —— 会话控制

作者: WhiteStruggle | 来源:发表于2020-07-03 08:15 被阅读0次

    会话控制

    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=注销失败,请稍后重试!');
        }
    ?>
    

    相关文章

      网友评论

          本文标题:PHP基础 —— 会话控制

          本文链接:https://www.haomeiwen.com/subject/mdejqktx.html