JAVASCRIPT

php 게시판 만들기 두번째 !

Kim do hyun 2023. 4. 26. 18:25
728x90
반응형

게시판 만들기 두번째

<?php
    include "../connect/connect.php";
    include "../connect/session.php";
?>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판</title>

    <?php include "../include/head.php" ?>
</head>
<body class="gray">
    
    <?php include "../include/skip.php" ?>
    <!-- //skip -->

    <?php include "../include/header.php" ?>
    <!-- //header -->

    <main id="main" class="container">
        <div class="intro__inner center bmStyle">
            <picture class="intro__images small">
                <source srcset="../assets/img/join01.png, ../assets/img/join01@2x.png 2x, ../assets/img/join01@3x.png 3x" />
                <img src="../assets/img/join01.png" alt="회원가입 이미지">
            </picture>
            <h2>게시판</h2>
            <p class="intro__text">
                웹디자이너, 웹 퍼블리셔, 프론트엔드 개발자를 위한 게시판입니다.<br>
                관련된 문의사항은 여기서 확인하세요!
            </p>
        </div>
        <!-- intro__inner -->
        <div class="board__inner">
            <div class="board__search">
                <div class="left">
                    * 총 <em>1111</em>건의 게시물이 등록되어 있습니다.
                </div>
                <div class="right">
                    <form action="#" name="#" method="post">
                        <fieldset>
                            <legend class="blind">게시판 검색 영역</legend>
                            <input type="search" placeholder="검색어를 입력하세요!">
                            <select name="#" id="#">
                                <option value="title">제목</option>
                                <option value="content">내용</option>
                                <option value="name">등록자</option>
                            </select>
                            <button type="submit" class="btnStyle3 white">검색</button>
                            <a href="boardWrite.php" class="btnStyle3">글쓰기</a>
                        </fieldset>
                    </form>
                </div>
            </div>
            <div class="board__table">
                <table>
                    <colgroup>
                        <col style="width: 5%">
                        <col>
                        <col style="width: 10%">
                        <col style="width: 15%">
                        <col style="width: 7%">
                    </colgroup>
                    <thead>
                        <tr>
                            <th>번호</th>
                            <th>제목</th>
                            <th>등록자</th>
                            <th>등록일</th>
                            <th>조회수</th>
                        </tr>
                    </thead>
                    <tbody>
                        <!-- <tr>
                            <td>1</td>
                            <td><a href="boardView.html"><a href="boardView.html">게시판 제목</a></a></td>
                            <td>김도현</td>
                            <td>2022-02-02</td>
                            <td>100</td>
                        </tr> -->

<?php
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page = 1;
    }

    $viewNum = 10;
    $viewLimit = ($viewNum * $page) - $viewNum;

    // 1~20 DESC LIMIT 0, 20        --> page1 (viewNum * 1) - viewNum
    // 21~40 DESC LIMIT 20, 20      --> page2 (viewNum * 2) - viewNum
    // 41~60 DESC LIMIT 40, 20      --> page3 (viewNum * 3) - viewNum
    // 61~80 DESC LIMIT 60, 20      --> page4 (viewNum * 4) - viewNum

    $sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT {$viewLimit}, {$viewNum}";
    $result = $connect -> query($sql);

    if($result){
        $count = $result -> num_rows;

        if($count > 0){
            for($i=0; $i<$count; $i++){
                $info = $result -> fetch_array(MYSQLI_ASSOC);

                echo "<tr>";                
                echo "<td>".$info['boardID']."</td>";
                echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
                echo "<td>".$info['youName']."</td>";
                echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
                echo "<td>".$info['boardView']."</td>";
                echo "</tr>";
            }
        }
    }
?>
                    </tbody>
                </table>
            </div>
            <div class="board__pages">
                <ul>
