PHP. 게시글 수정하기
개요
순서가 뒤죽박죽이 되겠지만 내가 필요한 걸 우선 적겠다
게시글 수정하는 방법을 서술해보겠다
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 "해당 권한이 없습니다.";
}
?>
마무리
아... 너무 긴가?