Web Hacking Study/Web Page 만들기

게시판 페이지 개발 (게시글 페이징)

silver surfer 2022. 6. 5.

** list.php

이전에 작성했던 코드 아래에 php 코드를 작성한다

<table align=center>
        <thead align="center">
            <tr style="background: #AAA7B0; opacity:0.9; font-size:20px">
                <th width=70>번호</th>
                <th width=300>제목</th>
                <th width=120>작성자</th>
                <th width=120>작성일</th>
                <th width=70>조회수</th>
                <th width=70>좋아요</th>
            </tr>
       </thead>
        <?php
                    $conn = mysqli_connect('localhost', 'root', 'mysql', 'board');

                    $n_sql = "SELECT count(*) FROM board";
                    $n_result = mysqli_query($conn,$n_sql);
                    $row = mysqli_fetch_row($n_result);
                    $num = $row[0]; //board DB 내의 전체 행 개수를 가져온다

                    $list_num=5; //한 페이지에 보여줄 게시글 개수
                    $page_num=3; //블럭 당 페이지 개수
                    //page가 설정되어있으면 page, page가 설정된 변수가 아니라면 page=1
                    $page=isset($_GET['page'])? $_GET['page'] :1

                    $total_page = ceil($num/$list_num); //전체 페이지 수 = 전체 게시글 수 / 블럭 당 페이지 수
                    $now_block = ceil($page/$page_num); //현재 블록 번호 = 현재 페이지 번호 / 블럭 당 페이지 수

                    /** 블록의 시작 번호 = (현재 페이지 번호-1) X 블럭 당 페이지 수 + 1
                    현재 블럭이 1페이지라면 시작 번호는 (1-1)x3+1 = 1
                    2페이지라면 (2-1)x3+1= 4 **/
                    $block_start=(($now_block-1)*$page_num)+1;
                    if($block_start <= 0){
                      $block_start = 1;
                    }

                    /** 블록의 마지막 번호 = 현재 페이지 번호 X 블럭 당 페이지 수
                    현재 블럭이 1페이지라면 마지막 번호는 1x3 = 3 **/
                    $block_end=$now_block*$page_num;
                    if($block_end>$total_page){
                      $block_end=$total_page;
                    }
                    //페이지 시작 = 현재 페이지 번호-1 X 한 페이지에 보여줄 게시글 개수
                    $page_start=($page-1) * $list_num;
                    $sql2 = "SELECT * FROM board ORDER BY idx DESC LIMIT $page_start, $list_num";
                    $result = mysqli_query($conn, $sql2);
                    //글 번호, page가 0부터 시작하기 때문에 1을 더해준다
                    $cnt = $page_start+1; //while문의 끝에서 $cnt++;한다
        ?>

 

* ceil() 소수값 올림 함수

게시글이 1개여도 페이지가 있어야한다

$total_page = ceil($num/$list_num);

예를 들어 게시글 26개가 있으면 26/5 = 5.2 → 6이므로

페이지가 6개로 구성된다

 

 

현재 4페이지에 있다면 4/3=1.33...→ 2이므로 2번째 블록에서 6페이지를 볼 수 있다

$now_block = ceil($page/$page_num);

 

 

페이징 기능도 search_result에 맞게 수정하고, 코드를 테이블이 끝나는 곳에 입력한다

<div id="page_num" style="text-align: center; margin-top: 10px; font-size: 20px">
      <?php
      if($page <= 1){
        echo "<a href=\"search_result.php?page=1&category=$category&search=$search&date1=$date1&date2=$date2\"> ◀ 이전 </a>";
      } else {
      	$pre = $page - 1;
        echo "<a href=\"search_result.php?page=$pre&category=$category&$search=$search&date1=$date1&date2=$date2\"> ◀ 이전 </a>";
      };
      ?>

       <?php 
       $per=1;
       while($per <= $total_page){
            if($page==$per){
                echo "<a href=\"search_result.php?page=$per&category=$category&search=$search&date1=$date1&date2=$date2\"> $per </a>";
            } else {
            echo "<a href=\"search_result.php?page=$page&category=$category&search=$search&date1=$date1&date2=$date2\"> $per </a>";}
             $per++;
        }
        ?>

      <?php
      if($page < $total_page){
        $next = $page + 1;
        echo "<a href=\"search_result.php?page=$next&category=$category&search=$search&date1=$date1&date2=$date2\"> 다음 ▶ </a>";
      } else {
      	$next = $page + 1;
        echo "<a href=\"search_result.php?page=$total_page&category=$category&search=$search&date1=$date1&date2=$date2\"> 다음 ▶ </a>";
      };
      ?>
 </div>

 

 

** list.php 전체 코드

<?php
    session_start();
    if(!isset($_SESSION['username'])) {
        echo "<script>alert('비회원입니다!');</script>";
        echo "<script>window.location.replace('main.php');</script>";
    }
