zoukankan      html  css  js  c++  java
  • 小小的分页

          分页在PHP中经常用到,当前端在页面上请求需要数目的数据时,就可以通过sql语句控制偏移量的方式,返回指定条数的记录。

          如果不考虑前端展示效果,归根结底就是控制好sql语句中 limit m, n 的m和n的数值大小,避免出现一些bug。

          分页的两个核心变量是:第几页,每页多少条数据。特殊情况在最后一页时,可能没有指定条数的数据。比如现在需要第page页的count条数据,对于表数据来说,这一页的前面有(page-1)xcount条记录,sql语句中的limit偏移量就是 **** limit (page-1)*count, count。语句是这样,但是可能查出来的实际数据没有count条,所以前端展示时又需要按照实际条数来展示。

          要获得第几页多少条,就要知道这两个变量的值,可以使用get或post传过来,当页面第一次载入或者给的数值不合理时,可以赋一个默认值。获取这两个变量时可以直接用超全局数组来得到,当然也可以用filter_input函数来得到,还可以对数据进行一些验证和过滤。

        // 参数获取,使用GET或POST
        function getParam($name, $type = INPUT_REQUEST){
            if($type == INPUT_REQUEST){
              $val = filter_input(INPUT_GET, $name);  // 简单过滤,可以设置更详细的过滤方式
              if($val == null || $val === false){
                $val = filter_input(INPUT_POST, $name);
                  return ($val == null || $val === false) ? null : $val;
              }
              else{
                  return $val;
              }
            }
            else{
                $val = filter_input($type, $name);
                return ($val == null || $val === false) ? null : $val;
            }
        }

         得到了page和count后,查询获取数据

      // 获取数据
      function getData(){
        try{
          $dsn = 'mysql:dbname='.DB_NAME.';host='.HOST;
          $pdo = new PDO($dsn, USER, PASS);
                
          $count = getParam('count');  // 每页数目
          $page = getParam('page');  // 第几页
          $count = ($count == null || $count <= 0) ? 10 : $count; 
          $page = ($page == null || $page <= 0) ? 1 : $page;  
                
          $sql1 = 'select count(*) as total from info';
          $stmt = $pdo->query($sql1);
          $ret = $stmt->fetch(PDO::FETCH_ASSOC);
          $total_count = $ret['total'];  // 表中总数据条数
          $count = $count > $total_count ? $total_count : $count; // 如果指定那每页展示条数大于总数据条数
          $total_page = (int)ceil($total_count/$count);  // 总的页数
          $page = $page > $total_page ? $total_page : $page;  // 如果指定页大于总页数
                
          $sql2 = sprintf('select * from info limit %s, %s', ($page-1)*$count, $count);
                
          $query = $pdo->query($sql2);
          $ret = $query->fetchAll(PDO::FETCH_ASSOC);
          $item_num = count($ret);  // 实际查到的数据条数
                  
          include 'show.php';      // 加载数据展示页
        }
        catch(PDOException $e){
          echo 'error: '.$e->getMessage().'<br/>';
          return array();
        }
      }

          还得做个展示数据的页面,展示时,页面上显示如1、2、3、等第几页,它们实际也是链接,点击时传入分页需要的变量,然后脚本查询到数据送过来,主要部分的代码 

    <body>
            <div class="main" >
                <table >
                    <caption><h3>员工信息</h3></caption>
                    <tr>
                        <th>ID</th><th>姓名</th><th>部门</th><th>年龄</th>
                    </tr>
                    <?php 
                       for($i=0; $i<$item_num; $i++){
                           if($i%2 == 0){
                               echo "<tr class='back'><td>{$ret[$i]['id']}</td><td>{$ret[$i]['name']}</td><td>{$ret[$i]['dep']}</td><td>{$ret[$i]['age']}</td></tr>";
                           }
                           else{
                               echo "<tr><td>{$ret[$i]['id']}</td><td>{$ret[$i]['name']}</td><td>{$ret[$i]['dep']}</td><td>{$ret[$i]['age']}</td></tr>";
                           }
                       }
                    ?>
                </table>
                <div class="lnk">
                <ul>
                    <li><a href='<?php echo "get.php?page=1&count={$count}"?>'>首页</a></li>
                    <li><a href='<?php $pre=$page-1; $pre=($pre==0)?1:$pre; echo "get.php?page={$pre}&count={$count}"?>'>上一页</a></li>
                <?php
                    for($i=1; $i<=$total_page; $i++){
                        echo "<li><a href='get.php?page={$i}&count={$count}'>{$i}</a></li>&nbsp;&nbsp;";
                    }
                ?>
                    <li><a href='<?php $post=$page+1; $post=($post==$total_page)?$total_page:$post; echo "get.php?page={$post}&count={$count}"?>'>下一页</a></li>
                    <li><a href='<?php echo "get.php?page={$total_page}&count={$count}"?>'>尾页</a></li>
                <ul>
                <div>
            </div>
        </body>

           载入展示页效果

          

           简单做个样式,默认载入时实际上是在访问http://localhost/page/get.php?page=1&count=10,给了默认值。点击尾页,可以看到地址栏显示page和count参数

           

          要注意最后一页记录数不足的情况。当然在某些框架中已经做好了分页类,如CI,可以直接拿来用,方便、强大且样式可定义得更美观,还考虑到了如果有上千条数据这样的情况,当然就不能把每一页的链接都放在表格下面的了。

  • 相关阅读:
    特征词选择算法对文本分类准确率的影响(前言)
    答火星人.NET。如何使用我的本科毕业程序 正文提取DEMO
    有关matlab画图格式的部分代码
    文本分类中的特征词选择算法系列科普(前言AND 一)
    c++杂项备忘
    写一点应用关于 Lucene.Net,snowball的重新组装(一)在Lucene.Net中加入词性标注与词根还原功能
    C++字符串处理:批量去重,以及大写变小写
    Python打印到文件
    中文分词:采用二元词图以及viterbi算法(三)
    博客园和百度空间,我的两个家
  • 原文地址:https://www.cnblogs.com/lazycat-cz/p/4231297.html
Copyright © 2011-2022 走看看