MYSQL/php

php로 홈페이지 만들기_게시판 만들기

아라라_ 2023. 4. 26. 13:10

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

Frederick Philips Brooks
Mythical Man-Month 저자
728x90

오늘은 게시판에 페이지에 숫자를 눌러서 움직이는 것을 구현하였습니다.


전체

<?php
    include "../connect/connect.php";
    include "../connect/session.php";

    echo "<pre>";
    var_dump($_SESSION);
    echo "</pre>";
?>
<!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>PHP블로그 만들기</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">
                <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">
                    <p>* 총 <em>111</em> 건의 게시물이 등록 되었습니다.</p>
                </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></td>
                            <td>노지영</td>
                            <td>2023-04-24</td>
                            <td>100</td>
                        </tr> -->

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

    $viewNum = 20;
    $viewlimt = ($viewNum * $page) - $viewNum;

    // 1~20 DESC LIMIT 0,20     --> PAGE 1
    // 21~40 DESC LIMIT 20,20   --> PAGE 2
    // 41~60 DESC LIMIT 40,20   --> PAGE 3
    // 61~80 DESC LIMIT 60,20   --> PAGE 4

    $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 {$viewlimt}, {$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 "<pre>";
                // var_dump($info);
                // echo "</pre>";

                echo "<tr>";
                echo "<td>".$info['boardID']."</td>";
                echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";   //?boardId={$info['boardID'] : 겟방식으로 넘김
                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></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);

    // 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($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 && $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>
         <!-- //board__inner -->

    </main>
    <!-- //main -->
    <?php include"../include/footer.php"?>

</body>
</html>

전체적으로  설명하자면 MySQL 데이터베이스와 연동하여 게시글 목록을 가져옵니다. 게시글은 페이징 처리되어 한 페이지에 20개씩 출력되며 게시글을 클릭하면 해당 글을 볼 수 있는 페이지로 이동합니다. 또한, 로그인한 사용자만 글을 작성할 수 있도록 설정되어 있습니다.

 

 

글목록 출력

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

$viewNum = 20;
$viewlimt = ($viewNum * $page) - $viewNum;

// 1~20 DESC LIMIT 0,20     --> PAGE 1
// 21~40 DESC LIMIT 20,20   --> PAGE 2
// 41~60 DESC LIMIT 40,20   --> PAGE 3
// 61~80 DESC LIMIT 60,20   --> PAGE 4

$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 {$viewlimt}, {$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 "<pre>";
            // var_dump($info);
            // echo "</pre>";

            echo "<tr>";
            echo "<td>".$info['boardID']."</td>";
            echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";   //?boardId={$info['boardID'] : 겟방식으로 넘김
            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></tr>";
    }
};
  • 페이지 변수를 설정합니다. 만약 GET 방식으로 page 변수가 전달되면 해당 값을 가져오고, 그렇지 않으면 기본값으로 1을 설정합니다.
  • 그 후, 한 페이지에서 보여줄 글의 개수를 $viewNum 변수에 20으로 설정하고, 보여줄 글의 시작 위치를 계산하여 $viewlimt 변수에 할당합니다.
  • 그 다음, MySQL 데이터베이스에서 게시글을 불러오는 쿼리를 작성합니다. 게시판 테이블(board)과 회원 테이블(members)을 조인하여 게시글 번호(boardID), 제목(boardTitle), 작성자(youName), 작성일(regTime), 조회수(boardView)를 가져옵니다. 게시글은 boardID를 기준으로 내림차순으로 정렬하여 가져오며, LIMIT을 사용하여 $viewlimt부터 $viewNum개의 게시글만 가져옵니다.
  • 쿼리 결과가 있으면 결과의 개수($count)를 확인하고, 결과가 하나 이상이면 반복문을 사용하여 게시글을 하나씩 가져와서 출력합니다. 가져온 게시글의 정보는 $info 배열에 담겨 있으며, 반복문을 사용하여 게시글 번호, 제목, 작성자, 작성일, 조회수를 출력합니다.
  • 만약 결과가 없으면 "게시글이 없습니다."라는 메시지를 출력합니다.

 

 

 

페이지버튼출력

// 게시글 총 갯수
// 몇 페이지??

$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($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 && $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 쿼리문을 사용합니다. 그리고 총 페이지 수를 구하기 위해 전체 게시글 수를 페이지당 보여줄 게시글 수로 나누고 올림한 값을 구합니다.
  • 그 다음, 현재 페이지를 기준으로 앞뒤로 몇 개의 페이지를 보여줄지 결정하고, 시작 페이지와 끝 페이지를 설정합니다. 이 때, 시작 페이지나 끝 페이지가 1보다 작거나 총 페이지 수를 넘어가는 경우는 1로 초기화하거나 총 페이지 수로 설정합니다.
  • 그 후, 페이지네이션에 보여줄 페이지를 생성합니다. 현재 페이지와 같은 페이지는 활성화된 상태로 보여주기 위해 클래스를 추가하고, 페이지 번호에 맞는 링크를 생성합니다.
  • 마지막으로, 현재 페이지가 처음이나 마지막 페이지가 아닌 경우에는 처음으로/이전 페이지, 다음 페이지/마지막으로 버튼을 생성합니다. 이 때, 이전 페이지나 다음 페이지의 링크는 현재 페이지에서 1을 더하거나 빼서 만듭니다.