Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:登录验证的难点在于流程控制, 这个理解了就好办了
<?php
// 开启会话
session_start();
// 判断是否已经登录?
if (isset($_SESSION['user'])) $user = unserialize($_SESSION['user']);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>首页</title>
<style>
nav {
height: 40px;
padding: 0 15px;
background-color: black;
display: flex;
justify-content: space-between;
align-items: center;
}
a {
font-size: 20px;
color: white;
text-decoration: none;
}
</style>
</head>
<body>
<nav>
<a href="index.php">首页</a>
<?php if (isset($user)) : ?>
<a href="" id="logout"><span style="color:red"><?php echo $user['name']?></span> 退出</a>
<?php else: ?>
<a href="login.php">登录</a>
<?php endif ?>
</nav>
</body>
<script>
// 为退出按钮创建事件监听器
document.querySelector('#logout').addEventListener('click', function(event) {
if (confirm('是否退出')) {
// 禁用默认行为, 其实就是禁用原<a>标签的点击跳转行为,使用事件中的自定义方法处理
event.preventDefault();
// 跳转到退出事件处理器
window.location.assign('handle.php?action=logout');
}
});
</script>
</html>
<?php
session_start();
// 判断是否已登录
if (isset($_SESSION['user']))
exit('<script>alert("请不要重复登录");location.href="index.php";</script>');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<link rel="stylesheet" href="index.css/index.css">
</head>
<body>
<h3>用户登录</h3>
<form action="handle.php?action=login" method="POST">
<div>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" placeholder="@qq.com" require autofocus>
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" id="password" placeholder="不小于6位">
</div>
<div>
<button>登录</button>
</div>
</form>
<a href="register.php">注册</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户注册</title>
<link rel="stylesheet" href="index.css/index.css">
</head>
<body>
<h3>用户注册</h3>
<form action="handle.php?action=register" method="POST">
<div>
<label for="name">昵称:</label>
<input type="text" name="name" id="name" require placeholder="昵称" autofocus>
</div>
<div>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" require placeholder="@qq.com">
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" id="password" require placeholder="不少于6位">
</div>
<div>
<label for="password">重复:</label>
<input type="password" name="password" id="password" require placeholder="必须与上面密码一致">
</div>
<div>
<button>注册</button>
</div>
</form>
<a href="login.php">登录</a>
</body>
</html>
<?php
// 开启会话
session_start();
// 连接数据库
$pdo = new PDO('mysql:host=php.cn;dbname=php','root','root');
$stmt = $pdo->prepare("SELECT * FROM `users`");
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($a);
// 处理用户登录与注册
$action = $_GET['action']; //获取get参数`login`或者是`register`
// 判断用户是想登录(login)或者是注册(register)
// strtolower:把字符串转换为小写
switch(strtolower($action)){
// 登录
case 'login':
// 判断请求是否合法
// $_SERVER['REQUEST_METHOD']:请求类型
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 请求正确 ,获取需要验证的数据
$email = $_POST['email'];
$password = sha1($_POST['password']);
// 用回调函数过滤数组中的元素,返回数组中email和passeord和当前用户输入的数据相同的值
// $users:数据库中的数据
// $user:$users数组中的每个键值对,也叫用户的所有信息
$results = array_filter($users, function($user) use ($email, $password) {
return $user['email'] === $email && $user['password'] === $password;
});
// count:计算数组的单元数目
// 如果results === 1;说明用户存在
if (count($results) === 1) {
// unseralize:反序列化
// seralize:序列化
// array_pop:删除数组中最后一个元素;出栈
// user的值等于序列化后的$resylts中的最后一个元素
// 设置session
$_SESSION['user'] = serialize(array_pop($results));
exit('<script>alert("验证通过");location.href="index.php"</script>');
} else {
exit('<script>alert("邮箱或密码错误,或者还没有帐号");location.href="login.php";</script>');
}
}else{
die('请求错误');
}
break;
// 退出
case 'logout':
if (isset($_SESSION['user'])) {
// 注销所有session变量,并且结束session会话
session_destroy();
exit('<script>alert("退出成功");php.cn.assign("index.php")</script>');
}
break;
case'register':
// 注册
// 获取数据
$name = $_POST['name'];
$email = $_POST['email'];
$password = sha1($_POST['password']);
$register_time =time();
// 将新用户插入到表中
$sql = "INSERT `users` SET `name`='{$name}', `email`='{$email}', `password`='{$password}', `register_time`={$register_time}";
$stmt = $pdo->prepare($sql);
$stmt->execute();
// 变量不能放在数组中
// $stmt->execute([$name,$email,$password,$time]);
// stmt->rowcount:返回受上一个sql语句影响的行数
// 如果stmt->rowcount:返回受上一个sql语句影响的行数 === 1,说明插入成功
if ($stmt->rowCount() === 1) exit('<script>alert("注册成功");php.cn.assign("login.php")</script>');
else exit('<script>alert("注册失败");php.cn.assign("login.php")</script>');
break;
// 未定义
default:
exit('未定义操作');
}
session_strat()
,cookin
不需要url
中action
信息,判断用户想要执行的操作
1.判断数据请求是否正确
2. 获取用户输入的信息与`session`中的信息匹配,成功则登录,不成功则输出错误提示。
1. session_destroy():注销所有session变量,并且结束session会话
1. 通过`$_POST`获取用户信息
2.使用数据库新增的方法把用户信息添加到数据库