새소식

Backend/PHP

[PHP] 페이지네이션 (페이징) 만들기

  • -
반응형
💡 관리자 회원정보 페이지에 페이징 처리를 해보자!

 

⭐️ 완성샷


🔴 페이징 처리하기 - 1

/* paging : 한 페이지 당 데이터 개수 */
$list_num = 5;

/* paging : 한 블럭 당 페이지 수 */
$page_num = 3;

/* paging : 현재 페이지 */
$page = isset($_GET["page"])? $_GET["page"] : 1;

/* paging : 전체 페이지 수 = 전체 데이터 / 페이지당 데이터 개수, ceil : 올림값, floor : 내림값, round : 반올림 */
$total_page = ceil($num / $list_num);
// echo "전체 페이지 수 : ".$total_page;

/* paging : 전체 블럭 수 = 전체 페이지 수 / 블럭 당 페이지 수 */
$total_block = ceil($total_page / $page_num);

/* paging : 현재 블럭 번호 = 현재 페이지 번호 / 블럭 당 페이지 수 */
$now_block = ceil($page / $page_num);

/* paging : 블럭 당 시작 페이지 번호 = (해당 글의 블럭번호 - 1) * 블럭당 페이지 수 + 1 */
$s_pageNum = ($now_block - 1) * $page_num + 1;
// 데이터가 0개인 경우
if($s_pageNum <= 0){
    $s_pageNum = 1;
};

/* paging : 블럭 당 마지막 페이지 번호 = 현재 블럭 번호 * 블럭 당 페이지 수 */
$e_pageNum = $now_block * $page_num;
// 마지막 번호가 전체 페이지 수를 넘지 않도록
if($e_pageNum > $total_page){
    $e_pageNum = $total_page;
};

🟤 한 페이지 당 데이터 개수

나는 한페이지 당 보이는 개수를 5개로 하기로 했다.

🟤 한 블럭 당 페이지 수

나는 한 블럭 당 페이지 수는 3개로 정했다.

🟤 현재 페이지

현재 페이지를 get 방식으로 가져온다. 페이지가 없으면 1번 페이지로 간다.

🟤 전체 페이지수

  • 전체 페이지 수 = 전체 데이터 / 페이지당 데이터 개수
  • $total_page = ceil($num / $list_num);
  • 올림 해줘야한다.
  • 페이지는 데이터가 1개여도 무조건 1개가 있어야한다.
    ex) 전체데이터(19개) / 페이지당 데이터 개수(5) = 3.8
    5/5/5/4 이런식으로 페이지가 구성됨 -> 총 4개의 페이지가 필요

🟤 전체 블럭 수

  • 전체 페이지 수 / 블럭 당 페이지 수
  • $total_block = ceil($total_page / $page_num);
  • 올림 해줘야한다.
  • ex) 전체 페이지 수(4) / 한 블럭 당 페이지 수(3) = 1.3333...
    1, 2, 3 || 4, 5, 6
    나는 4번 페이지 밖에 없지만 그래도 전체 블럭 수는 2개가 필요하다.

🟤 현재 블럭 번호

  • 현재 페이지 번호 / 블럭 당 페이지 수
  • $now_block = ceil($page / $page_num);
  • 올림 해줘야한다.
  • ex) 현재 페이지 번호(1, 2, 3, 4 중 한개) / 블럭당 페이지 수(3) =
    1 -> 0.3333 || 2 -> 0.6666 || 3 -> 1 || 4 -> 1.3333
    1,2,3을 올림하면 1블록 / 4,5,6을 올림하면 2블록 -> 현재 몇 번째 블록에 위치한지 알 수 있다.

🟤 블럭 당 시작 페이지 번호

  • (해당 글의 블럭번호 - 1) * 블럭당 페이지 수 + 1
  • $s_pageNum = ($now_block - 1) * $page_num + 1;
  • ex) 1,2,3 페이지 일 때 -> (현재블럭(1) - 1) 3 + 1 = 1
    4,5,6 페이지 일 때 -> (현재블럭(2) - 1) 3 + 1 = 4
  • 데이터가 0일 때 경우를 만들어줘야함. 그 때는 시작 페이지가 1이다.

🟤 블럭 당 마지막 페이지 번호

  • 현재 블럭 번호 * 블럭 당 페이지 수
  • $e_pageNum = $now_block * $page_num;
  • 대신 마지막 번호는 전체 페이지 수를 넘기면 안된다.
  • ex) 나는 총 19개 데이터를 가지고 있고, 총 4페이지가 나왔다. 
    하지만 블럭 당 마지막 페이지 번호를 계산해보면 6이라는 숫자가 나온다. 
    그럼 전체 페이지 수를 넘기게 된거라서 조건을 따로 만들어준다.
  • 만약 마지막 페이지 번호>전체페이지 라면, 마지막 페이지 번호는 전체 페이지 번호랑 같다!

