登录  /  注册
博主信息
博文 94
粉丝 0
评论 0
访问量 89442
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
【PHP】用户登陆/用户注册/会话控制 实例总结
可乐随笔
原创
1902人浏览过

用户登陆/用户注册/会话控制

1.用户登陆

登陆页面:login.php

  1. <?php
  2. // 加载外部文件
  3. include 'template/public/header.php';
  4. ?>
  5. <!--
  6. 1.放弃 $_POST 和 $_GET 提交数据的方式
  7. 2.改为异步提交验证
  8. 3.button type改为 button,禁用默认提交行为
  9. -->
  10. <!-- 主体 -->
  11. <main>
  12. <!-- 用户登录 -->
  13. <form class="login" id="login">
  14. <table>
  15. <caption>
  16. 用户登录
  17. </caption>
  18. <tbody>
  19. <tr>
  20. <td><label for="email">邮箱:</label></td>
  21. <td><input type="email" name="email" id="email" autofocus /></td>
  22. </tr>
  23. <tr>
  24. <td><label for="password">密码:</label></td>
  25. <td><input type="password" name="password" id="password" /></td>
  26. </tr>
  27. <tr>
  28. <td colspan="2"><button type="button" onclick=check(this)>提交</button></td>
  29. </tr>
  30. </tbody>
  31. </table>
  32. </form>
  33. <p>
  34. <a href="register.php">没有帐号,请先注册</a>
  35. </p>
  36. </main>
  37. <script>
  38. async function check(btn) {
  39. //email
  40. const email = btn.form.email.value.trim();
  41. //password
  42. const password = btn.form.password.value.trim();
  43. //非空验证
  44. if (email.length > 0 && password.length > 0) {
  45. //异步提交:fetch api
  46. const response = await fetch('lib/user/check.php', {
  47. //请求类型:post
  48. method: 'POST',
  49. //请求头
  50. headers: {
  51. 'Content-Type': 'application/json;charset=utf-8',
  52. },
  53. //数据
  54. body: JSON.stringify({
  55. email,
  56. password
  57. })
  58. });
  59. // 2.解析数据
  60. const result = await response.json();
  61. console.log(result);
  62. // 3.响应处理
  63. if (result) {
  64. alert('登陆成功');
  65. //跳到首页
  66. location.href = 'index.php';
  67. } else {
  68. alert('登陆失败');
  69. location.href = 'login.php';
  70. btn.form.email.focus();
  71. }
  72. } else {
  73. alert('邮箱或密码不能为空');
  74. return false;
  75. }
  76. }
  77. </script>
  78. <!-- 页脚 -->
  79. <?php
  80. // 加载外部文件
  81. include 'template/public/footer.php';
  82. ?>

登陆验证页面:check.php

  1. <?php
  2. //开启会话
  3. session_start();
  4. // 1.导入用户数组
  5. require __DIR__ .'/../../config/common.php';
  6. $users = require DATA_PATH .'/users.php';
  7. // 2. 获取登录数据
  8. //json当成文本原始数据流来接收
  9. $json = file_get_contents('php://input');
  10. // 3. 将 json 转为 PHP数组(true:数组,不传:就是对象)
  11. $user = json_decode($json,true);
  12. // 4. 解析用户提交的数组,并预处理
  13. $email = $user['email'];
  14. $password = md5($user['password']);
  15. // 5. 验证用户数据(过滤)
  16. // 使用 use 将外外部的数据导入函数中使用
  17. $result = array_filter($users,function($user) use ($email,$password){
  18. return $user['email'] === $email && $user['password'] === $password;
  19. });
  20. //从数组尾部中弹出数据
  21. // print_r($result);
  22. // 6. 分析结果
  23. $prompt = false;
  24. if(count($result) === 1){
  25. $prompt = true;
  26. //登陆成功,将用户登陆信息写入会话
  27. $_SESSION['user'] = array_pop($result);
  28. }
  29. echo json_encode($prompt);
  30. ?>

2.用户注册

