小小的分页

      分页在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,可以直接拿来用,方便、强大且样式可定义得更美观,还考虑到了如果有上千条数据这样的情况,当然就不能把每一页的链接都放在表格下面的了。

 

posted @ 2015-01-18 16:43  lazycat-cz  阅读(861)  评论(2编辑  收藏  举报