내가 한 노력들

[ PHP ] Pagination (페이징) 구현 본문

IT 공부/PHP

[ PHP ] Pagination (페이징) 구현

JONGI-N CHOI 2022. 2. 16. 15:10

요즘 프레임워크에는 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태그를 주입해주어 표현하면 됩니다.