用户注册页面:register.php

  1. <?php
  2. // 加载外部文件
  3. include 'template/public/header.php';
  4. ?>
  5. <!-- 主体 -->
  6. <main>
  7. <!-- 用户登录 -->
  8. <form class="login" id="register">
  9. <table>
  10. <caption>
  11. 用户注册
  12. </caption>
  13. <tbody>
  14. <tr>
  15. <td><label for="nickname">昵称:</label></td>
  16. <td><input type="text" name="nickname" id="nickname" autofocus /></td>
  17. </tr>
  18. <tr>
  19. <td><label for="email">邮箱:</label></td>
  20. <td><input type="email" name="email" id="email" /></td>
  21. </tr>
  22. <tr>
  23. <td><label for="password">密码:</label></td>
  24. <td><input type="password" name="password" id="password" autocomplete="off" /></td>
  25. </tr>
  26. <tr>
  27. <td><label for="rePassword">确认:</label></td>
  28. <td><input type="password" name="rePassword" id="rePassword" autocomplete="off" /></td>
  29. </tr>
  30. <tr>
  31. <td colspan="2"><button type="button" onclick="addUser(this)">提交</button></td>
  32. </tr>
  33. </tbody>
  34. </table>
  35. </form>
  36. <p>
  37. <a href="login.php">已有帐号,请直接登录</a>
  38. </p>
  39. </main>
  40. <!-- 页脚 -->
  41. <?php
  42. // 加载外部文件
  43. include 'template/public/footer.php';
  44. ?>
  45. <script>
  46. function addUser(btn) {
  47. // 1. 获取用户输入
  48. const user = getInput(btn.form);
  49. // 2. 非空验证
  50. if (isEmpty(user)) {
  51. // 3. 验证二次密码是否相等
  52. if (isPswEqu(user)) {
  53. // 4. 创建提交的数据JSON
  54. const data = createDate(user);
  55. // 5. 异步提交
  56. insertUser(data);
  57. }
  58. }
  59. }
  60. // 1. 验证用户输入函数
  61. const getInput = (form) => {
  62. return {
  63. // 昵称
  64. nickname: {
  65. // dom元素
  66. ele: form.nickname,
  67. // 值
  68. value: form.nickname.value.trim()
  69. },
  70. // 邮箱
  71. email: {
  72. ele: form.email,
  73. value: form.email.value.trim()
  74. },
  75. // 密码
  76. password: {
  77. ele: form.password,
  78. value: form.password.value.trim()
  79. },
  80. // 重复密码
  81. rePassword: {
  82. ele: form.rePassword,
  83. value: form.rePassword.value.trim()
  84. },
  85. }
  86. }
  87. // 2. 非空验证函数
  88. const isEmpty = (user) => {
  89. switch (true) {
  90. case user.nickname.value.length === 0:
  91. alert('昵称不能为空');
  92. user.nickname.ele.focus();
  93. return false;
  94. case user.email.value.length === 0:
  95. alert('邮箱不能为空');
  96. user.email.ele.focus();
  97. return false;
  98. case user.password.value.length === 0:
  99. alert('密码不能为空');
  100. user.password.ele.focus();
  101. return false;
  102. case user.rePassword.value.length === 0:
  103. alert('重复密码不能为空');
  104. user.rePassword.ele.focus();
  105. return false;
  106. //必须要有默认返回
  107. default:
  108. return true;
  109. }
  110. }
  111. // 3. 密码一致性验证函数
  112. const isPswEqu = (user) => {
  113. if (user.password.value != user.rePassword.value) {
  114. alert('两次密码不一致');
  115. user.password.value.focus();
  116. return false;
  117. } else {
  118. // console.log('OK');
  119. return true;
  120. }
  121. }
  122. // 4. 提交数据
  123. const createDate = (user) => {
  124. return {
  125. nickname: user.nickname.value,
  126. email: user.email.value,
  127. password: user.password.value,
  128. }
  129. }
  130. // 5. 异步提交
  131. async function insertUser(data) {
  132. console.log(data);
  133. const url = 'lib/user/add_user.php';
  134. const response = await fetch(url, {
  135. method: 'POST',
  136. headers: {
  137. 'content-type': 'application/json;charset=utf-8'
  138. },
  139. body: JSON.stringify(data)
  140. })
  141. const result = await response.json();
  142. console.log(result);
  143. // 响应处理
  144. if (result) {
  145. alert('添加成功');
  146. //跳到首页
  147. location.href = 'index.php';
  148. } else {
  149. alert('添加失败');
  150. location.href = 'register.php';
  151. btn.form.email.focus();
  152. }
  153. }
  154. </script>

