thinkPHP统计排行与分页显示功能示例

时间:2022-09-25 13:25:06

本文实例分析了thinkphp统计排行与分页显示功能。分享给大家供大家参考,具体如下:

1.分页参数

 

count 总数
firstrow 起始行
listrows 每一次获取记录数
list 每一页的记录(要与count对应一致就行)

 

2.分页对象

可以针对真实的数据表
也可以针对统计出来的数据表,或者说是虚拟的表
因为limit是最后执行的,哪怕你进行group操作,哪怕你进行子查询

html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<include file="public:head" title="" />
<style type="text/css">
.top {
  font-size: 18px;
  border-bottom: #ddd 1px solid;
  margin-bottom: -1px;
  font-weight: bold;
}
.top .title {
  margin:10px;
  border:1px solid #ef6c00;
  display:-webkit-box;
  border-radius: 3px;
}
.top .title .title_child {
  width: 50%;
  line-height:40px;
  -webkit-box-flex:1;
  display:block;
  color:#ef6c00;
  text-decoration:none;
}
.top .title .title_child.active {
  color:#fff;
  background:#ef6c00;
}
.page{
  margin-right: 10px;
}
.ranknum{
  font-weight: bold;
  color:#f92672;
}
#myrank{
  color: #fff;
  font-weight:bold;
  background-color: #fbc853;
}
</style>
<script type="text/javascript">
</script>
<body>
<div class="top text-center">
  <div class="title">
    <a class="title_child <if condition='$type neq 1'>active</if>" href="{sh::u('user/ranklist', array('type' => 0))}">月排行</a>
    <a class="title_child <if condition='$type eq 1'>active</if>" href="{sh::u('user/ranklist', array('type' => 1))}">总排行</a>
  </div>
</div>
<div id="myrank" class="alert alert-danger text-center">
  我的商户数:{sh:$my_user_count}    当前排名: {sh:$my_rank}
</div>
<div id="datalist">
<table class="table table-hover">
   <thead>
    <tr>
     <th>  #</th>
     <th>姓名</th>
     <th>商户数</th>
    </tr>
   </thead>
   <tbody>
     <volist name="list" id="vo">
    <tr>
     <th scope="row" class="ranknum">
     <if condition="$vo.rank eq 1"><img src="{sh::res}public/img/gold.png" style="width: 30px;">
     <elseif condition="$vo.rank eq 2"/><img src="{sh::res}public/img/silver.png" style="width: 30px;">
     <elseif condition="$vo.rank eq 3"/><img src="{sh::res}public/img/copper.png" style="width: 30px;">
     <else />
       {sh:$vo.rank}
     </if>
     </th>
     <td>{sh:$vo.name}</td>
     <td>{sh:$vo.usercount}</td>
    </tr>
    </volist>
   </tbody>
</table>
<div class="page text-right">
    {sh:$page}
</div>
</div>
</body>
</html>

php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 排行榜
public function ranklist(){
    $type = $this->_get('type','trim');
    $this->assign('type',$type);
    $opener_id = $this->opener_id;
    if($type == 0){ // 上月排行
      $arrlastmonth = $this->getlastmonthstartendday();
      $laststartday = $arrlastmonth['laststartday'];
      $lastendday = $arrlastmonth['lastendday'].' 23:59:59';
      $b_time = strtotime($laststartday);
      $e_time = strtotime($lastendday);
      $where['b.addtime'] = array(array('gt',$b_time),array('lt',$e_time),'and');
    }
    $where['a.status'] = array('eq','1');
    m()->query('set @rank =0;');
    $subquery = m()->table('sh_opener a')->join('sh_user b on a.id = b.opener_id')->where($where)->group('a.id')->order('usercount desc')->field('a.id,count(b.id) as usercount,a.name')->select(false);
    $all = m()->table(''.$subquery.' a')->getfield('a.id,a.usercount,a.name,(@rank:=ifnull(@rank,0)+1) as rank');
    $count   = count($all);
    $page    = new page($count, 10);
    $list    = m()->table('sh_opener a')->join('sh_user b on a.id = b.opener_id')->where($where)->group('a.id')->order('usercount desc')->limit($page->firstrow.','.$page->listrows)->field('count(b.id) as usercount,a.name,a.id')->select();
    foreach ($list as $k => $v) {
      $list[$k]['rank'] = $k + 1 + $page->firstrow;
    }
    // 我的商户
    $my_user_count = $all[$opener_id]['usercount']?$all[$opener_id]['usercount']:0;
    $my_rank = $all[$opener_id]['rank']?$all[$opener_id]['rank']:'-';
    $this->assign('my_user_count',$my_user_count);
    $this->assign('my_rank',$my_rank);
    $this->assign('page',$page->show());
    $this->assign('list', $list);
    $this->display();
}
// 获取上一月开始与结束日期
private function getlastmonthstartendday(){
    $thismonth = date('m');
    $thisyear = date('y');
    if ($thismonth == 1) {
      $lastmonth = 12;
      $lastyear = $thisyear - 1;
    } else {
      $lastmonth = $thismonth - 1;
      $lastyear = $thisyear;
    }
    $laststartday = $lastyear . '-' . $lastmonth . '-1';
    $lastendday  = $lastyear . '-' . $lastmonth . '-' . date('t', strtotime($laststartday)); //t 给定月份所应有的天数,28到31
    return array('laststartday'=>$laststartday,'lastendday'=>$lastendday);
}

这里用的是thinkphp的分页类实现的。

案例效果

thinkPHP统计排行与分页显示功能示例

希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。