[英]How to limit pages in pagination system PHP/MySQL?
我为用户的仪表板提供了一个分页系统,基本上我担心的是,当用户的朋友开始张贴到50-60-70页左右的位置时。
我想要这样: 1 2 3 4 5 ... 91
,然后当用户加载不同的页面时,应该这样: 1 ... 22 23 24 ... 91
或类似的事情。 这样,它不会尝试一次列出所有页面并变得非常丑陋。
我对分页不是很熟悉,我有一个老朋友帮助我使用此系统,所以如果这是一个讨厌的问题,请您谅解。 我在网上四处寻找东西,似乎找不到一种方法来实现我要在系统中执行的操作。
我应该重新制作整个东西吗? 如果是这样,那么执行此操作的最佳方法是什么? 这是我正在使用的当前功能:
function friendstatus(){
global $session_user_id;
$per_page = 15;
$from_where = "FROM posts WHERE userid in (SELECT friend_id FROM friendship WHERE user_id = $session_user_id AND pending = 0 OR friend_id = $session_user_id) AND visible != 0 ORDER BY `timestamp` DESC";
$sql = "SELECT COUNT(*) ".$from_where;
$res = mysql_query($sql) or trigger_error("Error.");
$row = mysql_fetch_row($res);
$total_rows = $row[0];
if($total_rows != 0){
if(isset($_GET['page'])) $CUR_PAGE = intval($_GET['page']); else $CUR_PAGE=1;
$start = abs(($CUR_PAGE-1)*$per_page);
$sql = "SELECT * $from_where LIMIT $start,$per_page";
$res = mysql_query($sql) or trigger_error("cant get actual data");
while($row=mysql_fetch_array($res)) $DATA[++$start]=$row;
$uri = strtok("/dash","?")."/";
$tmpget = $_GET;
unset($tmpget['page']);
if($tmpget){ $uri .= http_build_query($tmpget)."/"; }
$num_pages=ceil($total_rows/$per_page);
for($i=1;$i<=$num_pages;$i++) $PAGES[$i]=$uri.$i; ?>
Pages:<? foreach ($PAGES as $i => $link): ?> <? if ($i == $CUR_PAGE): ?><b><?=$i?></b> <? else: ?><a href="<?=$link?>"><?=$i?></a> <? endif ?><? endforeach ?> | Total Posts: <b><?=$total_rows?></b>
<hr color="#1F1F1F" width="100%"><br><?foreach($DATA as $i => $row):?>
//show the statuses
<? endforeach ?>
Pages:<? foreach ($PAGES as $i => $link): ?> <? if ($i == $CUR_PAGE): ?><b><?=$i?></b> <? else: ?><a href="<?=$link?>"><?=$i?></a> <? endif ?><? endforeach ?> | Total Posts: <b><?=$total_rows?></b>
<? } //end if $total_rows != 0
} //end function
首先在要显示的当前页面周围定义一些范围。
$RANGE = 2; //show 2 pages before and after current
然后确定此范围的起始页和结束页:
$start = max($CUR_PAGE-$RANGE,1);
$end = min($CUR_PAGE+$RANGE,count($PAGES));
然后更换
foreach($PAGES as $i=>$link)
同
for($i=$start;$i<=$end;$i++) //references to $link in the body become $PAGES[$i]
对于静态的“前x页”和“后x页”,您必须进行一些检查以确保最终不会出现重复的页面,例如1 ... 12345 ... 91。 如果仅对链接到第一页和最后一页感兴趣,那么一个简单的if语句就足够了,例如,如果要显示第一页和最后三页,则必须进行一些小的索引调整。
通过添加一些if语句,我基本上可以实现所需的功能。
用...替换列出页面的部分...
<a href="https://mysite/dash/1">First</a> | <? foreach ($PAGES as $i => $link): ?><? if ($i == $CUR_PAGE): ?><b><?=$i?></b> <? endif ?><? if($i == $CUR_PAGE+1):?><a href="<?=$link?>"><?=$i?></a><? endif ?><? endforeach ?> | <a href="https://mysite/dash/<?=$num_pages?>">Last</a> | Total Posts: <b><?=$total_rows?></b>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.