PHP

PHP로 사이트 만들기(게시판)

이미사용 2023. 4. 25. 20:46
명언
-
728x90
반응형

※게시판 (board.php)

전체소스

<?php
    $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 100";
    $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); // fetch_array 배열로 불러오기

                echo "<tr>";
                echo "<td>".$info['boardID']."</td>";
                echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</td>"; //?는속성과속성값설정 클릭한값의 보터ID를 가져옴 GET방식
                echo "<td>".$info['youName']."</td>";
                echo "<td>".date('Y-m-d', $info['regTime'])."</td>"; //php날짜데이터
                echo "<td>".$info['boardView']."</td>";
                echo "</tr>";
            }
        } else {       
            echo "<tr><td colsapn='4'>게시글이 없습니다.</td></tr>";
        }
    }
?>

- SQL에 저장된 게시판에 필요한 서로 다른 테이블 값을  JOIN으로 합쳐서 가져와 저장된값의 갯수만큼 테이블형식으로 불어옵니다.만약 저장된 게시글이 없다면 게시글이 없습니다가 나옵니다.

num_rows MySQLi 객체의 메서드 중 하나로, SELECT 쿼리에 대한 결과 집합에서 반환된 행(row)의 수를 반환합니다.
fetch_array PHP에서 MySQL 결과 집합에서 하나 이상의 행을 검색하고, 각 행에서 결과 데이터를 배열로 반환하는 함수입니다.

 


게시글 작성하기 (boardWrite.php)

전체소스

        <div class="board__inner">
            <div class="board__write">
                <form action="boardWriteSave.php" name="boardWriteSave" method="post">
                    <fieldset>
                        <legend class="blind">게시글 작성하기</legend>
                        <div>
                            <label for="boardTitle">제목</label>
                            <input type="text" id="boardTitle" name="boardTitle" class="inputStyle">
                        </div>
                        <div>
                            <label for="boardTitle">내용</label>
                            <textarea name="boardContents" id="boardContents" cols="30" rows="10" class="inputStyle"></textarea>
                        </div>
                        <button type="submit" class="btnStyle3">저장하기</button>
                    </fieldset>
                </form>
            </div>
        </div>

-게시글작성하는곳이며, 제목과 내용을 입력하고 저장하기 버튼을 눌렀을때 boardWriteSave.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')";

    $connect -> query($sql);
?>

<script>
    location.href = "board.php"//게시판으로다시돌아가기
</script>

- 게시글 작성에서 입력한 정보를 SQL에 저장하는 합니다.

- real_escape_string()를 넣어서 외부인이 제목이나 내용에 코드를 입력하여 사이트의 정보를 이용하지 못하도록 해줍니다.

그다음 location.href = "board.php"사용하여 게시판으로 돌아갑니다.

real_escape_string() MySQL 쿼리를 실행할 때, 쿼리 문자열의 특수문자를 이스케이프(escape)하여 SQL 인젝션(SQL injection) 공격을 방지하기 위한 함수입니다.
location.href 현재 페이지의 URL을 문자열로 반환합니다. 이 속성을 사용하면 현재 페이지의 URL을 가져오거나, 새로운 URL로 이동할 수 있습니다.

 


※게시글 자세히 보기 (boardView.php)

전체소스

<?php
    if(isset($_GET['boardID'])) { //isset은 변수가 설정되어 있으면 true를, 그렇지 않으면 false를 반환합니다
        $boardID = $_GET['boardID'];

        // echo $boardID;

        $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);

        $info = $result -> fetch_array(MYSQLI_ASSOC); // fetch_array 배열로 불러오기

        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 colsapn='4'>게시글이 없습니다.</td></tr>";
    }
?>

- 우선 조건문으로 $_GET['boardID']가 있을때 실행을 해며 올라가져 있는 게시글의 값을$_GET을 통해 가져와 boardID(게시글의 넘버)를 이용해  SQL에서 가져오는 boardID의 값이 같을때 정보를 SQL에있는 두개의 테이블을 join하여 원하는 값만을 가져 옵니다.

그후 그값을 fetch_array()로 통해 배열값으로 가져와 echo를 통해 테이블방식으로 불러온 데이터를 가져옵니다.

이때 PHP에서는 문자열에 값을 넣기위해서 양쪽에.(점)을 붙여줍니다.

<?php
    if(isset($_GET['boardID'])) {
        $boardID = $_GET['boardID'];
        
        $sql = "SELECT memberID FROM board WHERE boardID = {$boardID}";
        $result = $connect -> query($sql);
        $info = $result -> fetch_array(MYSQLI_ASSOC);

        // echo $info;
        // echo $_SESSION['memberID'];   
        // echo $info['memberID'];

        if($_SESSION['memberID'] == $info['memberID']){

            echo "<a style='margin-right: 5px;' href='boardModify.php?boardID={$_GET['boardID']}' class='btnStyle3'>수정하기</a>";
            echo "<a href='boardRemove.php?boardID={$_GET['boardID']}' class='btnStyle3' onclick=\"return confirm('정말 삭제 하겠습니까?')\">삭제하기</a>";
        }
    }
?>

- 마찬가지로 조건문으로 $_GET['boardID']가 있을때 실행을 하며 그게시판을 만든사람의 memberID값을 boardID에서 가져와 게시판을 만든 사람의 memberID 값과 현재 로그인 되어있는 사람의 memberID값이 같을때 echo를 통해 다음을 실행하도록 하였습니다. 이때 삭제하기의 confirm에 있는 return은 취소를 눌렀을때 삭제가 되지 않게 합니다.

 

\" \"을 쓴 이유는 HTML과 PHP 코드가 섞여있는 문자열을 출력하고 있기 때문입니다.

작은따옴표로 묶인 문자열 안에 작은따옴표를 사용하기 위해서는 이스케이프 문자인 역슬래시()를 사용해야 합니다. 또는,이 코드에서는 HTML 문자열 안에서 JavaScript 코드를 출력하고 있기 때문에, JavaScript 코드 안에 작은따옴표가 있으면 이스케이프 처리해주어야 합니다.

isset() 변수가 설정되어 있고, NULL이 아니라면 true를 반환하며, 그렇지 않은 경우 false를 반환합니다.

※게시글 삭제하기 (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>

삭제하기에 확인을 눌렀을때 실행 되며, 삭제하기를 누른boardID의 값을 가져와 그값과 없애려고 하는 boardID의 값이 같으면 게시글을 삭제하고 location.href를 사용하여 게시판으로 돌아갑니다.


※게시글 수정하기 (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>";
    }
?>

- $_GET을 통해 게시글의 boardID을 가져와 sql을 실행하여 그곳에 있는 boardID값과 같을때 출력을하며,

조건으로 출력한 값이 존재 할때 fetch_array을 이용하여 배열로 바꾼후 echo를 이용하여 불러 옵니다.

 

- 게시글 수정저장하기 (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);
    // $memberID = $_SESSION['memberID'];

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

?>

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

- 게시글 수정하기 에서 수정하기를 눌렀을때 수정된 데이터를 다시 SQL에 올려줍니다. 그후 board.php로 돌아갑니다.