ETC

PHP. 게시글 수정하기

(*ᴗ͈ˬᴗ͈)ꕤ*.゚ 2022. 3. 24. 23:06

개요

순서가 뒤죽박죽이 되겠지만 내가 필요한 걸 우선 적겠다

 

게시글 수정하는 방법을 서술해보겠다

 

0단계 이 글을 이해하는 데 필요한 것

현재 boardModify.php에서 글을 수정하고 있다

 

1단계 boardModify.php에 글을 불러오자

 

0. 링크가 잘 되어있는지 확인하기(board.View.php)

<a href="boardModify.php?boardID=<?=$boardID?>">수정하기</a>

boardView.php에서 수정하기를 누르면 boardModify.php로 값이 넘어가는 방식이다.

boardView.php에 수정하기 버튼의 링크는 'boardID = 보드 아이디'를 넣어줘야 한다. 

 

그래야 GET방식으로 받을 수 있다.

 

이게 헷갈려서 2시간 헷갈렸다.

 

1. GET 이용하기

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

GET을 이용하면, 같은 디자인에 다양한 내용들을 불러올 수 있다

아래의 코드의 url은 boardModify.php?boardID=1 일 것이다 

 

2. SQL 작성하기

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

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

 

SELECT 기본 문법
SELECT __(불러올 값)__ FROM __(어디에서 불러 올 건지)__ WHERE 조건;

 

SELECT : 게시글 고유의 넘버 + 수정할 수 있는 제목, 내용

FROM : myBoard 테이블에서

WHERE : 게시글 고유의 넘버와 내가 수정하고자 하는 게시글 넘버가 일치하는 데이터를 불러온다!

 

$result = $connect -> query($sql);

result에 sql의 결과를 넣어준다는 뜻이다

 

3. 값을 불러오자!

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

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

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

        echo "<div style='display:none;'><label for='boardID'>번호</label><input type='text' name='boardID' id='boardID' value='".$boardInfo['boardID']."'></div>";
        echo "<div><label for='boardTitle'>제목</label><input type='text' name='boardTitle' id='boardTitle' class='title-text' value='".$boardInfo['boardTitle']."'></div>";
        echo "<div><label for='boardContents'>내용</label><textarea name='boardContents' id='boardContents'>".$boardInfo['boardContents']."</textarea></div>";
        echo "<div><label for='youPass'>비밀번호</label><input type='password' name='youPass' id='youPass' placeholder='로그인 비밀번호를 입력해주세요!!' autocomplete='off' required></div>";
    
    }
?>

$boardInfo = $result -> fetch_array(MYSQLI_ASSOC);

$result 값을 한 행씩 $boardInfo에 배열로 저장한다는 뜻이다

 

원래는 아래와 같은 한 눈에 들어오는 구조적인 모양이었지만

한 눈에 들어와야 하는 정보가 많으므로 echo로 많이 묶어주었다

 

눈 여겨 봐야할 점은 태그 안에 value를 넣은 것...!

value=".$boardInfo['boardID']."

-> ""쌍 따음표 안에 + 기능을 대신하는 .(점)을 양쪽에 넣은게 좀 귀엽다

-> 아까 fetch_array 즉, 배열로 저장한 값을 ['___'] 이런식으로 불러온다

원래의 모양새 

<div>
    <label for="boardID">번호</label>
    <input type="text" name="boardID" id="boardID">
</div>
<div>
    <label for="boardTitle">제목</label>
    <input type="text" name="boardTitle" id="boardTitle">
</div>
<div>
    <label for="boardContents">내용</label>
    <textarea name="boardContents" id="boardContents" rows="15"></textarea>
</div>
<div>
    <label for="boardPass">비밀번호</label>
    <input type="password" name="boardPass" id="boardPass" placeholder="로그인 비밀번호를 입력해주세요.">
</div>

 

4. 사실 이 php는 폼 태그 안에 있었다

<form action="boardModifySave.php" name="boardModify" method="post">
    <fieldset>
        <legend class="ir_so">게시판 수정 영역</legend>
<?php
(생략)
?>

        <div class="board__btn">
            <button type="submit" value="저장하기">수정하기</button>
            <a href="board.php">목록보기</a>
        </div>
    </fieldset>
</form>

그렇다... 사실 이 모든 건 폼태그 안에서 이루어졌다

 

폼태그를 살펴보자면

action : boardModifySave.php 밑의 버튼 type:submit을 누르면 결과 값이 여기로 넘어간다는 소리다

method: 포스트 방식으로 넘긴다

지금 조금 후회중이다

왜냐면 글이 길어지기 때문이다 후하후하

 

2단계 boardModifySave.php에 넘어온 값을 처리하자

 

1. 넘어온 값들을 받자!

