博主信息
MArtian
博文
30
粉絲
3
評論
0
訪問量
1770
積分:0
P豆:63.5

COOKIE與SESSION存儲與讀取 - 第九期先上班20191126

2019年11月26日 00:36:57閱讀數:77博客 / MArtian / PHP線上第九班作業——第二階段

COOKIE登錄

cookie.gif

INDEX頁面判斷是否登錄來顯示“登錄”或“退出”按鈕

// 1: 已登錄: 顯示出用戶的登錄信息, 顯示退出按鈕if (isset($_COOKIE['username'])) {
    echo '<p align="center">';
    echo '用戶: ' . $_COOKIE['username'] . '已登錄<br>';
    echo '<a href="dispatch.php?action=logout">退出</a>';
    echo '</p>';} else {
    // 2. 未登錄,就跳轉到登錄頁面
    echo '<p align="center"><a href="dispatch.php?action=login">請登錄</a></p>';}

dispatch.php 請求分發頁面

// 連接數據庫require '../require/pdo_config.php';// 獲取請求參數$action = isset($_GET['action']) ? $_GET['action'] : 'login';$action = htmlentities(strtolower(trim($action)));// 請求分發switch ($action) {
    // 1. 登錄頁面
    case 'login':
        // 加載登錄表單
        include __DIR__ . '/login.php';
        break;

    // 2. 驗證登錄
    case 'check':
        include __DIR__ . '/check.php';
        break;

    // 3. 退出登錄
    case 'logout':
        include __DIR__ . '/logout.php';
        break;

    // 默認操作
    default:
        header('Location: index.php');
        echo '<script>location.assign("index.php");</script>';}

login登錄頁面判斷是否已登錄,防止用戶重復登錄

<?php
    // 防止用戶重復登錄
    if (isset($_COOKIE['username'])) {
        echo '<script>alert("不要重復登錄");location.assign("index.php");</script>';
    }?>

check判斷用戶登錄,并把username存儲到cookie,以此作為判斷登錄依據

$pdo = new PDO($dsn,$db['userName'],$db['userPwd']);if($_SERVER['REQUEST_METHOD']==='POST'){
    $username = $_POST['username'];
    $userpwd = md5($_POST['userpwd']);
    $sql = 'SELECT `username`,`userpwd` FROM `user` WHERE `username` = :username AND `userpwd` = :userpwd LIMIT 1';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':username'=>$username,':userpwd'=>$userpwd]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    if(false === $user){
        echo '<script>alert("登錄失敗");history.back();</script>';
    }
    else{
        $stmt = $pdo->prepare('UPDATE `user` SET `logindate` =:logindate WHERE `username`=:username');
        $stmt -> execute([':logindate'=>$time,':username'=>$user['username']]);
        setcookie('username',$user['username']);
        echo '<script>alert("登錄成功");location.assign("index.php");</script>';
        exit;
    }}else{
    die('請求錯誤');}unset($pdo);

退出登錄操作

<?phpif(isset($_COOKIE['username'])){
    setcookie('username',null,time()-3600);
    echo '<script>alert("退出成功");location.assign("index.php");</script>';}else{
    echo '<script>alert("請先登錄");location.assign("login.php");</script>';}

SESSION登錄

session.gif

dispatch請求分發

<?phprequire_once 'require/pdo_config.php';session_start();$action = isset($_GET['action']) ? $_GET['action'] : 'login';$action = htmlentities(strtolower(trim($action)));switch($action){
    case 'login' :
        include __DIR__ . '/login.php';
        break;
    case 'check' :
        include __DIR__ .'/check.php';
        break;
    case 'logout' :
        include __DIR__ .'/logout.php';
        break;
    default :
        header('location:index.php');
        echo('<script>location.assign("index.php")</script>');}

判斷用戶登錄是否成功

if($_SERVER['REQUEST_METHOD']==='POST'){
    $username = $_POST['username'];
    $userpwd = md5($_POST['userpwd']);
    $sql = 'SELECT `username`,`userpwd` FROM `user` WHERE `username` = :username AND `userpwd` = :userpwd LIMIT 1';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':username'=>$username,':userpwd'=>$userpwd]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    if(false === $user){
        echo '<script>alert("登錄失敗");history.back();</script>';
    }
    else{
        $stmt = $pdo->prepare('UPDATE `user` SET `logindate` =:logindate WHERE `username`=:username');
        $stmt -> execute([':logindate'=>$time,':username'=>$user['username']]);
        $_SESSION['username']=$user['username'];
        echo '<script>alert("登錄成功");location.assign("prepareInsert.php");</script>';
        exit;
    }}else{
    die('請求錯誤');}unset($pdo);

清空SESSION退出登錄

if(isset($_SESSION['username'])){
    session_destroy();
    echo '<script>alert("退出成功");location.assign("index.php");</script>';}else{
    echo '<script>alert("請先登錄");location.assign("login.php");</script>';}

總結

1.COOKIE與SESSION是php中非常有效的在多頁面間跟蹤用戶的手段,其中COOKIE保存在客戶端,SESSION保存在服務端,客戶端COOKIE會被篡改,不應該保存敏感信息到COOKIE,相反SESSION可以存儲用戶密碼等敏感信息,一些不必要的類似用戶基礎設置的信息可以保存在COOKIE中減少服務器壓力。

2.使用$_COOKIE$_SESSION超全局變量來訪問COOKIE和SESSION,值都是以數組形式存儲的,設置COOKIE值使用setcookie()函數,參數為(下標,值,存儲時間),其中存儲時間以秒為單位,設置為60,COOKIE有效期就是1分鐘,60*60就是1小時,60*60*24就是一天,以此類推。

3.如果要銷毀COOKIE,只需要把它的有效時長設置為負數或使用unset()函數即可。

4.在使用SESSION之前需要使用session_start()先打開會話,才能對SESSION的值進行讀寫,銷毀SESSION使用session_destroy()函數。



1.jpg2.jpg


批改老師:歐陽克歐陽克

批改狀態:合格

老師批語:完成的不錯,繼續加油

全部評論

文明上網理性發言,請遵守新聞評論服務協議

條評論
暫無評論暫無評論!
  • 足彩吧合买平台