🟠 Ceil, Floor, Round

Ceil : 올림값
Floor : 내림값
Round : 반올림

🟡 변수 출력하기

위에 만들어 놓은 변수들을 활용해서 페이지에 출력해보자!

/* paging : 시작 번호 = (현재 페이지 번호 - 1) * 페이지 당 보여질 데이터 수 */
$start = ($page - 1) * $list_num;

/* paging : 쿼리 작성 - limit 몇번부터, 몇개 */
$sql = "select * from members limit $start, $list_num;";

/* paging : 쿼리 전송 */
$result = mysqli_query($dbcon, $sql);

/* paging : 글번호 */
$cnt = $start + 1;

🟤 시작 번호

  • (현재 페이지 번호 - 1) * 페이지 당 보여질 데이터 수
  • $start = ($page - 1) * $list_num;
  • 1페이지의 시작 번호는 0이다. -> index는 0부터 시작한다. 따라서 0이 1번이라고 생각하면된다.

🟤 쿼리 작성 -> 전송

  • limit : 몇번부터, 몇개
  • $sql = "select * from members limit $start, $list_num;";
  • ex) 1번 페이지는 0번 부터 5개,
    2번 페이지는 5번부터 5개,
    3번 페이지는 10번부터 5개 ...
  • $result = mysqli_query($dbcon, $sql);

🟤 글번호

  • $cnt = $start + 1;
  • 글번호는 index가 0부터 시작하나 실제로는 1부터 시작함으로 
    출력될 때는 1부터 시작할 수 있게 $start에 +1를 해준다.

🟢 회원 정보 가져오기

while($array = mysqli_fetch_array($result)){
        ?>
        <tr class="brd">
            <!-- <td><?php echo $i; ?></td> -->
            <td><?php echo $cnt; ?></td>
            <td><?php echo $array["u_name"]; ?></td>
            <td><?php echo $array["u_id"]; ?></td>
            <td><?php echo $array["birth"]; ?></td>
            <td><?php echo $array["postalCode"]." ".$array["add1"]." ".$array["add2"]; ?></td>
            <td><?php echo $array["email"]; ?></td>
            <td><?php echo $array["mobile"]; ?></td>
            <td><?php echo $array["reg_date"]; ?></td>
            <td><a href="edit.php?u_idx=<?php echo $array["idx"]; ?>">수정</a></td>
            <td><a href="#" onclick="del_check(<?php echo $array["idx"]; ?>)">삭제</a></td>
        </tr>
        <?php  
            /* $i++; */
            /* paging */
            $cnt++;
        }; 
?>

while 반복문을 사용해서 mysqli_fetch_array()를 이용해 필드명으로 값을 출력한다.
그리고 글번호를 1개씩 플러스 해준다.


🔵 Pager 만들기

이렇게 밑에 페이지를 표시해주는 부분을 만들 것이다.
위에 만들어 놓은 변수들을 이용해서 만드는 것이다.

<p class="pager">

    <?php
    /* paging : 이전 페이지 */
    if($page <= 1){
    ?>
    <a href="list.php?page=1">이전</a>
    <?php } else{ ?>
    <a href="list.php?page=<?php echo ($page-1); ?>">이전</a>
    <?php };?>

    <?php
    /* pager : 페이지 번호 출력 */
    for($print_page = $s_pageNum; $print_page <= $e_pageNum; $print_page++){
    ?>
    <a href="list.php?page=<?php echo $print_page; ?>"><?php echo $print_page; ?></a>
    <?php };?>

    <?php
    /* paging : 다음 페이지 */
    if($page >= $total_page){
    ?>
    <a href="list.php?page=<?php echo $total_page; ?>">다음</a>
    <?php } else{ ?>
    <a href="list.php?page=<?php echo ($page+1); ?>">다음</a>
    <?php };?>

</p>

🟤 이전 페이지 만들기

  • p태그 안에 작성해준다. (div도 상관 없음)
  • 페이지는 음수가 없다.
  • 만약 페이지가 1보다 작으면 페이지는 무조건 1 페이지이다. php인라인 코딩으로 바로 적어준다.
  • 1페이지 보다 작은게 아니라면 그냥 페이지에서 -1을 해주면 된다.

🟤 다음 페이지 만들기

  • 페이지가 토탈 페이지 이상이면 페이지는 그냥 전체 페이지 수이다. 
  • 왜냐하면 4페이지까지만 있는데 그 이상은 없다. 그 외에는 페이지 +1을 해주면 된다.
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.