Blogger Information
Blog 13
fans 0
comment 0
visits 6957
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Cookie & Session 表單認證 (2019年7月26日)
Little的博客
Original
667 people have browsed it

Cookie及Session的代碼寫在同一個文件上,調試時把另一種方式的代碼隱藏。

另外,把表單驗證的過程畫了小總結,並不確定思路是否完全正確

1.png


Session Result

session_result.png


----------------------------------------------------------------------------------------------------------------------------

Index.php 代碼 

实例

<?php

////  已登錄,顯示訊息及登出按鈕
////cookie
//if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
//    echo '用户: ' . $_COOKIE['username'] . '已登录<br>';
//    echo '<a href="dispatch.php?action=logout">退出</a>';
//} else {
//    //  未登錄,跳到登錄頁
//    echo '<a href="dispatch.php?action=login">请登录</a>';
//}

//session part
session_start();

if (isset($_SESSION['username']) && $_SESSION['username'] === 'admin') {
    echo '用户: ' . $_SESSION['username'] . '已登录<br>';
    echo '<a href="dispatch.php?action=logout">退出</a>';
} else {
    //未登錄,跳到登錄頁
    echo '<a href="dispatch.php?action=login">请登录</a>';
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


dispath.php代碼

实例

<?php

// 请求派发器: 前端控制器
// 功能就是获取到用户的请求, 并调用不同的脚本进行处理和响应

require __DIR__ . '/db/connect.php';

//判斷請求的值
$action = isset($_GET[ 'action' ]) ? $_GET[ 'action' ] : 'login';

// htmlentites ->轉換成html實體
//strtolower-> 轉換成小寫
//trim-> 刪除空格
$action = htmlentities(strtolower(trim($action)));

//分發請求

switch ($action) {
    //獲取參數為login -> 跳到login頁面
    case 'login':
        include __DIR__ . '/login.php';
        break;

    //獲取參數為check -> 跳到check頁面
    case 'check':
        include __DIR__ . '/check.php';
        break;

    //獲取參數為logout -> 跳到logout頁面
    case 'logout':
        include __DIR__ . '/logout.php';
        break;

        //默認操作 其他參數->跳到首頁
    default:
        header('Location : index.php');
    //  JS : echo '<script>location.assign("index.php");</script>';
}

运行实例 »

点击 "运行实例" 按钮查看在线实例



login.php代碼

实例

<?php
////cookie part
////防止用户重複登錄
//if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
//    echo '<script>alert("你已登錄");location.assign("index.php");</script>';
//}

//session part
session_start();
 //防止用户重複登錄
if (isset($_SESSION['username']) && $_SESSION['username'] === 'admin') {
    echo '<script>alert("你已登錄");location.assign("index.php");</script>';
}
?>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<h3>用户登录</h3>
<!--action=check: 跳轉登錄時先進行驗證-->
<!--return isEmpty(): 利用function獲取狀態 true:提交成功 / false:提交失敗-->
<form action="dispatch.php?action=check" method="post" onsubmit="return isEmpty();"
<p>
    <label for="email">邮箱:</label>
    <input type="email" name="email" id="email">
</p>
<p>
    <label for="password">密码:</label>
    <input type="password" name="password" id="password">
</p>
<p>
    <button>提交</button>
</p>
</form>

<script>
    //檢查用戶輸入的數據是否為空
    function isEmpty() {
        var emailValue = document.querySelector('#email').value;
        var passwordValue = document.querySelector('#password').value;

        if(emailValue.length === 0 || passwordValue.length === 0){
            alert('郵箱及密碼不能為空!');
            //返回值為false 表單提交事件失敗
            return false;
        }
    }
</script>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


check.php代碼


实例

<?php
session_start();
//判斷請求類型
if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {
    $email = $_POST[ 'email' ];
    //sha1 加密方法-> 轉換成40位的字符串
    $password = sha1($_POST[ 'password' ]);

    //與database進行驗證
    //SQL語句
    $sql = 'SELECT * FROM `user` WHERE `email`=:email AND `password`=:password LIMIT 1';
    //創建預處理對象
    $preObj = $pdo->prepare($sql);
    //執行 -> 把從$_POST獲得的值,存到SQL語句中進行查詢
    $preObj->execute([ 'email' => $email , 'password' => $password ]);
    //返回數據並存到數組
    $user = $preObj->fetch(PDO::FETCH_ASSOC);

    //判斷結果為失敗
    if ( $user === false ) {
        //database驗證失敗 返回上一頁,重新登錄
        echo '<script>alert("驗證失敗!");history.back();</script>';
        exit();
    }

    //判斷結果為成功,並保存到cookie
//    setcookie('username' , $user[ 'username' ]);

    //判斷結果為成功,並保存到session
    $_SESSION['username'] = $user['username'];

    echo '<script>alert("登錄成功");location.assign("index.php");</script>';
    exit;
} else {
    die('請求類型失敗');
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


logout.php代碼


实例

<?php
// 必须在用户已经登录的情况下再退出

//cookie有值 = 已登入

//cookie part
//if ( isset($_COOKIE[ 'username' ]) && $_COOKIE[ 'username' ] === 'admin' ) {
//    //清空cookie -> logout
//    setcookie('username' , null , time() - 3600);
//    echo '<script>alert("退出成功");location.assign("index.php");</script>';
//} else {
//    // 要求用户先登录
//    echo '<script>alert("請先登录");location.assign("login.php");</script>';
//}

//session part
session_start();
if ( isset($_SESSION[ 'username' ]) && $_SESSION[ 'username' ] === 'admin' ) {
    //unset session => logout
    session_unset();
    setcookie('PHPSESSID' , null , time() - 3600);
    echo '<script>alert("退出成功");location.assign("index.php");</script>';
} else {
    // 要求用户先登录
    echo '<script>alert("請先登录");location.assign("login.php");</script>';
}

运行实例 »

点击 "运行实例" 按钮查看在线实例




Correction status:qualified

Teacher's comments:如果不是类文件, 则PHP脚本名称的首字母不要大写, 以免也类文件混淆, 请遵守行业命名规则, 当然这不是强制性的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post