动态分页与composer演泽

动态分页与composer演泽

作业标题:0825作业
作业内容:请实例演绎以下作业: 1.做一个做动态分页? 2.composer自动加载机制你了解多少? 3.请使用composer安装三方验证码库完善你的登录页面?


  1. 做一个做动态分页?
    index1.php显示程序代码
  1. <?require 'pageData.php'?>
  2. <!DOCTYPE html>
  3. <html lang="en"></html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>数据显示</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <table>
  12. <caption>用户信息表</caption>
  13. <thead>
  14. <tr>
  15. <td>编号</td>
  16. <td>姓名</td>
  17. <td>性别</td>
  18. <td>创建时间</td>
  19. <td>操作</td>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. <?php foreach($users as $user):?>
  24. <tr>
  25. <td><?= $user['id']?></td>
  26. <td><?= $user['uname']?></td>
  27. <td><?= $user['gender']==1?'男':'女'?></td>
  28. <td><?= date("Y-m-d H:m:s",$user['create_time'])?></td>
  29. <td><button>删除</button><button>编辑</button></td>
  30. </tr>
  31. <?php endforeach;?>
  32. </tbody>
  33. </table>
  34. <!-- 动态分页 -->
  35. <!-- 生成动态分页条 -->
  36. <p>
  37. <?php $pre=$page-1;if($page!=1):?>
  38. <a href="?p=1">首页</a>
  39. <a href="?p=<?=$pre?>">上一页</a>
  40. <?endif?>
  41. <?php for ($i=1; $i <= $pages; $i++) :
  42. $active='active' ;
  43. // 生成一个动态的a href 属性的值
  44. $jump = sprintf('?p=%d',$i);
  45. $active = ($i==$page)?'active':null;
  46. ?>
  47. <a class="<?=$active?>" href="<?=$jump?>"><?=$i?></a>
  48. <?endfor?>
  49. <?php $next=$page+1;if($page!=$pages):?>
  50. <a href="?p=<?=$next?>">下一页</a>
  51. <a href="?p=<?=$pages?>">尾页</a>
  52. <?endif?>
  53. </p>
  54. </body>
  55. </html>

PageData.php数据库连接代码以及分页相关计算逻辑

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname=16','root','root',[PDO::ATTR_ERRMODE=> PDO::ERRMODE_WARNING,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]);
  3. //获取分页数据 :每页显示的数量 默认为3
  4. $num =3;
  5. //当前页码,默认为1
  6. $page = $_GET['p'] ?? 1;
  7. //计算每一页第一条记录的显示偏移量
  8. //偏移量 = (页码 -1) \* 每页的显示数量
  9. $offset = ($page - 1) * $num ;
  10. //获取分页数据
  11. $sql = " SELECT `id`,`uname`,`gender`,`create_time` FROM `user` ORDER BY `id` ASC LIMIT {$num} OFFSET {$offset} ";
  12. //$sql = "SELECT * FROM `user` LIMIT {$offset},{$num } ";
  13. $users = $pdo->query($sql)->fetchAll();
  14. // print_r($users);
  15. //获取总页数
  16. // $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `sum` FROM `user`";
  17. $sql = "SELECT COUNT(`id`) AS `sum` FROM `user`";
  18. $count = $pdo->query($sql)->fetch()['sum'];
  19. $pages = ceil($count/$num);
  20. // var_dump($pages);

示例演示图
分页


