博客列表 >使用Cookie和PDO实现用户登陆退出案例-7月17日作业

使用Cookie和PDO实现用户登陆退出案例-7月17日作业

知行合一
知行合一原创
2020年08月14日 10:56:51932浏览

演示效果如下

数据库截图如下

通用文件datebase.php代码如下

  1. <?php
  2. define('DB_HOST','localhost');
  3. define('DB_USER','phpcnyizhi');
  4. define('DB_PWD','phpcnyizhi');
  5. define('DB_NAME','phpcnyizhi');
  6. define('DB_PORT','3306');
  7. define('DB_TYPE','mysql');
  8. define('DB_CHARSET','utf8');
  9. define('DB_DSN',DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET.";port=".DB_PORT);
  10. //定义PDO的DSN,数据源名,包括主机名,端口号和数据库名。
  11. ?>

登陆页面login.php代码如下

  1. <?php
  2. if ($_GET["action"] == "logout"){
  3. setcookie("username","",time()-3600);
  4. setcookie("auth","",time()-3600);
  5. exit(
  6. " <script>
  7. alert('退出成功');
  8. location.href='login.php';
  9. </script>
  10. "
  11. );
  12. }
  13. if(isset($_COOKIE['username']) && $_COOKIE['auth']){
  14. exit(
  15. "
  16. <script>
  17. alert('您已经登陆');
  18. location.href='index.php';
  19. </script>
  20. "
  21. );
  22. }
  23. ?>
  24. <style>
  25. form{border: 1px solid #ccc; width: 300px; margin: 20px auto; text-align: center;}
  26. label{display: block; margin: 20px 0;}
  27. </style>
  28. <form action="check.php" method="post">
  29. <label>用户名:<input type="text" name="username" placeholder="请输入用户名" require></label>
  30. <label>密码:<input type="password" name="password" placeholder="请输入密码" require</label>
  31. <label>七天自动登陆:<input type="checkbox" name="autologin" value="1"></label>
  32. <label><input type="submit" name="submit"></label>
  33. </form>

检测页面check.php代码

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. $username=$_POST['username'];
  4. $password=md5($_POST['password']);
  5. $autologin=$_POST['autologin'];
  6. require('datebase.php');
  7. try{
  8. //数据库连接,得到一个PDO对象 不要把所有的代码写须Try中,非常消耗性能。
  9. $pdo=new pdo(DB_DSN,DB_USER,DB_PWD,[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING,]);
  10. }
  11. //捕捉特定于数据库信息的PDOException异常
  12. catch(PDOException $e){
  13. echo $e->getMessage();
  14. }
  15. //捕捉拥有Throwable接口的错误或者其它异常
  16. catch(Throwable $e){
  17. echo $e->getMessage();
  18. }
  19. $sql="SELECT `username`,`password`,`id` FROM `yizhi_user` WHERE `username`=? AND `password`=?";
  20. $stmt=$pdo->prepare($sql);
  21. $stmt->bindParam(1,$username);
  22. $stmt->bindParam(2,$password);
  23. $stmt->execute();
  24. $res=$stmt->fetch(PDO::FETCH_ASSOC);
  25. if($stmt->rowCount()==1){
  26. //新登陆的时候,把其它用户Cookies信息删除了
  27. setcookie("username","",time()-3600);
  28. setcookie("auth","",time()-3600);
  29. //选择了记住密码
  30. if(!empty($autologin)){
  31. setcookie("username",$username,strtotime("+7 days"));
  32. $salt="yizhi"; //加混淆符号
  33. $auth=md5($username.$password.$salt).','.$res['id'];
  34. setcookie("auth",$auth,strtotime("+7 days"));
  35. }
  36. else{
  37. setcookie("username",$username);
  38. $salt="yizhi"; //加混淆符号
  39. $auth=md5($username.$password.$salt).','.$res['id'];
  40. setcookie("auth",$auth);
  41. }
  42. exit("
  43. <script>
  44. alert('登陆成功');
  45. location.href='index.php';
  46. </script>
  47. ");
  48. }
  49. else{
  50. exit("
  51. <script>
  52. alert('用户名或者密码错误');
  53. location.href='login.php';
  54. </script>
  55. ");
  56. }
  57. ?>

首页代码index.php代码如下

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. require('datebase.php');
  4. try{
  5. $pdo=new pdo(DB_DSN,DB_USER,DB_PWD,[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING,]);
  6. }
  7. //捕捉特定于数据库信息的PDOException异常
  8. catch(PDOException $e){
  9. echo $e->getMessage();
  10. }
  11. //捕捉拥有Throwable接口的错误或者其它异常
  12. catch(Throwable $e){
  13. echo $e->getMessage();
  14. }
  15. //从Cookie中取出auth
  16. $auth=$_COOKIE['auth'];
  17. $res=explode(',',$auth);
  18. $id=end($res) ;
  19. $auth_rel=$res[0];
  20. $sql="SELECT `username`,`password`,`id` FROM `yizhi_user` WHERE `id`=?";
  21. $stmt=$pdo->prepare($sql);
  22. $stmt->bindParam(1,$id);
  23. $stmt->execute();
  24. $res=$stmt->fetch(PDO::FETCH_ASSOC);
  25. if($stmt->rowCount()==1){
  26. $username=$res['username'];
  27. $password=$res['password'];
  28. $salt="yizhi";
  29. $auth=md5($username.$password.$salt);
  30. if($auth!==$auth_rel){
  31. exit("
  32. <script>
  33. alert('请重新登陆');
  34. location.href='login.php';
  35. </script>
  36. ");
  37. }
  38. }
  39. else{
  40. exit("
  41. <script>
  42. alert('请重新登陆');
  43. location.href='login.php';
  44. </script>
  45. ");
  46. }
  47. ?>
  48. 欢迎你,<?php echo $_COOKIE['username']?>登陆成功。<br>
  49. <a href="login.php?action=logout">退出登陆</a>

问老师三个问题

问题1.

  • empty 如果 变量的值是空或零,则 empty() 返回 true,非空和非零返回False。empty() 5.5 版本之后支持表达式了,而不仅仅是变量
  • is_null 检测【值,变量,表达式】是否是空,如果为空返回TRue。
  • isset 判断一个变量是否被设置(声明).
    上面在从网上搜索得到的结论。
    问题:Empty和is_null都是判断是否为空,有啥区别?

问题2.

  • 如果要判断一个变量是否被设置(声明),使用isset
  • 如果要判断一个变量赋值并且不为空,使用empty
  • 如果要判断一个变量被设置并且不为空,可以先使用isset,然后使用empty

    问题:上面的说法,是否正确?


问题3

问题:if($a) 相当于那个函数的功能?


麻烦老师依次回答这三个问题,非常感谢!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议