我是多表联合查询然后 做的一个列表按发布时间显示出来,如果不分页的话,全部数据能正常显示出来,做了分页之后,翻到第二页或者后面几页中间总是少了几条数据,本人刚入门,希望能尽可能详细的列出修改代码!!
//下面是分页代码
$ppp=2;//每页显示多少条数据
$page=max($_GET['page'],1);//当前是第几页
$begin=($page-1)*$ppp;//从第几页开始
$uid = 1;//取UID为1的用户数据
$num=
DB::result_first('select COUNT(displayorder >= 0) from '.DB::table('forum_thread').' WHERE '.DB::field('authorid',$uid))
+
DB::result_first('select COUNT(status = 1) from '.DB::table('lianxi_data').' WHERE status=1 and '.DB::field('uid',$uid));//统计总记录数,将数据库lianxi_data和forum_thread一起统计
//分页
$multi =multi($num,$ppp,$page,'/newlist.php');
//取数据库lianxi_data的数据
$lianxidatas=DB::fetch_all('select * from '.DB::table('lianxi_data').' where '.DB::field('uid',$uid).' and status=1 order by dateline DESC limit %d,%d',array($begin,$ppp));
//循环数据库lianxi_data的数据
$listx=$vidsx=array();
foreach($lianxidatas as $k=>$v){
$listx[$v['vid']]['id']=$v['vid'];
$vidsx[]=$v['vid'];
$listx[$v['vid']]['title']=$v['title'];
$listx[$v['vid']]['dateline']=$v['dateline'];
}
//取数据库forum_thread的数据
$newthreads=DB::fetch_all('select * from '.DB::table('forum_thread').' where '.DB::field('authorid',$uid).' and displayorder >= 0 order by dateline DESC limit %d,%d',array($begin,$ppp));
//循环数据库forum_thread的数据
$list1=$tids=array();
foreach($newthreads as $k=>$v){
$list1[$v['tid']]['id']=$v['tid'];
$tids[]=$v['tid'];
$list1[$v['tid']]['title']=$v['subject'];
$list1[$v['tid']]['dateline']=$v['dateline'];
}
将数据库lianxi_data和数据库forum_thread联合
$lists=$listx+$list1;
$datelines=array();
foreach($lists as $k=>$v){
$lists[$k]['cover']=$v['cover']?$v['cover']:'';
$datelines[$k]=$v['dateline'];
}
arsort($datelines);//按时间倒序排序
$tvlist=array();
$ii==0;
foreach($datelines as $k=>$v){
$tvlist[]=$lists[$k];
$ii++;
if($ii>=$ppp)break;
}
**HTML页面**
{loop $tvlist $tv}
<ul>
<li>标题:{tv[title]}</li>
</ul>
{/loop}
/*分页*/
<div class="pagenav">$multi</div>
分页注意查看,传递的页号,和页面大小,已经查询的数据集数据,你可以打印出来进行调试
大概看了下,你应该是从两个表取数据进行合并,但是每次查询都分页,出来的结果会变成两倍,你仔细想想。数据缺失的原因是你最后一个循环里面 break 了。
修改的思路如下:
<?php
// 在$ppp之前定义一个页码大小,双数。第三行改为
$size = 2;
$ppp = intval($size/2);
// 46到58行替换为下面的代码
foreach ($lists as &$item) {
$item['cover'] = $item['cover'] ?? '';
$datelines[] = $item['dateline'];
}
array_multisort($lists, $datelines, SORT_DESC);
$tvlist = $lists;