요즘 프레임워크에는 DB와 연동해서 간편하게 사용할 수 있는 pagination 기능이 많이 있지만, 이번에 DB에 있는 데이터를 가져와서 페이징하는 것이아니라 파일에 있는 내용을 가져와서 페이징하는 것을 하기 때문에 바닐라 PHP로 작성
<?php
$page = 0;
if (!isset ($_GET['page']) ) {
$page = 1;
} else {
$page = $_GET['page'];
}
$results_per_page = 10;
$page_first_result = (($page-1) * $results_per_page) + 1;
$last_page = ceil((count($line)) / $results_per_page);
$page_last_result = $page_first_result + $results_per_page;
if ($page === strval($last_page)) {
$page_last_result = count($line);
}
?>
Page 설정
현재 페이지
URL에 page 쿼리스트링이 없을 경우에는 1로 초기화하고, 있는 경우에는 그 값을 사용한다.
$page = 1;
if (isset ($_GET['page']) ) {
$page = $_GET['page'];
}
이렇게 작성하는 것이 더 간결한 것 같습니다.
끝 페이지
"전체 데이터 수"를 "페이지당 보여지는 데이터 수"로 나누고, 올림한 값
$last_page = ceil((count($line)) / $results_per_page);
올림을 하지않으면, 마지막 페이지가 추가되지 않습니다.
게시물이 3개인데, 페이지당 데이터가 5일 경우에 나누면 0.6이지만, 프로그래밍에선 0이 출력되서 페이지가 0이 됩니다.
그렇기 때문에 올림을 해줘야합니다.
페이지당 결과물 수
$results_per_page = 10;
한 페이지당 10개의 결과물이 나오도록 지정
결과물의 시작과 끝
페이지에 따라서, 어디에서부터 어디까지의 데이터를 가져와야하는 지를 지정합니다.
$page_first_result = (($page-1) * $results_per_page) + 1;
$page_last_result = $page_first_result + $results_per_page;
if ($page === strval($last_page)) {
$page_last_result = count($line);
}
시작
$page_first_result = (($page-1) * $results_per_page) + 1;
마지막에 + 1을 해준이유는, csv파일에서 내용을 가져와서 내용을 뿌려주기 때문에 csv의 columns명은 제외하기 위해서 + 1를 추가해줬습니다.
끝
쿼리문 LIMIT를 사용하면 굳이 필요없는 설정입니다. (LIMIT에서는 마지막 index를 넣지않고, 가져올 결과물 수를 넣기 때문에)
하지만, 이번에 쿼리문을 사용하지않고 for문을 사용해서 데이터를 출력하기 때문에 조건에 넣을 제한값을 줘야합니다.
그러면, " 시작 index + 페이지당 결과물 수 "를 해주면, 딱 페이지당 결과물 수 만큼 for문이 돌기 때문에 원하는 동작이 될 것입니다.
$page_last_result = $page_first_result + $results_per_page;
if ($page === strval($last_page)) {
$page_last_result = count($line);
}
단, 여기서 주의할 점 for문을 사용하기 때문에 마지막 페이지에서는 페이지당 보여지는 결과물 수 보다, 데이터의 수가 적으면 index 범위가 넘어가기 때문에 에러가 발생합니다.
따라서, 마지막 페이지일 경우에는 "페이지당 결과물 수"가 아닌, "데이터의 총 갯수"를 넣어주게되면 딱 데이터의 마지막까지만 가져오게 됩니다.
페이징 UI
<div class="d-flex justify-content-center">
<nav aria-label="Page navigation example">
<ul class="pagination">
<li class="page-item"><a class="page-link" href="#">Previous</a></li>
<?php for($page = 1; $page<= $last_page; $page++) :?>
<li class="page-item"><a class="page-link" href="<?= base_url('statistics?page='.$page) ?>"><?= $page ?></a></li>
<?php endfor ?>
<li class="page-item"><a class="page-link" href="#">Next</a></li>
</ul>
</nav>
</div>
디자인은 bootstrap을 사용했고,
for($page = 1; $page<= $number_of_page; $page++) {
echo '<a href = "index2.php?page=' . $page . '">' . $page . ' </a>';
}
페이징의 숫자 부분은 위와 같이 for문에 a태그를 주입해주어 표현하면 됩니다.
'IT 공부 > PHP' 카테고리의 다른 글
[ PHP ] 연관배열에서 특정키(index)값이 존재하는지 확인하고 싶을 경우 (0) | 2022.02.20 |
---|---|
[ PHP ] 디렉토리(폴더)에 있는 파일 리스트 가져오기 (0) | 2022.02.20 |
[ PHP ] Project 디렉토리에 있는 파일을 Web에서 Download (0) | 2022.02.15 |
[ PHP ] CSV파일 불러와서 웹에 Table 형태로 뿌려주기 (0) | 2022.02.15 |
[ AWS ] EC2에서 Docker 기반, nginx-php환경 구축후 RDS 연결하기 (0) | 2022.01.29 |