2.composer自动加载机制你了解多少?

  1. <?php
  2. // 1.
  3. // spl_autoload_register(function($className){
  4. // require $className .'.php';
  5. // });
  6. // 2. composer 类的自动加载机制
  7. /**
  8. * 1. 在项目的compose.json文件中添加autoload字段 files 可以加载任意位置的类文件
  9. * "files": [
  10. "app/controller/Login.php",
  11. "app/controller/User.php",
  12. "app/controller/Auth.php"
  13. ]
  14. 修改完成以后,每添加一个新的类文件,要追加绑定并且必须要执行composer dump-autoload命令才能生效
  15. */
  16. /**
  17. * 2. 在项目的compose.json文件中添加autoload字段 classmap 类映射 实现类的批量注册
  18. "classmap": [
  19. "app/controller"
  20. ]
  21. 修改完成以后,必须要执行composer dump-autoload命令才能生效
  22. */
  23. /**
  24. * 3. psr-4规范 :类的命名空间与类文件所在的目录进行绑定,并且类文件名称与类名称保持一致
  25. * 命名空间最后必须以“\”空间分隔符结束,这样以来在绑定的目录中添加新的类时 不必执行composer dump-autoload命令就能生效
  26. */
  27. require 'vendor/autoload.php';
  28. use app\controller\User;
  29. use app\controller\Login;
  30. use app\controller\Auth;
  31. use app\controller\Article;
  32. use extend\lib\Auth as libAuth;
  33. echo User::index();
  34. echo Login::index();
  35. echo Auth::index();
  36. echo Article::index();
  37. echo libAuth::index();
  1. {
  2. "name": "phpcn/login",
  3. "description": "a perfect login page with captcha",
  4. "type": "project",
  5. "require": {
  6. "almasaeed2010/adminlte": "3.0.5",
  7. "gregwar/captcha": "1.1.7"
  8. },
  9. "authors": [
  10. {
  11. "name": "imzchloe",
  12. "email": "952637517@qq.com"
  13. }
  14. ],
  15. "autoload": {
  16. "psr-4": {
  17. "app\\controller\\": "app/controller",
  18. "extend\\lib\\": "extend/lib"
  19. }
  20. }
  21. }

3.请使用composer安装三方验证码库完善你的登录页面?
login.php前端代码

  1. <?php
  2. // We need the session to check the phrase after submitting
  3. session_start();
  4. ?>
  5. <!DOCTYPE html>
  6. <html lang="zh-CN">
  7. <head>
  8. <meta charset="UTF-8">
  9. <title>登录</title>
  10. </head>
  11. <body>
  12. <h2>用户登录</h2>
  13. <table>
  14. <tr>
  15. <td>账户</td>
  16. <td><input type="text" name="username"></td>
  17. <td><span id="err_msg"></span></td>
  18. </tr>
  19. <tr>
  20. <td>密码</td>
  21. <td><input type="password" name="password"></td>
  22. </tr>
  23. </tr>
  24. <tr>
  25. <td>请输入验证码</td>
  26. <td><input type="text" name="phrase" /></td>
  27. <td><img src="session.php" onclick="this.src=this.src+'&k='+Math.random();"/></td>
  28. </tr>
  29. <tr align="center">
  30. <td colspan="2">
  31. <input type="button" id='btn' name="btn" value="确定">
  32. </td>
  33. </tr>
  34. </table>
  35. <script type="text/javascript" src="
  36. https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  37. <script>
  38. //const btn1=document.getElementsByName("btn");
  39. const btn1 = document.getElementById('btn');
  40. // alert(btn1);
  41. // btn1.addEventListener("click",function(){
  42. // alert("aaa");
  43. // });
  44. // btn1.addEventListener("click",function(){
  45. // alert("bbb");
  46. // });
  47. //登录
  48. btn1.addEventListener("click",function(){
  49. //alert("aaa");
  50. var data = {};
  51. data.username = $.trim($('input[name="username"]').val());
  52. data.password = $.trim($('input[name="password"]').val());
  53. data.phrase = $.trim($('input[name="phrase"]').val());
  54. data.type = 3;
  55. if(data.username == '' || data.password == '')
  56. {
  57. alert('用户名或者密码不能为空哦~');
  58. return;
  59. }
  60. $.post('3-doSubmit.php',data,function(res){
  61. console.log(res);
  62. if(res.status == 1)
  63. {
  64. alert(res.msg);
  65. top.location='5-index.php';
  66. }else{
  67. alert(res.msg);
  68. }
  69. },"json")
  70. })
  71. </script>
  72. </body>
  73. </html>

