MySQL

MYSQL PHP 게시판 사이트 페이지 넘어가게 만들기

김도현2 2023. 4. 26. 16:58
만약 우리가 할 수 있는 일을 모두 한다면 우리들은 우리자신에 깜짝 놀랄 것이다.
- 에디슨
반응형

MYSQL PHP 게시판 사이트 페이지 넘어가게 만들기

게시글 데이터수에 따라 페이지 수를 조절하고 누르면 이동할 수 있게 작동이 되게끔 만들었습니다.

 

 

 

 

 

 

 

[ 게시판 html 입니다. 작동이 되지 않는 껍다구 입니다. ]

 

 

 

 

 

 

게시판 php하단 페이지버튼 입니다.

페이지 수에서 +-5 페이지까지만 출력이 되고

 

처음 페이지에선 [처음으로], [이전] 버튼이 사라지고.

마지막 페이지에선 [다음], [마지막으로] 버튼이 사라지게 됩니다.

 

 

 

 

또한 게시글이 없을 경우 버튼이 싹 다 사라지게됩니다.

 

 

 

 

 

php

<?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 bmStyle center">
                <picture class="intro__images small">
                    <source srcset="../assets/img/joinEnd01.png, ../assets/img/joinEnd01@2x.png 2x, ../assets/img/joinEnd01@3x.png 3x"/>
                    <img src="../assets/img/joinEnd01.png" alt="게시판이미지">
                </picture>
                <h2>게시판</h2>
                <p class="intro__text">
                    웹 디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 개시판입니다.
                    관련된 사항은 여기서 확인하세요!
                </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="neme">등록자</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></td>
                                <td>이름</td>
                                <td>2022-02-02</td>
                                <td>100</td>
                            </tr> -->
<?php
    // $page = 1;
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page = 1;
    }

    //페이지 LIMIT
    $viewNum = 20;
    $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>";
            }
        } else {
            echo "<tr><td colspan='4'>게시글이 없습니다.</td></td>";
        }
    }
?>
                        </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);

    //페이지 숫자 (플마 5까지)
    $pageView = 5;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

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

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

    //처음으로, 이전페이지
    if($boardTotalCount > 1 && $page <= $boardTotalCount){
        if($page != 1){
            $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++){
        if($i>0 && $i<=$boardTotalCount && $page <= $boardTotalCount){
            $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>";
    }

    //게시글이 없을 때
    
?>
                        <!-- <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
    //주소창에 (페이지=숫자)가 있을시 숫자를 정수로 변환, 없을시 (페이지=1) 을 기본으로
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page = 1;
    }

    //페이지 LIMIT
    $viewNum = 20;
    $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>";
            }
        } else {
            echo "<tr><td colspan='4'>게시글이 없습니다.</td></td>";
        }
    }
?>
                        </tbody>
                    </table>
                </div>
                <div class="board__pages">
                    <ul>
<?php

 

html 사이에 게시판php 부분입니다.

이 php 부분에서 URL 페이지 숫자 부분을 GET방식을 이용하여 값을 가져 옵니다.

게시글 데이터를 LIMIT를 이용하여 몇개씩 볼것인지 정합니다.

 

데이터베이스를 조회하여 해당되는 데이터가 있을 시 게시판 php에 출력이 됩니다.

데이터가 없을 시 ' 게시글이 없습니다 ' 문구가 출력 됩니다.

 

 

 

 

<?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);

    //페이지 숫자 (플마 5까지)
    $pageView = 5;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

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

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

    //처음으로, 이전페이지
    if($boardTotalCount > 1 && $page <= $boardTotalCount){  //현재 페이지가 총 게시물 페이지를 넘어갈시 출력안됨
        if($page != 1){
            $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++){
        if($i>0 && $i<=$boardTotalCount && $page <= $boardTotalCount){  //현재 페이지가 총 게시물 페이지를 넘어갈시 출력안됨
            $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 변수에는 "board" 테이블의 게시글 총 갯수를 구하는 SQL 쿼리가 할당됩니다. 그리고 $result 변수에는 이 쿼리를 실행한 결과를 저장합니다.

 

$boardTotalCount 변수에는 $result에서 가져온 데이터를 배열 형태로 저장합니다. 이때, fetch_array() 함수를 사용하여 MYSQLI_ASSOC 상수를 지정하여 연관 배열로 가져오도록 합니다. 그리고, 배열의 'count(boardID)' 키 값을 가져와 게시글 총 갯수를 할당합니다.

 

게시글 총 갯수를 페이지당 보여줄 게시글의 갯수로 나누어 총 페이지 갯수를 구합니다. 이때, ceil() 함수를 사용하여 소수점 이하를 올림합니다.

 

$pageView 변수는 페이지네이션에 보여줄 페이지 수를 설정합니다. $startPage와 $endPage 변수에는 $page 변수를 기준으로 이전 $pageView 페이지와 이후 $pageView 페이지를 각각 할당합니다.

 

페이지네이션의 처음과 이전 페이지를 출력합니다. 이때, $boardTotalCount 변수가 1보다 크고, $page 변수가 총 페이지 갯수를 넘어가지 않을 때만 출력합니다. $prevPage 변수에는 현재 페이지의 이전 페이지 번호를 할당합니다. 출력할 링크에는 "board.php?page=1"과 "board.php?page={$prevPage}"를 사용하며, 각각 "처음으로"와 "이전"을 표시합니다.

 

페이지를 출력합니다. $startPage부터 $endPage까지의 범위에서 $i 변수를 반복문을 사용하여 페이지 번호를 출력합니다. 이때, $i 변수가 0보다 크고, $i 변수가 총 페이지 갯수를 넘어가지 않으며, $page 변수가 총 페이지 갯수를 넘어가지 않을 때만 출력합니다. $active 변수는 현재 페이지와 $i 변수가 같으면 "active" 클래스를 할당합니다. 출력할 링크에는 "board.php?page={$i}"를 사용하며, 페이지 번호를 표시합니다.

 

페이지네이션의 다음 페이지와 마지막 페이지를 출력합니다. 이때, $page 변수가 총 페이지 갯수보다 작을 때만 출력합니다. $nextPage 변수에는 현재 페이지의 다음 페이지 번호를 할당합니다. 출력할 링크에는 "board.php?page={$nextPage}"와 "board.php?page={$boardTotalCount}"를 사용하며, 각각 "다음"과 "마지막으로"를 표시합니다.

 

 

 

 

 

게시판을 만들었던 방법을 보고싶다면?

https://ehcjswo.tistory.com/90

 

MYSQL PHP 게시판 사이트 만들기 (게시판, 글보기, 글쓰기, 글삭제, 글수정)

MYSQL PHP 게시판 사이트 만들기 게시판에서 게시판, 글보기, 글쓰기, 글삭제, 글수정이 가능한 사이트를 만들어 보겠습니다. [ 게시판 html 입니다. ] php 글쓰기를 누르면 글쓰기 php로 이동합니다.

ehcjswo.tistory.com