You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分页显示异常:PHP分页函数数学逻辑错误排查求助

分页区间生成函数逻辑修正

我需要创建一个返回类似「1 - 10, 11 - 20, 21 - 30」格式字符串的函数,目前框架已实现,但数学逻辑存在问题:当设置entries=6、per_page=2时,得到的结果是「1 - 2, 4 - 5, 5 - 6」,不符合预期。以下是我的PHP函数代码:

function GetChartPages($week)
{
    global $smcFunc, $scripturl;

    $links = '';
    
         $weekquery = $smcFunc['db_query']('', '
            SELECT w.entries, w.wkend, c.per_page, c.chart_id, c.member_id
            FROM {db_prefix}personal_charts_weeks AS w
            INNER JOIN {db_prefix}personal_charts_names AS c ON (w.chart_id = c.chart_id)
            WHERE w.week_id = {int:this_week}',
                [
                    'this_week' => $week
                ]
            );
            
        $week_record = $smcFunc['db_fetch_assoc']($weekquery);
        $smcFunc['db_free_result']($weekquery);

        $totalPages = ceil($week_record['entries'] / $week_record['per_page']);

        
        for ($i = 1; $i <= $totalPages; $i++) {

        $links .= '&lt;a href=&quot;'
                    .$scripturl
                    .'?action=music;area=mycharts;sa=chart;chr='
                    .$week_record['chart_id'].
                    ';wk='.$week_record['wkend'].
                    ';u='.$week_record['member_id'].'&quot;&gt;' .
                    ($i == 1 ? $i . ' - ' .($week_record['per_page']) : ($week_record['per_page'] + $i) . ' - ' . ($i +  $totalPages)).'&lt;/a&gt;, ';
        }
        
        return '&lt;br&gt;'. $links;
}

错误点说明

原代码中分页区间的计算逻辑完全错误:

  • 第一页的结束值虽然正确,但后续页面用$week_record['per_page'] + $i算起始、$i + $totalPages算结束,这两个表达式完全不符合分页区间的数学规律,导致结果混乱。

修正后的代码

function GetChartPages($week)
{
    global $smcFunc, $scripturl;

    $links = '';
    
    $weekquery = $smcFunc['db_query']('', '
        SELECT w.entries, w.wkend, c.per_page, c.chart_id, c.member_id
        FROM {db_prefix}personal_charts_weeks AS w
        INNER JOIN {db_prefix}personal_charts_names AS c ON (w.chart_id = c.chart_id)
        WHERE w.week_id = {int:this_week}',
            [
                'this_week' => $week
            ]
        );
        
    $week_record = $smcFunc['db_fetch_assoc']($weekquery);
    $smcFunc['db_free_result']($weekquery);

    $totalEntries = $week_record['entries'];
    $perPage = $week_record['per_page'];
    $totalPages = ceil($totalEntries / $perPage);

    for ($i = 1; $i <= $totalPages; $i++) {
        // 计算当前页的起始和结束条目数
        $start = ($i - 1) * $perPage + 1;
        $end = min($i * $perPage, $totalEntries);
        
        // 拼接链接(修复原代码的HTML实体转义问题)
        $links .= '<a href="'
                    . $scripturl
                    . '?action=music;area=mycharts;sa=chart;chr='
                    . $week_record['chart_id']
                    . ';wk=' . $week_record['wkend']
                    . ';u=' . $week_record['member_id'] . '">' 
                    . $start . ' - ' . $end 
                    . '</a>, ';
    }
    
    // 移除最后多余的逗号和空格
    $links = rtrim($links, ', ');
    
    return '<br>' . $links;
}

核心修正内容

  1. 正确计算分页区间:
    • 起始值:($i - 1) * $perPage + 1,比如第2页就是(2-1)*2+1=3,第3页是(3-1)*2+1=5
    • 结束值:用min($i * $perPage, $totalEntries),确保最后一页如果条目不足per_page时,显示实际的条目数(比如entries=7、per_page=2时,第三页结束值是7而非6)
  2. 修复HTML格式:原代码里的&lt;、&quot;转成了正常的<、",避免前端显示问题
  3. 清理多余符号:用rtrim($links, ', ')去掉最后一个链接后的多余逗号和空格,让格式更整洁
  4. 变量可读性优化:新增$totalEntries和$perPage变量,让代码逻辑更清晰

内容的提问来源于stack exchange,提问作者Mick Javes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:50:19