批改状态:合格
老师批语:如果不是类文件, 则PHP脚本名称的首字母不要大写, 以免也类文件混淆, 请遵守行业命名规则, 当然这不是强制性的
Cookie及Session的代碼寫在同一個文件上,調試時把另一種方式的代碼隱藏。
另外,把表單驗證的過程畫了小總結,並不確定思路是否完全正確

Session Result

----------------------------------------------------------------------------------------------------------------------------
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>';
}点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号