Blogger Information
Blog 52
fans 0
comment 3
visits 42289
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php学习:第18章 会话控制与实战
王小飞
Original
673 people have browsed it

1.1首页代码

  1. <?php
  2. // 判断_COOKIE里面有没有user 有的话 unserialize反序列化
  3. if (isset($_COOKIE['user'])) $user = unserialize($_COOKIE['user']);
  4. ?>
  5. <!DOCTYPE html>
  6. <html lang="en">
  7. <head>
  8. <meta charset="UTF-8">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>首页</title>
  11. </head>
  12. <style>
  13. nav {
  14. height: 40px;
  15. background-color: deepskyblue;
  16. padding: 0 20px;
  17. display: flex;
  18. justify-content: space-between;
  19. align-items: center;
  20. }
  21. nav > a {
  22. /* 更改颜色 */
  23. color: white;
  24. /* 去掉下划线 */
  25. text-decoration: none;
  26. }
  27. </style>
  28. <body>
  29. <nav>
  30. <a href="index.php">个人中心</a>
  31. <!-- if 判断是有有user这个变量 有表示已登录 那就显示退出 -->
  32. <?php if (isset($user)) : ?>
  33. <a href="" id="logout">
  34. <span style="color:red"><?php echo $user['name'] ?> </span>
  35. <span style="color:2604e6">邮箱:<?php echo $user['email'] ?></span>&nbsp;&nbsp;退出
  36. </a>
  37. <?php else: ?>
  38. <!-- 如果没有user 就是没有登录 下面显示登录 -->
  39. <a href="login.php">登录</a>
  40. <?php endif ?>
  41. <a href="register.php">注册</a>
  42. </nav>
  43. </body>
  44. <script>
  45. // 为退出按钮创建事件监听器
  46. document.querySelector('#logout').addEventListener('click', function(event) {
  47. if (confirm('是否退出')) {
  48. // 禁用默认行为, 其实就是禁用原<a>标签的点击跳转行为,使用事件中的自定义方法处理
  49. event.preventDefault();
  50. // 跳转到退出事件处理器
  51. window.location.assign('handle.php?action=logout');
  52. }
  53. });
  54. </script>
  55. </html>

1.2控制台代码

  1. <?php
  2. // 查询用户表中的数据 new PDO连接数据库
  3. $pdo = new PDO('mysql:host=localhost;dbname=wxf', 'root', '123456');
  4. // 查询范围*代表全部 users代表要查询的表
  5. $stmt = $pdo->prepare('SELECT * FROM `users`');
  6. // 执行上面的语句 执行完毕后为得到数据
  7. $stmt->execute();
  8. // 这里拿到数据并放到变量users里面 fetchAll多条查询 FETCH_ASSOC只查询关联的
  9. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  10. // 处理用户登录与注册
  11. // $action = $_GET['action'];
  12. // 使用变量过滤器
  13. $action = filter_input(INPUT_GET, 'action');
  14. // switch 判断 strtolower全部转为小写
  15. switch ( strtolower($action)) {
  16. // case如果 登录
  17. case 'login':
  18. // 判断请求是否合法 $_SERVER['REQUEST_METHOD'] 当前请求是那种方式
  19. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  20. //如果请求正确 那么现在获取需要验证的数据
  21. $email = $_POST['email'];
  22. $password = sha1($_POST['password']);
  23. // array_filter过滤数组 $users 相对应 $user , use 把外部变量$email, $password拿过来
  24. $results = array_filter($users, function($user) use ($email, $password) {
  25. // 判断用户提交的 是否和数据库中的账户密码一致
  26. return $user['email'] === $email && $user['password'] === $password;
  27. });
  28. // 判断 $results 返回的结果集 如果是1 代表验证通过
  29. if (count($results) === 1) {
  30. // serialize序列化客户数据
  31. setcookie('user', serialize(array_pop($results)));
  32. // exit终止操作 通过提示通过
  33. exit('<script>alert("登录成功");location.href="index.php"</script>');
  34. }
  35. // else 没通过 显示账户错误并返回登录界面
  36. else {
  37. exit('<script>alert("邮箱或密码错误,或者还没有帐号");location.href="login.php";</script>');
  38. }
  39. } else {
  40. die('请求类型错误');
  41. }
  42. break;
  43. // 退出
  44. case 'logout':
  45. if (isset($_COOKIE['user'])) {
  46. setcookie('user', null , time()-3600);
  47. exit('<script>alert("退出成功");location.assign("index.php")</script>');
  48. }
  49. break;
  50. // 注册
  51. case 'register':
  52. // 1. 获取到所有新用户数据
  53. $name = $_POST['name'];
  54. $email = $_POST['email'];
  55. $password = sha1($_POST['p1']);
  56. $register_time = time();
  57. // 2. 将新用户插入到表中
  58. $sql = "INSERT `users` SET `name`='{$name}', `email`='{$email}', `password`='{$password}', `register_time`={$register_time}";
  59. // 获取到sql语句
  60. $stmt = $pdo->prepare($sql);
  61. // 执行sql语句
  62. $stmt->execute();
  63. // 判断是否成功
  64. if ($stmt->rowCount() === 1) exit('<script>alert("注册成功");location.assign("login.php")</script>');
  65. else exit('<script>alert("注册失败");location.assign("login.php")</script>');
  66. break;
  67. // 未定义
  68. default:
  69. exit('未定义操作');
  70. }

