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