接收数据并处理3-doSubmit.php代码

  1. <?php
  2. namespace pdo_chloe;
  3. require 'common.php';
  4. // 接收数据
  5. // var_dump($_POST);
  6. $username = !empty($_POST['username']) && isset($_POST['username']) ? $_POST['username']:null;
  7. $password = !empty($_POST['password']) && isset($_POST['password']) ? md5($_POST['password']):null;
  8. $gender = !empty($_POST['gender']) && isset($_POST['gender']) ? intval($_POST['gender']):null;
  9. $phrase=(isset($_SESSION['phrase']) && $_SESSION['phrase'] === $_POST['phrase'])?$_POST['phrase']:null;
  10. $create_time = time();
  11. // //验证码
  12. // if (isset($_SESSION['phrase']) && $_SESSION['phrase'] === $_POST['phrase']) {
  13. // echo "<h1>Captcha is valid !</h1>";
  14. // } else {
  15. // echo "<h1>Captcha is not valid!</h1>";
  16. // }
  17. // // The phrase can't be used twice
  18. // unset($_SESSION['phrase']);
  19. //请求分发器 type 1 检查用户名重名 2注册 3 登录
  20. $type = isset($_POST['type'])&&!empty($_POST['type']) ? intval($_POST['type']):null;
  21. switch ($type) {
  22. case 1:
  23. $res = checkUname($username);
  24. if($res)
  25. {
  26. echo json_encode(['status'=>0,'msg'=>'用户名已被占用'],320);
  27. }else{
  28. echo json_encode(['status'=>1,'msg'=>'用户名合法'],320);
  29. }
  30. break;
  31. case 2:
  32. $flag = checkUname($username);
  33. if(!$flag){
  34. $res = insertData($username,$password,$gender,$create_time);
  35. if($res)
  36. {
  37. echo json_encode(['status'=>1,'msg'=>'注册成功'],320);
  38. exit;
  39. }
  40. echo json_encode(['status'=>0,'msg'=>'注册失败'],320);
  41. exit;
  42. }
  43. echo json_encode(['status'=>0,'msg'=>'请勿重复提交'],320);
  44. break;
  45. case 3:
  46. $res = login($username,$password);
  47. if ($res) {
  48. //echo json_encode(['status'=>1,'msg'=>'用户名密码正确'], 320);
  49. if ($phrase) {
  50. echo json_encode(['status'=>1,'msg'=>'验证成功'], 320);
  51. } else {
  52. echo json_encode(['status'=>0,'msg'=>'验证码错误'], 320);
  53. }
  54. }else{
  55. echo json_encode(['status'=>0,'msg'=>'用户名或密码错误'],320);
  56. }
  57. // if($phrase){
  58. // echo json_encode(['status'=>1,'msg'=>'验证正确'],320);exit;
  59. // }
  60. // echo json_encode(['status'=>0,'msg'=>'验证码错误'],320);
  61. break;
  62. default:
  63. # code...
  64. break;
  65. }

