본문 바로가기
PHP

PHP 게시판(2)

by dongjin6539 2023. 4. 26.
728x90
반응형

PHP 게시판(2)

 

참고 코드 사이트

 

게시판 수정 시 비밀번호 필요 
<?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 방식으로 boardID, boardTitle, boardContents, boardPass를 변수로 저장해줍니다.
  • 다음 해킹을 방지하기 위해 real_escape_string( )를 사용해줍니다.
  • 다음 로그인 되어 있는 memberID를 가져오기 위해 세션을 이용하여 해당 회원의 정보를 조회하는 쿼리문을 작성하고 if문을 사용해서 변수 info로 회원의 정보를 배열로 가져옵니다.
  • 다음 if문을 사용해서 변수 info의 memberID와 게시판의 memberID와 같은지 확인하고 변수 info의 youPass와 게시판의 boardPass가 같은지 확인하는데 &&연산자를 사용해서 두 결과 모두 true일 때 실행하게 해줍니다.
  • 비밀번호가 일치하는 경우에만 게시글을 수정할 수 있도록 UPDATE 쿼리를 실행합니다. 
  • 만약에 결과가 false이면 비밀번호가 틀렸거나 조회된 결과가 없는 경우, 각각 해당 오류에 대한 경고창을 출력합니다.

 

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

작성 방법

  • PHP 세션을 사용하여 로그인 여부를 체크하는 코드입니다.
  • 로그인이 되어있지 않을 경우, 즉 $_SESSION['memberID'] 변수가 설정되어 있지 않을 경우, 로그인 페이지로 이동하게끔 합니다.
  • 이를 통해 로그인하지 않은 사용자가 접근할 수 없는 페이지에 대한 보안을 강화할 수 있습니다.
  • 여기서 Header( ) 함수는 HTTP 헤더를 보내는 함수입니다. Location 헤더를 설정하여 페이지 이동을 실행합니다. 이 때, Location 헤더에 설정된 URL로 이동하면서 현재 페이지의 코드 실행이 중지되므로, 이후 코드는 실행되지 않습니다.
  • 해당 코드는 로그인한 사용자만 접근할 수 있는 페이지에 접근할 때, 로그인 페이지로 리다이렉트시켜 보안성을 높이는 역할을 합니다.

 

게시판 페이지 수 버튼
<?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>";
            }
        }  else {
            echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
        }
    }
?>

<?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){
        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>";
    } 
?>

작성 방법

  • if문을 사용해서 GET 방식으로 page의 값을 불러오는데 true이면 $page의 값을 숫자열로 불러오게 하고 아니면 $page의 값을 1로 저장한다. 
  • 필요한 변수를 만들기 위해서 변수 $viewNum의 데이터를 10으로 저장하고 변수 $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}"; 으로 LIMIT 부분에 page의 값이 변할 수 있으므로 숫자로 정하지 않고 변수의 값으로 입력해 실행시켜줍니다. 다음 변수 $result로 SQL문을 실행시켜서 연결시켜줍니다.
  • 아래 if문은 게시판 보기 블로그(https://dongjin6539.tistory.com/91)에서 이미 사용했던 그대로 사용해줍니다.
  • 다음 php블럭에서 변수 $sql을 board 테이블에 boardID가 몇개가 있는지 가지고 와줍니다. 다음 변수 $result로 SQL문을 실행시켜서 연결시켜줍니다.
  • 변수 $boardTotalCount를 변수 $result 실행시켜 나온 값을 배열로 저장해줍니다. 다시 $boardTotalCount를 갯수를 가져옵니다. 게시글 총 갯수에 따라 총 페이지 갯수가 몇개인지 알기 위해서 위에서 저장한 $viewNum의 값을 $boardTotalCount를 나눠서 올림을 해줘서 페이지의 갯수를 구합니다.
  • 이제 해당 페이지의 양옆으로 몇개의 페이지를 추가로 나오는지 해줄건데 먼저 변수 $pageView를 5로 저장해주고 앞으로 나올 페이지를 변수 $startPage로 설정하고 해당하는 $page의 값에 $pageView를 빼주고 뒤로 나올 페이지를 변수 $endPage로 설정하고 해당하는 $page의 값에 $pageView를 더해줍니다.
  • 위와 같이 하면 음수가 나오거나 마지막 페이지보다 큰 숫자가 5개씩 더 나올겁니다. 그러기 위해서 // 처음 페이지 초기화, 마지막 페이지 초기화를 해줍니다. if문을 사용해서 $startPage의 값이 1보다 작으면 $startPage의 값을 1로 저장하게 해주고 $endPage의 값이 페이지의 갯수인 $boardTotalCount보다 크면은 $endPage의 값을 $boardTotalCount로 저장하게 해줍니다.
  • 이제 처음으로와 이전 버튼을 만들어줍니다. // 처음으로, 이전 구역에서 if문을 사용해서 해당하는 페이지의 $page의 값이 1이 아니고 $page의 값이 $boardTotalCount보다 작으면 나오게 해주는 데 이전 버튼은 $page의 값이 하나씩 줄어들어야 하므로 변수 $prevPage를 만들어서 $page-1을 해줘서 a링크 태그에 입력해줍니다.
  • // 페이지 구역에서 페이지의 갯수만큼 버튼이 나오게 해줍니다. for문을 이용해서 나열시켜줍니다. $i는 $startPage의 값으로 시작하고 $i의 값이 $endPage의 값까지만 반복문을 실행시켜줍니다. 그래서 a링크 태그에 $i를 입력해서 반복시켜주게 해줍니다. 그리고 해당 페이지에는 active효과를 주기 위해서 css를 미리 만들어 주고 변수 $active를 만들고 if문을 사용해서 변수 $i의 값이 $page의 값과 같으면 $active의 값을 active로 저장해주고 태그에 class를 만들고 $active를 입력해 스타일을 가지게 해줍니다.
  • 이제 다음, 마지막으로 버튼을 만들어줍니다. // 다음, 마지막으로 구역에서  if문을 사용해서 해당하는 페이지의 $page의 값이 $boardTotalCount가 아니고 $page의 값이 $boardTotalCount보다 작으면 나오게 해주는 데 다음 버튼은 $page의 값이 하나씩 늘어나야 하므로 변수 $nextPage를 만들어서 $page+1을 해줘서 a링크 태그에 입력해줍니다.

 

728x90
반응형