[PHP] 페이징 처리하기

전예원·2021년 12월 14일
1

PHP, APACHE

목록 보기
10/14

티스토리도 많은 방문 부탁드립니다.

https://dpdnjs402.tistory.com/65

💡 관리자 회원정보 페이지에 페이징 처리를 해보자!

⭐️ 완성샷


🔴 페이징 처리하기 - 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을 해주면 된다.
profile
앞으로 나아가는 중~

2개의 댓글

comment-user-thumbnail
2022년 5월 24일

안녕하세요. 해당 포스트를 따라하여 저도 게시판 페이지를 구현 하였습니다. 몇날 며칠 검색하고 따라해보고 하다가 드디어 성공 하였는데요. 혹시 검색 기능도 추가 포스팅 해주시면 안될까요?
이름 검색, 가입기간 사이 검색등(2022-1-1~2022-5-4 사이 가입한 회원들 조회등.) 저에게 많은 도움 주셔서 감사합니다.

1개의 답글