?>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Board</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap');
        * {font-family: 'Noto Sans KR', sans-serif;}
        body {
          height: 100vh;
          background: url('bg.jpg') no-repeat center;
          background-size: cover;
          overflow: auto;
        }
        table {
              border-top: 1px solid #444444;
              border-collapse: collapse;
              color: #1F1821;
          }
        tr {
            border-bottom: 1px solid #444444;
            padding: 10px;
        }
        td {
            border-bottom: 1px solid #B8B7B9;
            padding: 10px;
        }

        a:link {
            color: #57A0EE;
            text-decoration: none;
        }

        a:hover {
            text-decoration: underline;
        }
        .btn {
          text-align: center;
          padding-top: 20px;
        }
        .read_btn {
          width: 700px;
          height: 200px;
          text-align: center;
          margin: auto;
          margin-top: 50px;
        }

        .read_btn1 {
          height: 50px;
          width: 100px;
          font-size: 20px;
          text-align: center;
          background-color: #FFFFFF;
          opacity: 0.9;
          border: 2px solid black;
          border-radius: 10px;
        }
    </style>
</head>
<body>
    <p style="font-size:25px; text-align:center; color: white;"><b>게시판</b></p>
    <table align=center>
        <thead align="center">
            <tr style="background: #AAA7B0; opacity:0.9; font-size:20px">
                <th width=70>번호</th>
                <th width=300>제목</th>
                <th width=120>작성자</th>
                <th width=120>작성일</th>
                <th width=70>조회수</th>
                <th width=70>좋아요</th>
            </tr>
       </thead>
        <?php
            $conn = mysqli_connect('localhost', 'root', 'mysql', 'board');

            $n_sql = "SELECT count(*) FROM board";
            $n_result = mysqli_query($conn,$n_sql);
            $row = mysqli_fetch_row($n_result);
            $num = $row[0];

            $list_num=5; 
            $page_num=3; 
            $page=isset($_GET['page'])? $_GET['page'] :1;

            $total_page = ceil($num/$list_num); 
            $now_block = ceil($page/$page_num);

            $block_start=(($now_block-1)*$page_num)+1;
            if($block_start <= 0){
              $block_start =1;
            }

            $block_end=$now_block*$page_num;
            if($block_end>$total_page){
              $block_end=$total_page;
            }

            $page_start=($page-1) * $list_num;
            $sql2 = "SELECT * FROM board ORDER BY idx DESC LIMIT $page_start, $list_num";
            $result = mysqli_query($conn, $sql2);
            $cnt = $page_start+1;

            while($row = mysqli_fetch_array($result)){
        ?>
            <tbody>
                <tr align=center style="background: #E6E4E7; opacity:0.6; font-size:17px">
                    <td><?php echo $cnt;?></td>
                    <td width="500" align="center"><a href="read.php?idx=<?=$row['idx']?>"><?php echo $row['title'];?></a></td>
                    <td width="100" align="center"><?php echo $row['name'];?></td>
                    <td width="200" align="center"><?php echo $row['udate'];?></td>
                    <td><?php echo $row['hit'];?></td>
                    <td><?php echo $row['liked'];?></td>
                </tr>
                <?php
                $cnt++;
                ?>
            </tbody>
        <?php } ?>
    </table>
     <div style="text-align: center; margin-top: 10px; font-size: 20px">
      <?php
      if($page <= 1){
        echo "<a href=\"search_result.php?page=1&category=$category&search=$search&date1=$date1&date2=$date2\"> ◀ 이전 </a>";
      } else {
      	$pre = $page - 1;
        echo "<a href=\"search_result.php?page=$pre&category=$category&$search=$search&date1=$date1&date2=$date2\"> ◀ 이전 </a>";
      };
      ?>

       <?php 
       $per=1;
       while($per <= $total_page){
            if($page==$per){
                echo "<a href=\"search_result.php?page=$per&category=$category&search=$search&date1=$date1&date2=$date2\"> $per </a>";
            } else {
            echo "<a href=\"search_result.php?page=$page&category=$category&search=$search&date1=$date1&date2=$date2\"> $per </a>";}
             $per++;
        }
        ?>

      <?php
      if($page < $total_page){
        $next = $page + 1;
        echo "<a href=\"search_result.php?page=$next&category=$category&search=$search&date1=$date1&date2=$date2\"> 다음 ▶ </a>";
      } else {
      	$next = $page + 1;
        echo "<a href=\"search_result.php?page=$total_page&category=$category&search=$search&date1=$date1&date2=$date2\"> 다음 ▶ </a>";
      };
      ?>
    </div>
    <div class="read_btn">
      <button class="read_btn1" onclick="window.location.href='write.php'">글쓰기</button>&nbsp;&nbsp;
    </div>
</body>
</html>

댓글