接收数据页面:add_user.php

  1. <?php
  2. //todo 用户注册
  3. // 1. 导入用户数组
  4. require __DIR__ . '/../../config/common.php';
  5. $users = require DATA_PATH . '/users.php';
  6. // 数组长度
  7. $oriCount = count($users);
  8. // 2. 接收数据,json
  9. $json = file_get_contents('php://input');
  10. // 3. json 转 数组
  11. $user = json_decode($json, true);
  12. // 4. 创建新用户
  13. // md5 + 加盐
  14. $user['password'] = md5($user['password'] . 'Z@7sU!k');
  15. $user['id'] = $oriCount + 1;
  16. // 5. 添加用户
  17. // print_r($user);
  18. $users[] = $user;
  19. // 6. 分析结果
  20. $prompt = false;
  21. if (count($users) === $oriCount + 1) {
  22. $prompt = true;
  23. }
  24. echo json_encode($prompt);

3. 用户退出

用户登陆状态展示:header.php

  1. <?php
  2. // 开启会话
  3. session_start();
  4. ?>
  5. <!-- 公共页眉 -->
  6. <!DOCTYPE html>
  7. <html lang="zh-CN">
  8. <head>
  9. <meta charset="UTF-8" />
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  12. <link rel="stylesheet" href="./static/css/style.css" />
  13. <title>login</title>
  14. </head>
  15. <body>
  16. <!-- 页眉 -->
  17. <header>
  18. <nav>
  19. <a href="index.php"><?= '首页' ?></a>
  20. <a href="news.php"><?= '新闻' ?></a>
  21. <a href="items.php">产品</a>
  22. <a href="contact.php">联系</a>
  23. <!-- 检测是否登陆 -->
  24. <?php if (!isset($_SESSION['user'])) : ?>
  25. <a href="login.php">登录</a>
  26. <?php else : ?>
  27. <!-- 退出要让用户确认 -->
  28. <a href="" onclick="logout(event)"><?= $_SESSION['user']['name'] ?>退出</a>
  29. <?php endif ?>
  30. </nav>
  31. </header>
  32. <script>
  33. //退出函数
  34. async function logout(ev) {
  35. //禁用默认行为
  36. ev.preventDefault();
  37. if (confirm('是否退出?')) {
  38. const url = './lib/user/logout.php';
  39. const response = await fetch(url);
  40. const result = await response.json();
  41. //响应处理
  42. if (result) {
  43. alert('退出成功');
  44. location.href = 'index.php';
  45. } else {
  46. alert('退出失败');
  47. location.href = 'login.php';
  48. btn.form.email.focus();
  49. }
  50. }
  51. }
  52. </script>

4.会话控制()

演示作用:实际,用户登陆验证成功后,就会写入SESSION

  1. <?php
  2. //开启session
  3. session_start();
  4. // 服务器 -> 会话ID -> 浏览器
  5. // 名称:SESSIONID: 值:b3XXXXXXXXXXXXXXXXX
  6. echo session_name() .'<br>';
  7. echo session_id() .'<br>';
  8. // session 在服务器中的路径
  9. echo session_save_path() .'<br>';
  10. // 设置session,使用超全局变量 $_SESSION
  11. // $_SESSION['name'] = 'admin';
  12. // $_SESSION['password'] = md5('888');
  13. $_SESSION['user']['name'] = 'admin';
  14. $_SESSION['user']['password'] = md5('888');
  15. // echo session_encode() . '<br>';
  16. // 销毁会话
  17. // 1. 清空内容,保留文件
  18. session_unset();
  19. // 2. 删除会话文件
  20. session_destroy();
批改老师:PHPzPHPz

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学