<?php
    // 게시글 총 갯수
    $sql = "SELECT count(boardID) FROM board";
    $result = $connect -> query($sql);

    $boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
    $boardTotalCount = $boardTotalCount['count(boardID)'];

    // 총 페이지 갯수
    $boardTotalCount = ceil($boardTotalCount/$viewNum);

    $pageView = 5;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

    // 처음 페이지 초기화
    if($startPage < 1) $startPage = 1;

    // 마지막 페이지 초기화
    if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;

    // 처음으로/이전
    if($page != 1 && $page <= $boardTotalCount){
        $prevPage = $page - 1;
        echo "<li><a href='board.php?page=1'>처음으로</a></li>";
        echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
    }

    for($i=$startPage; $i<=$endPage; $i++){
        $active = "";
        if($page <= $boardTotalCount){
            if($i == $page) $active = 'active';
            echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
        }
    }
    // 마지막으로/다음
    if($page != $boardTotalCount && $page <= $boardTotalCount){
        $nextPage = $page + 1;
        echo "<li><a href='board.php?page={$nextPage}'>다음</a></li>";
        echo "<li><a href='board.php?page={$boardTotalCount}'>마지막으로</a></li>";
    }
?>
                    <!-- <li><a href="#">처음으로</a></li>
                    <li><a href="#">이전</a></li>
                    <li class="active"><a href="#">1</a></li>
                    <li><a href="#">2</a></li>
                    <li><a href="#">3</a></li>
                    <li><a href="#">4</a></li>
                    <li><a href="#">5</a></li>
                    <li><a href="#">6</a></li>
                    <li><a href="#">7</a></li>
                    <li><a href="#">다음</a></li>
                    <li><a href="#">마지막으로</a></li> -->
                </ul>
            </div>
        </div>
    </main>
    <!-- //main -->

    <?php include "../include/footer.php" ?>
    <!-- //footer -->
</body>
</html>

 

php 코드

<?php
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page = 1;
    }

    $viewNum = 10;
    $viewLimit = ($viewNum * $page) - $viewNum;

    // 1~20 DESC LIMIT 0, 20        --> page1 (viewNum * 1) - viewNum
    // 21~40 DESC LIMIT 20, 20      --> page2 (viewNum * 2) - viewNum
    // 41~60 DESC LIMIT 40, 20      --> page3 (viewNum * 3) - viewNum
    // 61~80 DESC LIMIT 60, 20      --> page4 (viewNum * 4) - viewNum

    $sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT {$viewLimit}, {$viewNum}";
    $result = $connect -> query($sql);

    if($result){
        $count = $result -> num_rows;

        if($count > 0){
            for($i=0; $i<$count; $i++){
                $info = $result -> fetch_array(MYSQLI_ASSOC);

                echo "<tr>";                
                echo "<td>".$info['boardID']."</td>";
                echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
                echo "<td>".$info['youName']."</td>";
                echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
                echo "<td>".$info['boardView']."</td>";
                echo "</tr>";
            }
        }
    }
?>

이 코드는 게시판 페이지에서 게시글 목록을 불러오기 위한 코드입니다.

먼저, 페이지 번호를 파라미터로 받아오고, 없으면 1로 설정합니다. 그리고 한 페이지에 보여줄 게시글 개수를 $viewNum에 저장하고, 해당 페이지에서 보여줄 게시글의 시작 위치를 $viewLimit에 계산합니다. 이후, SQL 쿼리문에서 JOIN을 사용하여 게시판 테이블(board)과 회원 테이블(members)을 합쳐서 게시글 목록을 가져오고, 최신 게시글부터 보여주기 위해 boardID를 기준으로 내림차순으로 정렬합니다. LIMIT을 이용하여 가져올 데이터의 시작 위치와 개수를 지정합니다.

결과를 받아서, 게시글의 개수($count)를 확인하고, 개수가 0보다 크면 반복문을 돌며 게시글 정보를 출력합니다. 각각의 게시글 정보는 HTML 테이블의 한 행에 해당합니다. 게시글 제목은 링크로 걸려있으며, 해당 게시글로 이동할 수 있습니다. 게시글 작성자, 등록 일자, 조회수도 함께 출력합니다.

 

<?php
    // 게시글 총 갯수
    // 몇 페이지??
    $sql = "SELECT count(boardID) FROM board";
    $result = $connect -> query($sql);

    $boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
    $boardTotalCount = $boardTotalCount['count(boardID)'];

    //총 페이지 갯수
    $boardTotalCount = ceil($boardTotalCount/$viewNum);

    // 1 2 3 4 5 6 [7] 8 9 10 11 12 13
    $pageView = 5;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

    //처음 페이지 초기화 / 마지막 페이지 초기화
    if($startPage < 1) $startPage = 1;
    if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;

    //글이 없을 때
    if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;

    //처음으로
    if($page != 1 && $page <= $boardTotalCount){
        $prevPage = $page - 1;
        echo "<li><a href='board.php?page=1'>처음으로</a></li>";
        echo "<li><a href='board.php?page={$prevPage}'>이전 페이지</a></li>";
    }

    //페이지
    for($i=$startPage; $i<=$endPage; $i++){
        $active = "";
        if($i == $page) $active = "active";

        echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
    }

    //마지막으로/다음
    if($page != $boardTotalCount){
        $nextPage = $page + 1;
        echo "<li><a href='board.php?page={$nextPage}'>다음</a></li>";
        echo "<li><a href='board.php?page={$boardTotalCount}'>마지막으로</a></li>";
    }

    
