Correction status:qualified
Teacher's comments:如果不是类文件, 则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>'; }
点击 "运行实例" 按钮查看在线实例