1.3登录页代码

  1. <?php
  2. // 判断是否已登录
  3. if (isset($_COOKIE['user']))
  4. exit('<script>alert("请不要重复登录");location.href="index.php";</script>');
  5. ?>
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  11. <link rel="stylesheet" type="text/css" href="../css/style.css">
  12. <title>用户登录</title>
  13. </head>
  14. <body>
  15. <!-- 只需要验证用户的邮箱和密码就可以 -->
  16. <h3>用户登录</h3>
  17. <form action="handle.php?action=login" method="post">
  18. <div>
  19. <label for="email">邮箱:</label>
  20. <input type="email" name="email" id="email" placeholder="demo@email.com" require autofocus>
  21. </div>
  22. <div>
  23. <label for="password">密码:</label>
  24. <input type="password" name="password" id="password" placeholder="不少于6位" required>
  25. </div>
  26. <div>
  27. <button>提交</button>
  28. </div>
  29. </form>
  30. <a href="register.php">还没有帐号, 注册一个吧</a>
  31. </body>
  32. </html>

1.4注册页代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <link rel="stylesheet" type="text/css" href="../css/style.css">
  7. <title>注册用户</title>
  8. </head>
  9. <body>
  10. <h3>用户注册</h3>
  11. <!-- action="handle.php?action=register" 代表要提交的地方 register 代表注册 -->
  12. <form action="handle.php?action=register" method="post" onsubmit="return compare()">
  13. <div>
  14. <label for="name">呢称:</label>
  15. <input type="text" name="name" id="name" placeholder="不少于3个字符" required autofocus>
  16. </div>
  17. <div>
  18. <label for="email">邮箱:</label>
  19. <input type="email" name="email" id="email" placeholder="demo@email.com" required>
  20. </div>
  21. <div>
  22. <label for="p1">密码:</label>
  23. <input type="password" name="p1" id="p1" placeholder="不少于6位" required>
  24. </div>
  25. <div>
  26. <label for="p2">重复:</label>
  27. <input type="password" name="p2" id="p2" placeholder="必须与上面一致" required>
  28. </div>
  29. <div>
  30. <button>提交</button><span id="tips" style="color: red"></span>
  31. </div>
  32. </form>
  33. <a href="login.php">我有帐号,直接登录</a>
  34. <script>
  35. // 验证二次密码是否相等?
  36. function compare() {
  37. if (document.forms[0].p1.value.trim() !== document.forms[0].p2.value.trim()) {
  38. document.querySelector('#tips').innerText = '二次密码不相等';
  39. return false;
  40. }
  41. }
  42. </script>
  43. </body>
  44. </html>

2.session方式登录

