Fast Blinking Hello Kitty

PHP

php게시판 만들기2

코른이되고싶은코린이 2023. 4. 26. 12:50

728x90

게시판만들기(메인보드 목록 번호눌러 페이지이동 및 게시판 수정하기)

page35 로 옮겼을 때 사라지는 아래 페이지 번호

코드블럭

<?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">
            <picture class="intro__images">
                <source srcset="../assets/img/intro01.png, ../assets/img/intro01@2x.png 2x, ../assets/img/intro01@3x.png 3x" />
                <img src="../assets/img/intro01.png" alt="소개이미지">
            </picture>
            <p class="intro__text">
                어떤 일이라도 노력하고 즐기면 그 결과는 빛을 바란다고 생각합니다.
                신입의 열정과 도전정신을 깊숙히 새기며 배움에 있어 겸손함을
                유지하며 세부적인 곳까지 파고드는 개발자가 되겠습니다.
            </p>
        </div>
        <!-- board__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></td>
                            <td>이은지</td>
                            <td>2023-04-24</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);

    // echo $boardTotalCount;
    //1 2 3 4 5 6 [7] 8 9
    $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";
        
        if($page <= $boardTotalCount){
        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>";
    } 

    //게시글이 없을 때 
    // if($page > $boardTotalCount || $boardTotalCount == 0){
    //     echo "<li style='display:none'><a href='board.php?page=1'>처음으로</a></li>";
    //     echo "<li style='display:none'><a href='board.php?page={$prevPage}'>이전</a></li>";
    //     echo "<li style='display:none'><a href='board.php?page={$nextPage}'>다음</a></li>";
    //     echo "<li style='display:none'><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="#">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>
    <?php include "../include/footer.php" ?>
    </main>
</body>
</html>

 

보충설명

✨게시글 총 갯수를 구하기 위해 MySQL 데이터베이스에서 board 테이블의 boardID 필드의 개수를 조회하는 쿼리를 실행하고 결과를 $boardTotalCount 변수에 저장합니다.

 

✨ 한 페이지에 보여줄 게시글 수($viewNum)로 총 페이지 수를 계산하기 위해 $boardTotalCount를 $viewNum으로 나눈 후 ceil() 함수를 사용하여 올림 처리하여 $boardTotalCount 변수에 다시 저장합니다.

 

✨ 현재 페이지를 중심으로 좌우로 5개씩의 페이지 번호를 보여주기 위해 $pageView 변수를 이용하여 $startPage와 $endPage 변수를 계산합니다.

 

✨ $startPage가 1보다 작을 경우 1로 초기화하고, $endPage가 $boardTotalCount보다 크거나 같을 경우 $boardTotalCount로 초기화합니다.

 

✨ 페이지 이동 버튼을 출력하는데, 처음으로 이동 및 이전 페이지로 이동 버튼은 현재 페이지가 1보다 크거나 같을 때 출력하며, 마지막으로 이동 및 다음 페이지로 이동 버튼은 현재 페이지가 $boardTotalCount보다 작거나 같을 때 출력합니다.

 

✨ 현재 페이지 번호와 $i 변수가 같으면 활성화된 페이지를 표시하기 위해 $active 변수를 사용하여 CSS 클래스를 추가한 후 페이지 번호를 출력합니다.

 

✨게시글이 없을 때는 페이지 이동 버튼을 출력하지 않습니다. 하지만 현재 페이지가 $boardTotalCount보다 크다면 $prevPage 변수를 계산할 수 없기 때문에 처음으로 이동 및 이전 페이지로 이동 버튼만 출력하며, 페이지 번호 및 다음 페이지로 이동 및 마지막으로 이동 버튼은 출력하지 않습니다.

 

게시글 수정하기 화면

코드블럭

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

    $boardID = $_POST['boardID'];
    $boardTitle = $_POST['boardTitle'];
    $boardContents = $_POST['boardContents'];
    $boardPass = $_POST['boardPass'];

    $boardTitle = $connect -> real_escape_string($boardTitle);
    $boardContents = $connect -> real_escape_string($boardContents);
    $boardPass = $connect -> real_escape_string($boardPass);
    $memberID = $_SESSION['memberID'];

    $sql = "SELECT * FROM members WHERE memberID = {$memberID}";
    $result = $connect -> query($sql);

    if($result){
        $info = $result -> fetch_array(MYSQLI_ASSOC);

        if($info['memberID']== $memberID && $info['youPass'] == $boardPass){
            $sql = "UPDATE board SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}'WHERE boardID = '{$boardID}'";
            $connect -> query($sql);
        } else {
            echo "<script>alert('비밀번호가 틀렸습니다. 다시한번 확인해주세요!')</script>";
        }
    }else {
        echo "<script>alert('관리자 에러!!')<script>";
    }

?>

<script>
    location.href = "board.php";
</script>

보충설명

✨ 이 코드는 게시글 수정을 처리하는 PHP 코드입니다.

✨  connect.php 파일과 session.php 파일을 불러옵니다. 그리고 게시글 번호($boardID), 제목($boardTitle), 내용($boardContents), 비밀번호($boardPass)를 POST 방식으로 전달 받습니다.

✨ real_escape_string() 함수를 사용하여 SQL Injection을 방지하기 위해 전달 받은 값들을 필터링합니다.

✨ 세션에 저장된 로그인한 사용자의 아이디($memberID)를 이용하여, 사용자 정보를 조회합니다. 조회된 정보와 비밀번호($boardPass)가 일치하면, 게시글 제목과 내용을 업데이트하는 SQL문을 실행합니다.

✨ 조회된 정보와 비밀번호가 일치하지 않으면, 경고 메시지를 출력합니다. 그리고 데이터베이스에 오류가 있으면, 관리자 에러 메시지를 출력합니다.

✨ 주석 처리된 코드는 SQL Injection 방어를 거치지 않은 코드이므로, 현재는 사용되지 않습니다.