Bomb Kirby Running

MySQL&PHP

PHP로 게시판 만들기(버그 수정 및 기능추가)

^. ̫ .^ 2023. 4. 26. 12:36

728x90

어제 만든 PHP 게시판에 버그를 수정하고 기능을 추가하였습니다.

 

sessionCheck.php

<?php
    if(!isset($_SESSION['memberID'])){
        Header("location:../login/login.php");
    }
?>

connect 파일 안에 sessionCheck.php를 만들어 회원인지 아닌지 체크합니다.

 

 

boardModify.php

<?php
    $boardID =$_GET['boardID'];
    $memberID = $_SESSION['memberID'];

    $sql = "SELECT boardID, boardTitle, boardContents FROM board WHERE boardID = {$boardID}";
    $result = $connect -> query($sql);

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

        echo "<div style='display:none'><label for='boardID'>번호</label><input type='text' id='boardID' name='boardID' class='inputStyle' value='".$info['boardID']."'></div>";
        echo "<div><label for='boardTitle'>제목</label><input type='text' id='boardTitle' name='boardTitle' class='inputStyle' value='".$info['boardTitle']."'></div>";
        echo "<div><label for='boardContents'>내용</label><textarea name='boardContents' id='boardContents' rows='20' class='inputStyle'>".$info['boardContents']."</textarea></div>";
        echo "<div class='mt50'><label for='boardPass'>비밀번호</label><input type='password' id='boardPass' name='boardPass' class='inputStyle' autocomplete='off' requied placeholder='글을 수정하려면 로그인 비밀번호를 입력하셔야 합니다.'></div>";  
    }
?>

비밀번호를 적을 영역을 추가해주었습니다.

 

boardModifySave.php

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

post 방식으로 비밀번호를 받아옵니다.

비밀번호를 Injection 공격에 대비하여 Escape 처리합니다.

세션 변수에서 회원 ID를 가져온 다음, 해당 회원의 정보를 데이터베이스 테이블 'members'에서 선택합니다.

회원 정보를 성공적으로 검색하면, 코드는 해당 회원의 ID와 비밀번호를 확인합니다.

만약 회원 ID와 비밀번호가 일치하면, 입력한 게시판 제목과 내용으로 게시판 정보를 업데이트합니다

그러나, 만약 회원 정보를 가져오는 데 문제가 발생하면 '관리자 에러!!' 메시지를 출력하고, 만약 회원 ID나 비밀번호가 일치하지 않으면 '비밀번호가 틀렸습니다. 다시 한번 확인해주세요!' 메시지를 출력합니다.

 

board.php

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

    $viewNum =20;
    $viewLimit = ($viewNum * $page) - $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></tr>";
        }
    }
?>

'page' 변수가 GET 요청으로 전달되었는지 확인합니다. 만약 전달되었다면, 'page' 변수 값을 정수형으로 변환하여 $page 변수에 할당합니다. 그렇지 않은 경우, $page 변수에 1을 할당합니다.

한 페이지에 보여줄 게시글 수를 나타내는 $viewNum 변수를 설정합니다. 그리고 페이지의 시작 위치를 계산하기 위해 $viewLimit 변수를 설정합니다.

게시판 정보를 가져오기 위해 $sql 변수에 쿼리문으로 게시판 정보와 작성자의 이름, 등록시간, 조회수 등을 가져오고, 게시판 ID를 기준으로 내림차순으로 정렬한 후, $viewLimit 변수와 $viewNum 변수를 사용하여 해당 페이지에 표시할 게시글 범위를 지정합니다.

결과를 가져오기 위해 $connect 객체의 query() 메소드를 호출하고, 결과는 $result 변수에 할당됩니다.

 

 

<?php
    $sql = "SELECT count(boardID) FROM board";
    $result = $connect -> query($sql);

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


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

    //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 && $boardTotalCount !=0 && $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";
        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>";
    }
?>

board 테이블에서 SQL 쿼리로 boardID의 개수를 조회합니다.

MySQL 데이터베이스에 $sql 쿼리를 실행하고 결과를 $result 변수에 저장합니다.

$result에서 첫 번째 레코드를 배열로 가져옵니다.

$boardTotalCount 변수에 boardID의 개수를 저장합니다.

$boardTotalCount를 페이지당 게시물 수인 20으로 나누고 올림하여 페이지 수를 계산합니다.

$pageView는 페이지 번호를 표시할 때 현재 페이지를 중심으로 양 옆으로 보여질 페이지 수입니다.

$startPage는 현재 페이지 번호를 중심으로 시작 페이지 번호를 계산합니다.

$endPage 현재 페이지 번호를 중심으로 끝 페이지 번호를 계산합니다.

if($startPage < 1) $startPage = 1; 시작 페이지 번호가 1보다 작으면 1로 초기화합니다.

if($endPage >= $boardTotalCount) $endPage = $boardTotalCount; 끝 페이지 번호가 총 페이지 수보다 크거나 같으면 총 페이지 수로 초기화합니다.

if($page != 1 && $boardTotalCount !=0 && $page <= $boardTotalCount){} 페이지가 1이 아니고 게시물이 존재하며 현재 페이지가 총 페이지 수보다 작거나 같을 때 실행됩니다. "처음으로"와 "이전" 링크를 출력합니다.

$prevPage = $page -1; 이전 페이지 번호를 계산합니다.

if($page <= $boardTotalCount){}현재 페이지가 총 페이지 수보다 작거나 같으면 실행됩니다.

$active 변수를 초기화하고, 만약 현재 페이지 번호와 $i가 같으면 $active 값을 "active"로 변경합니다

페이지 번호와 링크를 출력합니다.

if($page != $boardTotalCount && $page <= $boardTotalCount){}

이지가 총 페이지 수보다 작거나 같고 마지막 페이지가 아닐 때 실행됩니다.

"다음"과 "마지막으로" 링크를 출력합니다.

다음 페이지 번호를 계산합니다.