PHP

php 게시판 적용

ture403 2023. 4. 26. 18:45

- Frederick Philips Brooks
Mythical Man-Month 저자
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"?>
    <!-- link -->
</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">
                <div class="intro_images small">
                    <!-- <img src="assets/img/intro01.png" alt="소개이미지"> -->
                    <picture>
                        <source srcset="../assets/img/board01.png , ../assets/img/board01@2x.png 2x, ../assets/img/board01@3x.png 3x">
                        <img src="../assets/img/board01.png" alt="소개이미지">
                    </picture>
                </div>
                <h2>게시판</h2>
                <p class="intro_text">
                    웹디자이너, 웹퍼블리셔,프론트엔드 개발자를 위한 게시판입니다.
                    <br>관련된 문의사항은 여기서 확인하세요.
                </p>
        </div>

        <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></td>
                            <td>전윤기</td>
                            <td>2023-04-24</td>
                            <td>100</td>
                        </tr> -->
<?php
	//get으로 page를 갖고와서 정수로 변경
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page =1;
    }

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


    $sql = "SELECT b.boardID , b.boardTitle, m.youName, b.regTime, b.boardView  FROM board b JOIN mymember 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></tr>";
        }
    }
?>
                    </tbody>
                </table>
            </div>
            <div class="board_pages">
                <ul>
<?php
    // 게시글 총 갯수
    // 몇 페이지가 나오는지?
    // $page = 1;

    

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

    $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 ){
        echo "<li><a href='board.php?page=1'>처음으로</a></li>";
        $prevPage = $page-1;
        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="#">8</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>

 

총정리

이 게시판은 제목, 작성자, 등록일 및 조회수를 포함한 글 목록을 표시하며, 사용자는 글을 검색하고 새로운 글을 작성할 수 있습니다. 페이지당 표시되는 글 수는 $viewNum 변수를 수정하여 변경할 수 있으며, 현재는 10으로 설정되어 있습니다.

이 스크립트는 먼저 데이터베이스 연결 정보와 세션 관리 코드가 포함된 connect.php 및 session.php 파일을 포함합니다. 그리고 HTML head 요소를 포함하는 head.php 파일을 포함합니다.

페이지의 주요 본문은 접근성을 위한 스킵 링크가 있는 skip.php 파일로 시작하며, 이어서 탐색 막대가 있는 header.php 파일이 포함됩니다.

페이지의 본문은 소개 섹션과 게시판 섹션으로 나뉩니다. 소개 섹션은 게시판의 이미지, 제목 및 간단한 설명을 표시하고, 게시판 섹션은 검색 창, 글 목록 테이블 및 페이지네이션 링크를 표시합니다.

검색 창은 사용자가 제목, 내용 또는 작성자로 글을 검색할 수 있도록 합니다. board_table 섹션에서는 글 정보가 포함된 테이블이 표시됩니다. 글 정보는 SQL 쿼리를 실행하여 데이터베이스에서 가져옵니다. 이 쿼리는 회원 ID와 게시판 ID를 기준으로 board 및 mymember 테이블을 JOIN 연산하여 결합합니다. LIMIT 절은 현재 페이지와 페이지당 표시되는 글 수를 기반으로 쿼리에서 반환되는 행 수를 제한하는 데 사용됩니다.

페이지네이션 링크는 총 글 수와 페이지당 표시되는 글 수를 기반으로 총 페이지 수를 반복하여 생성됩니다. 루프는 각 페이지에 대한 링크를 생성하고 현재 페이지에 해당하는 링크를 강조합니다.

마지막으로, 이 스크립트는 저작권 공지 및 HTML 태그를 닫는 footer.php 파일로 끝납니다.

 

부분정리

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

이 코드는 현재 페이지 번호를 가져오는데 사용됩니다. 먼저, $_GET['page'] 쿼리 문자열 매개 변수가 설정되어 있는지 확인합니다. 쿼리 문자열 매개 변수는 URL의 끝에 ?page=2와 같이 추가된 매개 변수를 의미합니다.
만약 매개 변수가 설정되어 있다면, $_GET['page'] 값 (정수로 변환)을 $page 변수에 할당합니다. 매개 변수가 설정되어 있지 않으면 $page 변수를 1로 할당합니다.
이렇게 하면 현재 페이지 번호를 가져올 수 있으며, 페이지 번호가 설정되지 않은 경우 기본값으로 1이 사용됩니다.

 

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


$sql = "SELECT b.boardID , b.boardTitle, m.youName, b.regTime, b.boardView  FROM board b JOIN mymember 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></tr>";
    }
}

