完成用户的登录与验证,分别用cookie和session来实现
实战案例包含4个部分,验证流程如下:
1、登录页面,获取用户输入,并用POST方式将数据提交,跳转至验证页面
2、验证页面,接收POST方式传来的登录数据,并与数据库的数据进行比对,如果有则登录成功。登录成功后将用户数据写入COOKIE,并跳转至后台管理页面
3、后台管理页面,提供一个退出按钮,跳转至登出页面
4、删除cookie数据后,跳转至登录页,重新开始。
代码如下:
1、登录页面--login.php
<?php // 验证是否已经登录 if (isset($_COOKIE['username'])) { echo "<script>alert( '请不要重复登录' ) ; location.assign('admin.php');</script>"; exit(); } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>登录</title> </head> <body> <h3>用户登录</h3> <form action="check.php" method="post" onsubmit="return isEmpty()"> <p> <label for="usrAccount">邮箱:</label> <input type="email" name="email" id="usrAccount"> </p> <p> <label for="loginCode">密码:</label> <input type="password" name="password" id="loginCode"> </p> <p> <button>提交</button> </p> </form> <script> function isEmpty() { var usrAccount = document.getElementById("usrAccount").value; var loginCode = document.getElementById("loginCode").value; if (usrAccount.length===0 && loginCode.length===0) { alert("用户名与密码不能为空"); return false; } } </script> </body> </html>
2、验证页面--check.php
<?php if (isset($_COOKIE['username'])) { echo "<script>alert( '请不要重复登录' ) ; location.assign('admin.php');</script>"; exit(); } require __DIR__ . '/inc/connect.php'; $usrAccount = $_POST["email"]; $loginCode = sha1($_POST["password"]); $sql = "SELECT * FROM `user` WHERE `email`= :email AND `password`= :password LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->execute(["email"=>$usrAccount,"password"=>$loginCode]); $userDat = $stmt->fetch(PDO::FETCH_ASSOC); if (false === $userDat) { echo "<script>alert('登录失败,请重新登录'); location.assign('login.php');</script>"; exit(); } setcookie("username", $userDat["username"]); echo "<script>alert('登录成功'); location.assign('admin.php');</script>"; ?>
3、后台管理页面--admin.php
<?php if (isset($_COOKIE["username"])):?> <!doctype html> <html> <head> <meta charset="zh-cn"> <title>管理页</title> </head> <body> <h2>后台管理</h2> <p>欢迎:<?php echo $_COOKIE["username"]; ?></p> <p> <a href="logout.php">退出</a> </p> </body> </html> <?php else:?> <script>alert("请登录");location.assign("login.php");</script> <?php endif; ?>
4、登出页面--logout.php
<?php if (isset($_COOKIE["username"])) { setcookie("username",null,time()-3600); echo "<script>alert('退出成功'); location.assign('login.php');</script>"; } else { echo "<script>alert('请登录'); location.assign('login.php');</script>"; } ?>
四个页面中,在头部都写了验证登录状态的代码,避免用户跳过正常流程直接访问。如果已登录,则不能再访问登录页面与验证页面;如果未登录,则不能直接访问后台管理页与登出页面。
判断条件为:
if (isset($_COOKIE["username"]))
如果COOKIE文件存在,则代表已登录,否则是未登录状态。
如果将COOKIE方式改为SESSION方式只需做以下改动:
1. 在每个页面的开始处写上 session_start(); 代表SESSION会话开始。
2. 将超全局变量$_COOKIE改为$_SESSION
3. 验证成功后,将用户信息写入SESSION文件
用 $_SESSION['username'] = $user['username'];
替换 setcookie('username', $user['username']);
4. 退出时删除用户信息
session_destroy()