2.1 首页代码

  1. <?php
  2. // 开启会话
  3. session_start();
  4. // 判断_COOKIE里面有没有user 有的话 unserialize反序列化
  5. if (isset($_SESSION['user'])) $user = unserialize($_SESSION['user']);
  6. ?>
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta charset="UTF-8">
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12. <title><?php if (isset($user)) : ?>个人中心 - 已经登录<?php else: ?>个人中心 - 未登录<?php endif ?></title>
  13. </head>
  14. <style>
  15. nav {
  16. height: 40px;
  17. background-color: deepskyblue;
  18. padding: 0 20px;
  19. display: flex;
  20. justify-content: space-between;
  21. align-items: center;
  22. }
  23. nav > a {
  24. /* 更改颜色 */
  25. color: white;
  26. /* 去掉下划线 */
  27. text-decoration: none;
  28. }
  29. </style>
  30. <body>
  31. <nav>
  32. <a href="index.php">个人中心</a>
  33. <!-- if 判断是有有user这个变量 有表示已登录 那就显示退出 -->
  34. <?php if (isset($user)) : ?>
  35. <a href="" id="logout">
  36. <span style="color:red"><?php echo $user['name'] ?> </span>
  37. <span style="color:2604e6">邮箱:<?php echo $user['email'] ?></span>&nbsp;&nbsp;退出
  38. </a>
  39. <?php else: ?>
  40. <!-- 如果没有user 就是没有登录 下面显示登录 -->
  41. <a href="login.php">登录</a>
  42. <?php endif ?>
  43. <a href="register.php">注册</a>
  44. </nav>
  45. </body>
  46. <script>
  47. // 为退出按钮创建事件监听器
  48. document.querySelector('#logout').addEventListener('click', function(event) {
  49. if (confirm('是否退出')) {
  50. // 禁用默认行为, 其实就是禁用原<a>标签的点击跳转行为,使用事件中的自定义方法处理
  51. event.preventDefault();
  52. // 跳转到退出事件处理器
  53. window.location.assign('handle.php?action=logout');
  54. }
  55. });
  56. </script>
  57. </html>

2.2控制台代码

  1. <?php
  2. // 开启会话
  3. session_start();
  4. // 查询用户表中的数据 new PDO连接数据库
  5. $pdo = new PDO('mysql:host=localhost;dbname=wxf', 'root', '123456');
  6. // 查询范围*代表全部 users代表要查询的表
  7. $stmt = $pdo->prepare('SELECT * FROM `users`');
  8. // 执行上面的语句 执行完毕后为得到数据
  9. $stmt->execute();
  10. // 这里拿到数据并放到变量users里面 fetchAll多条查询 FETCH_ASSOC只查询关联的
  11. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  12. // 处理用户登录与注册
  13. // $action = $_GET['action'];
  14. // 使用变量过滤器
  15. $action = filter_input(INPUT_GET, 'action');
  16. // switch 判断 strtolower全部转为小写
  17. switch ( strtolower($action)) {
  18. // case如果 登录
  19. case 'login':
  20. // 判断请求是否合法 $_SERVER['REQUEST_METHOD'] 当前请求是那种方式
  21. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  22. //如果请求正确 那么现在获取需要验证的数据
  23. $email = $_POST['email'];
  24. $password = sha1($_POST['password']);
  25. // array_filter过滤数组 $users 相对应 $user , use 把外部变量$email, $password拿过来
  26. $results = array_filter($users, function($user) use ($email, $password) {
  27. // 判断用户提交的 是否和数据库中的账户密码一致
  28. return $user['email'] === $email && $user['password'] === $password;
  29. });
  30. // 判断 $results 返回的结果集 如果是1 代表验证通过
  31. if (count($results) === 1) {
  32. // serialize序列化客户数据
  33. $_SESSION['user'] = serialize(array_pop($results));
  34. // exit终止操作 通过提示通过
  35. exit('<script>alert("登录成功");location.href="index.php"</script>');
  36. }
  37. // else 没通过 显示账户错误并返回登录界面
  38. else {
  39. exit('<script>alert("邮箱或密码错误,或者还没有帐号");location.href="login.php";</script>');
  40. }
  41. } else {
  42. die('请求类型错误');
  43. }
  44. break;
  45. // 退出
  46. case 'logout':
  47. if (isset($_SESSION['user'])) {
  48. session_destroy();
  49. exit('<script>alert("退出成功");location.assign("index.php")</script>');
  50. }
  51. break;
  52. // 注册
  53. case 'register':
  54. // 1. 获取到所有新用户数据
  55. $name = $_POST['name'];
  56. $email = $_POST['email'];
  57. $password = sha1($_POST['p1']);
  58. $register_time = time();
  59. // 2. 将新用户插入到表中
  60. $sql = "INSERT `users` SET `name`='{$name}', `email`='{$email}', `password`='{$password}', `register_time`={$register_time}";
  61. // 获取到sql语句
  62. $stmt = $pdo->prepare($sql);
  63. // 执行sql语句
  64. $stmt->execute();
  65. // 判断是否成功
  66. if ($stmt->rowCount() === 1) exit('<script>alert("注册成功");location.assign("login.php")</script>');
  67. else exit('<script>alert("注册失败");location.assign("login.php")</script>');
  68. break;
  69. // 未定义
  70. default:
  71. exit('未定义操作');
  72. }

