Winnie The Pooh Bear php 게시판 페이지만들기(글작성, 수정, 삭제)

배움기록/PHP

php 게시판 페이지만들기(글작성, 수정, 삭제)

코딩은 처음이라 2023. 4. 25. 22:41

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

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

php 게시판 페이지만들기(글작성, 수정, 삭제)

 

 

게시판 페이지

전체 코드 보기

 

board.php

<?php
    $sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT 10";
    $result = $connect -> query($sql);

    if($result){
        $count = $result -> num_rows;

        if($count > 0){
            for($i=1; $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']."</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>";
        }
    }
?>

$boardID 변수는 GET 메소드로 전달된 boardID 파라미터의 값을 저장합니다.

 

$sql 변수는 데이터베이스에서 데이터를 검색하기 위한 SQL쿼리를 저장합니다.

board와 members 라는 두 개의 테이블에서 boardCounts, boardTitle, youName, regTime, boardView 열을 선택해

memberID 필드를 기준으로 두 테이블을 조인합니다.

 

쿼리는 URL에서 얻은 boardID값에 따라 결과를 필터링 합니다.

 

$reslut 변수는 $connet라는 데이터 베이스 연결 객체의 query() 메소드를 사용해 SQL 쿼리를 실행한 결과를 저장해 데이터베이스에서 반환된 결과 집합을 나타냅니다.

 

$info 는 fetch_array()메소드를 사용해 결과집합에서 얻은 연관 배열을 저장합니다.

echo는 PHP문장으로, 데이터베이스에서 검색한 결과를 HTML 테이블 형태로 출력합니다.

 

 

게시글 작성하기

전체 코드 보기

boardWrite.php

 

데이터가 들어갈 부분만 작업해줍니다.

 

 

게시글 저장하기

전체 코드 보기

boardWriteSave.php

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

    $boardTitle = $_POST['boardTitle'];
    $boardContents = $_POST['boardContents'];
    $boardView = 1;
    $regTime = time();
    $memberID = $_SESSION['memberID'];

    $boardTitle = $connect -> real_escape_string($boardTitle);
    $boardContents = $connect -> real_escape_string($boardContents);
    
    $sql = "INSERT INTO board(memberID, boardTitle, boardContents, boardView, regTime) VALUES('$memberID', '$boardTitle', '$boardContents', '$boardView', '$regTime')";
    // echo $sql;
    $connect -> query($sql);
?>

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

POST 방식으로 전달된 boardTitle 데이터를 변수 $boardTitle에 저장합니다.

$boardContents = POST방식으로 전달된 boardContents 데이터를 변수 $boardContents에 저장합니다.

 

$boardView = 1변수 $boardView에 1을 할당해 게시글의 조회수를 초기화하고

$regTime = time() 으로 현재 시간을 변수 $regTime에 저장합니다.

 

$memberID = $_SESSION['memberID'] 세션에 저장된 memberID 데이터를 변수 memberID에 저장합니다.

 

$boardTitle = $connect -> real_escape_string($boardTitle)변수 $boardTitle에 저장된 데이터를 MySQL의 특수문자를 이스케이프 하여 SQL인젝션 공격을 방지하기 위해 처리합니다. $boardContents도 마찬가지

 

SQL 쿼리를 생성해 게시글 정보를 데이터베이스에 저장합니다.

 

$connect -> query($sql) 생성된 SQL 쿼리를 실행해 게시글 정보를 데이터베이스에 저장합니다.

 

 

게시글 보기

전체 코드 보기

boardView.php

<?php
    if(isset($_GET['boardID'])) {
        $boardID = intval($_GET['boardID']);
        
        if($boardID > 0) {

            $sql = "SELECT b.boardContents, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(m.memberID = b.memberID) WHERE b.boardID = {$boardID}";
            $result = $connect->query($sql);

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

                echo "<tr><th>제목</th><td>".$info['boardTitle']."</td></tr>";
                echo "<tr><th>등록자</th><td>".$info['youName']."</td></tr>";
                echo "<tr><th>등록일</th><td>".date('Y-m-d', $info['regTime'])."</td></tr>";
                echo "<tr><th>조회수</th><td>".$info['boardView']."</td></tr>";
                echo "<tr><th>내용</th><td>".$info['boardContents']."</td></tr>";
            } else {
                echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
            }
        } else {
            echo "<tr><td colspan='4'>잘못된 게시글 ID입니다.</td></tr>";
        }
    } else {
        echo "<tr><td colspan='4'>게시글 ID가 전달되지 않았습니다.</td></tr>";
    }
?>

GET방식으로 전달된 boardID 라는 파라미터의 존재 여부를 체크합니다.

 

boardID가 존재하는 경우, 해당 값에 대한 정수형 변환을 수행,

