php - PHP 分页功能有时会生成超出需要的页面[最后一页为空]。我该如何解决?
问题描述
我刚刚找到了一个分页功能来显示文件夹中的图像页面,但是在分页时最后几页似乎是空的,我不想要这个。这是我正在使用的代码:
<?php
function show_pagination($current_page, $last_page){
echo '<br><div>';
echo ' <button type="button"><a href="?page=1">First Page</a></button> ';
echo ' <button type="button"><a href="?page='.$last_page.'">Last Page</a></button> ';
if( $current_page > 1 ){
echo ' <button type="button"><a href="?page='.($current_page-1).'"><<Previous</a></button> ';
}
for($i = 1; $i <= $last_page; $i++){
echo ' <button type="button"><a href="?page='.$i.'">'.$i.'</a></button> ';
}
if( $current_page < $last_page ){
echo ' <button type="button"><a href="?page='.($current_page+1).'">Next>></a></button> ';
}
echo '</div><br>';
echo '<div><p>Page '.$current_page.' out of '.$last_page.'</p></div><br>';
}
$folder = 'images/';
$filetype = '*.*';
$files = glob($folder.$filetype);
$total = count($files);
$per_page = 20;
$last_page = (int)($total / $per_page);
if(isset($_GET["page"]) && ($_GET["page"] <=$last_page) && ($_GET["page"] > 0) ){
$page = $_GET["page"];
$offset = ($per_page + 1)*($page - 1);
}else{
//echo "Page out of range showing results for page one";
$page=1;
$offset=0;
}
$max = $offset + $per_page;
if($max>$total){
$max = $total;
}
show_pagination($page, $last_page);
for($i = $offset; $i< $max; $i++){
$file = $files[$i];
$path_parts = pathinfo($file);
$filename = $path_parts['filename'];
echo "<img src='$file' alt='$filename' style='border-style: solid;border-width: 2px;border-color: #4d94ff; margin: 5px'>";
}
show_pagination($page, $last_page);
?>
解决这个小问题的任何帮助将不胜感激。但是我正在计算最后一页似乎在某些情况下有效,但并非在所有情况下都有效,我不知道为什么。
解决方案
我相当肯定问题出在你的偏移量上 - $offset = ($per_page + 1)*($page - 1)
。
请记住,每个页面将显示20个项目,而不是 21 个。对于第一页,您需要一个1
. 对于第二个,21
。对于第三个,41
。等等。
因此,您只需要在计算页面本身之后添加一个。为此,您可能正在寻找以下内容:
$offset = ($per_page * ($page - 1)) + 1;
这相当于:
$offset = (20 * (1 - 1)) + 1; /* 1 for page 1 */
$offset = (20 * (2 - 1)) + 1; /* 21 for page 2 */
$offset = (20 * (3 - 1)) + 1; /* 41 for page 3 */
推荐阅读
- python - 在python中迭代列表的索引错误
- javascript - document.execCommand 不适合我
- vue.js - [Vue warn] 的原因是什么:Invalid prop: custom validator check failed for prop "value"
- php - 使用 Laravel 默认身份验证验证登录中的其他用户字段
- php - 从下拉菜单中选择元素后,如何使元素出现?
- javascript - 更改克隆的 DOM 元素时 JS/jQuery 事件/数据丢失
- amazon-web-services - 使用 WAF 阻止垃圾邮件攻击
- html - HTML/CSS:获取
- react-native - React-Native 动画有一个小的停顿
- powershell - Powershell 中的 If/Else 帮助