【问题标题】:How to limit pages in pagination system PHP/MySQL?如何在分页系统 PHP/MySQL 中限制页面?
【发布时间】:2015-02-02 08:11:23
【问题描述】:

我的用户仪表板有一个分页系统,基本上我担心的是当用户的朋友开始发布到大约 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 

【问题讨论】:

    标签: php mysql pagination


    【解决方案1】:

    首先在您希望显示的当前页面周围定义一些范围。

    $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 语句就足够了,例如,如果您想显示第一页和最后 3 页,则必须进行一些小的索引调整。

    【讨论】:

      【解决方案2】:

      我基本上可以通过添加一些 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>
      

      【讨论】:

      • 哇,这几乎是不可能阅读的。您真的应该考虑将其放入单独的函数中。
      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2017-01-18
      • 2012-06-25
      • 1970-01-01
      相关资源
      最近更新 更多