程序过滤验证代码common.php

  1. <?php
  2. session_start();
  3. //公共模型文件
  4. // 连接数据库
  5. require '1-connect.php';
  6. /**
  7. * 检测用户注册用户名是否被占用
  8. * param:用户名
  9. * return : 被占用返回true 未被占用返回false
  10. */
  11. function checkUname($username)
  12. {
  13. global $pdo;
  14. $isOccupied = false;//默认数据库中不存在同名用户名
  15. $sql = "SELECT `uname` FROM `user` WHERE `uname`='{$username}'";
  16. $res = $pdo->query($sql)->fetch();
  17. // 已存在同名昵称
  18. if($res)
  19. {
  20. $isOccupied = true;
  21. }
  22. return $isOccupied;
  23. }
  24. /**
  25. * param:用户注册 用户名 密码 性别 创建时间
  26. * return : 注册成功返回true 失败返回false
  27. */
  28. function insertData($username,$password,$gender,$create_time)
  29. {
  30. global $pdo;
  31. $flag = false;
  32. if( !empty($username) && !empty($password) && !empty($gender)){
  33. $sql = "INSERT INTO `user` SET `uname` = '{$username}', `pwd`='{$password}', `gender` = {$gender},`create_time`={$create_time};";
  34. $res = $pdo->exec($sql);
  35. if($res)
  36. {
  37. $flag = true;
  38. }
  39. }
  40. return $flag;
  41. }
  42. /**
  43. * param:用户登录 用户名 密码
  44. * return : 登录成功返回true 失败返回false
  45. */
  46. function login($username,$password)
  47. {
  48. global $pdo;
  49. $flag = false;
  50. if(!empty($username) && !empty($password))
  51. {
  52. // 可以把它看作是想要运行的 SQL 的一种编译过的模板
  53. // 使用问号参数占位符来构成预处理语句
  54. $sql = "SELECT `uname`,`pwd` FROM `user` WHERE `uname`= ? AND `pwd`= ?";
  55. // $sql = "SELECT `uname`,`pwd` FROM `user` WHERE `id`> 0 ";
  56. // echo $sql;
  57. // PDO::prepare — 准备要执行的语句,并返回语句对象
  58. $stmt = $pdo->prepare($sql);
  59. // 绑定一个PHP变量到用作预处理的SQL语句中的对应问号占位符,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值。
  60. // $stmt->bindParam(1,$username,PDO::PARAM_STR);
  61. // $stmt->bindParam(2,$password,PDO::PARAM_STR);
  62. // 执行一条预处理语句 成功时返回 true, 或者在失败时返回 false。
  63. // $username = 'admin';
  64. $stmt->execute([$username,$password]);
  65. $res = $stmt->fetch();
  66. // var_dump($res);
  67. if($res)
  68. {
  69. $_SESSION['uname'] = $res['uname'];
  70. $flag = true;
  71. }
  72. // var_dump($stmt);//object(PDOStatement)
  73. // foreach($stmt as $v)
  74. // {
  75. // print_r($v);
  76. // }
  77. // die;
  78. }
  79. return $flag;
  80. }

数据库连接代码 1-connect.php

  1. <?php
  2. namespace connect_chloe;
  3. use PDO;
  4. $config = require __DIR__ .'\\config\\database.php';
  5. extract($config);
  6. // dsn data source name 包括pDO驱动名称 主机名 端口号 数据库名称
  7. $dsn = sprintf('%s:host=%s;port=%d;dbname=%s',$type,$host,$port,$dbname);
  8. try {
  9. $pdo = new PDO($dsn,$username,$password,[PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING]);
  10. // var_dump($pdo);
  11. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
  12. } catch (\Exception $e) {
  13. die('Connection error : ' . $e->getMessage());
  14. }

第三方验证码session.php代码

  1. <?php
  2. // We need the session to store the correct phrase for later check
  3. session_start();
  4. // Including the autoload (you need to composer install in the main directory)
  5. require_once __DIR__.'/../vendor/autoload.php';
  6. use Gregwar\Captcha\CaptchaBuilder;
  7. // Creating the captcha instance and setting the phrase in the session to store
  8. // it for check when the form is submitted
  9. $captcha = new CaptchaBuilder;
  10. $_SESSION['phrase'] = $captcha->getPhrase();
  11. // Setting the header to image jpeg because we here render an image
  12. header('Content-Type: image/jpeg');
  13. // Running the actual rendering of the captcha image
  14. $captcha
  15. ->build()
  16. ->output()
  17. ;

实例图
验证码
验证成功