2.3登录页代码

  1. <?php
  2. // 开启会话
  3. session_start();
  4. // 判断是否已登录
  5. if (isset($_SESSION['user']))
  6. exit('<script>alert("请不要重复登录");location.href="index.php";</script>');
  7. ?>
  8. <!DOCTYPE html>
  9. <html lang="en">
  10. <head>
  11. <meta charset="UTF-8">
  12. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  13. <link rel="stylesheet" type="text/css" href="../css/style.css">
  14. <title>用户登录</title>
  15. </head>
  16. <body>
  17. <!-- 只需要验证用户的邮箱和密码就可以 -->
  18. <h3>用户登录</h3>
  19. <form action="handle.php?action=login" method="post">
  20. <div>
  21. <label for="email">邮箱:</label>
  22. <input type="email" name="email" id="email" placeholder="demo@email.com" require autofocus>
  23. </div>
  24. <div>
  25. <label for="password">密码:</label>
  26. <input type="password" name="password" id="password" placeholder="不少于6位" required>
  27. </div>
  28. <div>
  29. <button>提交</button>
  30. </div>
  31. </form>
  32. <a href="register.php">还没有帐号, 注册一个吧</a>
  33. </body>
  34. </html>

2.4 注册页代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <link rel="stylesheet" type="text/css" href="../css/style.css">
  7. <title>注册用户</title>
  8. </head>
  9. <body>
  10. <h3>用户注册</h3>
  11. <!-- action="handle.php?action=register" 代表要提交的地方 register 代表注册 -->
  12. <form action="handle.php?action=register" method="post" onsubmit="return compare()">
  13. <div>
  14. <label for="name">呢称:</label>
  15. <input type="text" name="name" id="name" placeholder="不少于3个字符" required autofocus>
  16. </div>
  17. <div>
  18. <label for="email">邮箱:</label>
  19. <input type="email" name="email" id="email" placeholder="demo@email.com" required>
  20. </div>
  21. <div>
  22. <label for="p1">密码:</label>
  23. <input type="password" name="p1" id="p1" placeholder="不少于6位" required>
  24. </div>
  25. <div>
  26. <label for="p2">重复:</label>
  27. <input type="password" name="p2" id="p2" placeholder="必须与上面一致" required>
  28. </div>
  29. <div>
  30. <button>提交</button><span id="tips" style="color: red"></span>
  31. </div>
  32. </form>
  33. <a href="login.php">我有帐号,直接登录</a>
  34. <script>
  35. // 验证二次密码是否相等?
  36. function compare() {
  37. if (document.forms[0].p1.value.trim() !== document.forms[0].p2.value.trim()) {
  38. document.querySelector('#tips').innerText = '二次密码不相等';
  39. return false;
  40. }
  41. }
  42. </script>
  43. </body>
  44. </html>

总结:是否登录用cookie里面有没有user检测,页面有无访问权限和一些已登录和未登录显示不一样的内容都可以用此方法。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:如果让我面试程序员, 一个用户登录验证与注册, 就基本够用了, 因为这个真的不简单, 太多细节
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post