이 부분은 데이터베이스에서 게시판의 글 목록을 가져오는 부분입니다.

먼저, 한 페이지에 보여줄 게시글 수를 정하고, 현재 페이지 번호를 계산합니다. 이를 기반으로, 해당 페이지에 보여줄 게시글의 범위를 설정합니다.

그 후, 게시글 정보를 가져오는 SQL 쿼리를 작성합니다. 이 쿼리는 게시글 정보가 담긴 board 테이블과 작성자 정보가 담긴 mymember 테이블을 조인하여, 게시글 ID, 제목, 작성자 이름, 작성 일시, 조회 수를 가져옵니다. 게시글 ID 역순으로 정렬하고, 현재 페이지에 해당하는 게시글 범위만 가져오도록 제한합니다.

쿼리를 실행한 후, 결과를 반복문을 통해 출력합니다. 각 게시글의 ID, 제목, 작성자 이름, 작성 일시, 조회 수를 출력하고, 제목에는 해당 게시글을 볼 수 있는 링크를 추가합니다. 만약 가져온 게시글이 없다면 "게시글이 없습니다"라는 메시지를 출력합니다.

 

$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 ){
    echo "<li><a href='board.php?page=1'>처음으로</a></li>";
    $prevPage = $page-1;
    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>";
}

먼저, $viewNum 변수에는 한 페이지에 보여줄 게시글 수가 할당됩니다. 그리고 $page 변수는 GET 방식으로 넘어오는 현재 페이지 값입니다. 이때, GET 방식으로 page 값이 없으면 기본적으로 1페이지를 보여주도록 합니다.

다음으로, 전체 게시글 수를 구하기 위해 SQL 문으로 "SELECT count(boardID) FROM board" 를 실행하고, 결과값을 $boardTotalCount 변수에 할당합니다. 이때, fetch_array() 함수를 사용해 배열 형태로 결과값을 받아옵니다. 그 후, ceil() 함수를 사용하여 총 페이지 수를 구합니다.

그 다음, 페이지네이션에서 보여줄 페이지 수를 $pageView 변수에 할당합니다. 이때, 현재 페이지 번호를 중심으로 좌우로 $pageView 개의 페이지 번호를 보여줍니다. 그리고, $startPage 변수와 $endPage 변수를 이용하여 현재 페이지 번호를 중심으로 좌우로 보여줄 페이지 번호의 범위를 지정합니다.

그 다음, 처음 페이지와 마지막 페이지를 초기화합니다. $startPage 가 1보다 작으면 1로 초기화하고, $endPage 가 $boardTotalCount 보다 크거나 같으면 $boardTotalCount 로 초기화합니다.

그 다음, 페이지 번호를 출력합니다. 먼저, 현재 페이지 번호가 1이 아니고 $boardTotalCount 보다 작거나 같으면 "처음으로"와 "이전" 링크를 출력합니다. 그리고, $startPage 부터 $endPage 까지 for 문을 이용하여 각 페이지 번호와 해당 페이지로 이동하는 링크를 출력합니다. 이때, 현재 페이지 번호는 active 클래스를 가지도록 합니다.

마지막으로, 현재 페이지 번호가 $boardTotalCount 가 아니고 $boardTotalCount 보다 작거나 같으면 "다음"과 "마지막으로" 링크를 출력합니다. 이때, $nextPage 변수를 이용하여 "다음" 링크의 주소를 구합니다.