boardID가 0보다 큰 경우, 게시글 정보를 가져오기 위한 SQL 쿼리를 생성합니다.

boardID를 조건으로 하여 board 테이블과 memers 테이블을 조인하고 필요한 정보를 선택적으로 조회합니다.

 

결과가 존재하면 정보를 출력하고, 존재하지 않을 경우 게시글이 없습니다. 라는 메시지를 출력합니다.

 

boardID가 0 이하인 경우 잘못된 게시글 ID입니다 라는 메시지를 출력 boardID가 전달되지 않은 경우 게시글 ID가 전달되지 않았습니다. 라는 메시지를 출력합니다.

 

수정하기, 삭제하기, 목록보기 링크

<div class="board__btn mb100">
    <a href="boardModify.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3">수정하기</a>
    <!-- <a href="boardRemove.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3" onclick="confirm('정말 삭제할거니?', '')">삭제하기</a> -->
    <a href="boardRemove.php?boardID=<?=urlencode($_GET['boardID'])?>" class="btnStyle3" onclick="return confirm('정말 삭제할거니?')">삭제하기</a>
    <a href="board.php" class="btnStyle3">목록보기</a>
</div>

수정하기 : 현재 게시물의 boardID를 파라미터로 가지고 있는 boardModify.php 페이지로 이동,

삭제하기 : 현재 게시물의 boardID를 파라미터로 가지고 있는 boardRemove.php페이지로 이동, 클릭시 confirm 함수가 호출되어 삭제할건지 묻고 확인을 누르면 삭제완료, 취소를 누르면 다시 전 화면으로 돌아갑니다.

목록보기 : board.php로 페이지를 이동해 목록을 볼 수 있게 해줍니다.

 

 

게시글 수정하기

전체 코드 보기

 

boardModify.php

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

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

$boardID변수에는 $_GET['board'] 를 통해 URL 매개변수로 전달된 게시글 ID값이 저장됩니다.

이를 통해 조회할 게시글의 ID를 지정합니다!

 

$sql 변수를 통해 SQL문을 작성

$boardID 변수를 사용해 조회할 게시글의 ID를 동적으로 지정합니다.

 

$result 변수에는 $sql 쿼리를 실행한 결과가 저장되어 있습니다.

$result 가 성공적으로 실행되면 $info 변수에는 조회된 게시글의 필드 값이 배열 형태로 저장됩니다.

 

echo함수를 통해 $info 배열에 저장된 게시글의 제목과 내용을 화면에 출력하는 HTML 코드를 생성합니다.

 

 

 

게시글 수정완료(업데이트)

boardModifySave.php

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

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

    $boardTitle = $connect -> real_escape_string($boardTitle); 
    $boardContents = $connect -> real_escape_string($boardContents);

    $sql = "UPDATE board SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}' WHERE boardID = '{$boardID}'";
    $connect -> query($sql);

    // echo $boardID, $boardTitle, $boardContents;
?>

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

게시글의 수정을 처리하는 코드만 넣어주면 됩니다.

$_POST 를 통해 전달된 게시글 ID, 제목, 내용을 각각 $boardID, $boardTitle, $boardCountents 변수에 저장

$counnect -> real_ecsape_string() 함수를 사용해 SQL 인젝션을 방지하기 위해 게시글 제목과 내용에 대해 이스케이프 처리를 수행합니다.

 

$sql 변수에는 게시글을 업데이트하는 SQL 쿼리가 저장되어 있습니다.

$boardID, $boardTitle, boardCountents 변수를 사용해 게시글의 ID, 제목, 내용을 동적으로 업데이트합니다.

 

$connect -> query()함수를 사용해 $sql쿼리를 실행해 게시글을 업데이트 합니다.

 

location.href를 사용해 현재 웹페이지의 URL을 가져옵니다.

 

 

 

게시글 삭제

boardRemove.php

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

    $boardID = $_GET['boardID'];
    $boardID = $connect -> real_escape_string($boardID);

    $sql = "DELETE FROM board WHERE boardId = {$boardID}";
    $connect -> query($sql);
?>

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

$_GET['board'] 를 사용해 URL의 쿼리 파라미터로부터 boardID값을 가져옵니다.

 

$connect -> real_escape_string($boardID)를 사용해 boardID 값을 SQL Injection으로 보호하기 위해 이스케이프 처리를 합니다.

 

$sql 변수에 삭제 쿼리를 작성, board 테이블에서 boardID가 boardID와 일치하는 행을 삭제합니다.

 

$connect -> query($sql)을 사용해 SQL쿼리를 실행해 게시물을 삭제합니다.

 

eal_escape_string : 입력된 문자열에서 다양한 특수문자를 이스케이프 처리

' ,  " , \ 등 이렇게 이스케이프 처리된 문자열은 SQL 쿼리에서 안전하게 쓸 수 있습니다.

 

반응형