POST방식으로 넘오온 값들을 받고 세션에 미리 저장해둔 memberID도 같이 불러올거다

    <?php
        $boardID = $_POST['boardID'];
        $boardTitle = $_POST['boardTitle'];
        $boardContents = $_POST['boardContents'];
        $youPass = $_POST['youPass'];
        $memberID = $_SESSION['memberID'];
    ?>

 

2. 해킹하는 애들을 물리치는 해킹방지태그를 붙이자

사실 위에 말이 정확하지 않은건 나도 안다

근데 그냥 그렇다고 하자(인젝션 SQL일거다 아마... 벌써 가물가물)

    <?php
        $boardID = $_POST['boardID'];
        $boardTitle = $_POST['boardTitle'];
        $boardContents = $_POST['boardContents'];
        $youPass = $_POST['youPass'];
        $memberID = $_SESSION['memberID'];

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

 

3. 쿼리문을 작성하자

자, 누구나 다 내 글을 수정할 수 있으면 어떡하냐

비밀번호를 정확하게 아는 사람만 수정할 수 있게 하기위해 아래와 같은 장치를 마련하였다

 

(여기엔 버그가 존재한다.

사실 글쓴이가 사용하는 비밀번호를 사용하고자 하는 의도로 만들었으나

어쩌다보니 로그인한 비밀번호를 쓰면 수정이 가능하다;;)

-> 지금은 좀 그렇다, 다음에 잘만들어야겠다 = 수정안한다는 소리다

 

여튼, 셀렉트로 아이디와 비밀번호를 가져오자.

그리고 그것을 배열로 memberInfo에 저장하겠다

    <?php
        (길어서 생략)
        $sql = "SELECT memberID, youPass FROM myMember WHERE memberID = {$memberID}";
        $result = $connect -> query($sql);

        $memberInfo = $result -> fetch_array(MYSQLI_ASSOC);
    ?>

 

4. IF사용

자, 여기서 내가 놓친 버그가 나오는데, 

현재 로그인한 아이디와 나의 아이디가 같으면 수정가능하게 하고,

같지 않으면 해당 권한이 없다고 말을 해주는데

현재 로그인 아이디와 나의 아이디가 다를 이유가 없다...!

    <?php
        if($_SESSION['memberID'] == $memberInfo['memberID']){
            (_____ 기능 _____)
            }
        } else {
            echo "해당 권한이 없습니다.";
        }
    ?>

 

5. 중첩 IF문

자 안의 IF문을 보면 된다

패스워드가 같고 멤버 아이디가 같으면 sql문을 작동하고,

둘 중 하나라도 틀리면 비밀번호가 일치하지 않다고 하고 history.back(1) 즉, 이전페이지(수정페이지)로 이동한다

 

UPDATE 기본 문법
UPDATE __(테이블명)__ SET ____[열]____ = ____'변경할값'____ WHERE ____(조건)____

 

UPDATE : myBoard 테이블을 업데이트 하자

SET : 제목은 POST한 $boardTitle한 값으로, 내용은 POST한 $boardContents로!

WHERE : 게시글 고유 넘버(boardID)와 boardID와 같은 것을...!

    <?php
        if($_SESSION['memberID'] == $memberInfo['memberID']){
            if($result){
                if($memberInfo['youPass'] == $youPass && $memberInfo['memberID'] == $memberID){
                    $sql = "UPDATE myBoard SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}' WHERE boardID = '{$boardID}'";
                    $connect -> query($sql);
                } else {
                    echo "<script>alert('비밀번호가 일치하지 않습니다. 다시 확인해주세요.'); history.back(1)</script>";
                }
            }
        } else {
            echo "해당 권한이 없습니다.";
        }


    ?>

 

6. 전체를 보면 이렇다

    <?php
        $boardID = $_POST['boardID'];
        $boardTitle = $_POST['boardTitle'];
        $boardContents = $_POST['boardContents'];
        $youPass = $_POST['youPass'];
        $memberID = $_SESSION['memberID'];

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

        //쿼리문 작성
        $sql = "SELECT youPass, memberID FROM myMember WHERE memberID = {$memberID}";
        $result = $connect -> query($sql);

        $memberInfo = $result -> fetch_array(MYSQLI_ASSOC);

        if($_SESSION['memberID'] == $memberInfo['memberID']){
            if($result){

                // echo "<pre>";
                // var_dump($memberInfo);
                // echo "</pre>";
    
                //아이디 비밀번호 확인
                if($memberInfo['youPass'] == $youPass && $memberInfo['memberID'] == $memberID){
                    //수정 (수정해 주는 쿼리문 작성)
                    $sql = "UPDATE myBoard SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}' WHERE boardID = '{$boardID}'";
                    $connect -> query($sql);
                } else {
                    echo "<script>alert('비밀번호가 일치하지 않습니다. 다시 확인해주세요.'); history.back(1)</script>";
                }
            }
        } else {
            echo "해당 권한이 없습니다.";
        }


    ?>

마무리

아... 너무 긴가?