?>

 

$sql = "SELECT count(boardID) FROM board";
데이터베이스에 있는 게시판 테이블의 총 게시글 갯수를 가져오기 위한 SQL 쿼리입니다.
$result = $connect -> query($sql);
$sql 쿼리를 실행하여 결과값을 $result 변수에 저장합니다.
$boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
fetch_array() 함수를 이용하여 결과값을 배열 형태로 가져옵니다.
$boardTotalCount = $boardTotalCount['count(boardID)'];
가져온 결과값 중 'count(boardID)' 필드 값을 변수에 저장합니다.
$boardTotalCount = ceil($boardTotalCount/$viewNum);
페이지당 보여줄 게시글 수를 나누어 전체 페이지 수를 구합니다.
ceil() 함수를 이용하여 올림하여 정수로 반환합니다.
$pageView = 5;
현재 페이지에서 양 옆으로 몇 개의 페이지를 보여줄 것인지를 설정합니다.
$startPage = $page - $pageView;
현재 페이지에서 왼쪽에 보여줄 페이지 번호의 시작값을 구합니다.
$endPage = $page + $pageView;
현재 페이지에서 오른쪽에 보여줄 페이지 번호의 끝값을 구합니다.
$startPage < 1) $startPage = 1;
시작 페이지가 1보다 작으면 1로 초기화합니다.
$endPage >= $boardTotalCount) $endPage = $boardTotalCount;
끝 페이지가 전체 페이지 수보다 크거나 같으면 전체 페이지 수로 초기화합니다.
$active = "";
현재 페이지를 제외한 다른 페이지 번호는 active 클래스를 갖지 않도록 초기화합니다.
if($i == $page) $active = "active";
현재 페이지와 $i가 같으면 active 클래스를 부여합니다.
<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>;
각 페이지 번호를 누르면 해당 페이지로 이동할 수 있도록 링크를 생성합니다.
$prevPage = $page - 1;
이전 페이지의 번호를 구합니다.
echo "<li><a href='board.php?page=1'>처음으로</a></li>";
맨 처음 페이지로 이동할 수 있는 링크를 생성합니다.
echo "<li><a href='board.php?page={$prevPage}'>이전 페이지</a></li>";
이전 페이지로 이동할 수 있는 링크를 생성합니다.
$nextPage = $page + 1;
다음 페이지의 번호를 구합니다. 마지막으로는

총 게시글 갯수를 구하고 페이지 당 보여줄 게시글 수($viewNum)로 나누어서 총 페이지 갯수($boardTotalCount)를 구합니다.
그 다음, 현재 페이지($page)를 기준으로 이전/다음 페이지 그리고 현재 페이지를 중심으로 이전/다음 몇 페이지를 보여줄지 결정합니다. 이를 위해 $pageView 변수를 사용하고, $startPage와 $endPage 변수에 시작 페이지와 마지막 페이지를 할당합니다. 다만, 시작 페이지가 1보다 작으면 1로, 마지막 페이지가 총 페이지 수를 넘어가면 총 페이지 수로 설정합니다.
그 후, 첫 페이지로 가는 링크와 이전 페이지로 가는 링크를 출력합니다. 그리고 $startPage부터 $endPage까지 for문을 돌면서 각 페이지에 대한 링크를 출력합니다. 현재 페이지에 해당하는 페이지 번호에는 active 클래스를 추가하여 스타일링합니다.
마지막으로, 현재 페이지가 마지막 페이지가 아니면 다음 페이지로 가는 링크와 마지막 페이지로 가는 링크를 출력합니다.
즉, 해당 코드는 게시글 목록 페이지에서 페이지네이션을 구현하는데 필요한 페이지 번호를 계산하고, 이를 출력하는 부분입니다.

 

 

결과물