分页显示异常: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 .= '<a href="' .$scripturl .'?action=music;area=mycharts;sa=chart;chr=' .$week_record['chart_id']. ';wk='.$week_record['wkend']. ';u='.$week_record['member_id'].'">' . ($i == 1 ? $i . ' - ' .($week_record['per_page']) : ($week_record['per_page'] + $i) . ' - ' . ($i + $totalPages)).'</a>, '; } return '<br>'. $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; }
核心修正内容
- 正确计算分页区间:
- 起始值:
($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)
- 起始值:
- 修复HTML格式:原代码里的
<、"转成了正常的<、",避免前端显示问题 - 清理多余符号:用
rtrim($links, ', ')去掉最后一个链接后的多余逗号和空格,让格式更整洁 - 变量可读性优化:新增
$totalEntries和$perPage变量,让代码逻辑更清晰
内容的提问来源于stack exchange,提问作者Mick Javes
相关产品推荐
相关产品推荐

