7. PHP 게시판 만들기, write 제작 3

2015.04.08 00:15
저자 : Kurien

주의: 본 게시판은 보안을 생각하지 않고 만들어졌으므로 실제로 사용되어서는 안되는 코드입니다.

공부할 때 게시판이 이처럼 동작한다는 정도로만 이해해주세요.


오늘은 이미 적었던 글을 수정하는 부분을 제작했습니다.

일단 아래의 파일을 받아주세요.


20150407_project.zip


가장 먼저 수정된 부분은 view.php입니다.

기존의 내용에서 #boardView 내부에 아래의 태그를 추가했습니다.


<div class="btnSet">

<a href="./write.php?bno=<?php echo $bno?>">수정</a>

<a href="./delete.php">삭제</a>

<a href="./">목록</a>

</div>


이 .btnSet에 있는 a 태그 중 수정 부분이 오늘 만들 부분입니다.


새로운 파일을 생성 할 필요 없이 위에 있는 것처럼 write.php와 wrtie_update.php를 한번 더 이용했습니다.

수정된 부분을 확인해봅시다.


<?php

require_once("../dbconfig.php");


//$_GET['bno']이 있을 때만 $bno 선언

if(isset($_GET['bno'])) {

$bNo = $_GET['bno'];

}

 

if(isset($bNo)) {

$sql = 'select b_title, b_content, b_id from board_free where b_no = ' . $bNo;

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

$row = $result->fetch_assoc();

}

?>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title>자유게시판 | Kurien's Library</title>

<link rel="stylesheet" href="./css/normalize.css" />

<link rel="stylesheet" href="./css/board.css" />

</head>

<body>

<article class="boardArticle">

<h3>자유게시판 글쓰기</h3>

<div id="boardWrite">

<form action="./write_update.php" method="post">

<?php

if(isset($bNo)) {

echo '<input type="hidden" name="bno" value="' . $bNo . '">';

}

?>

<table id="boardWrite">

<caption class="readHide">자유게시판 글쓰기</caption>

<tbody>

<tr>

<th scope="row"><label for="bID">아이디</label></th>

<td class="id">

<?php

if(isset($bNo)) {

echo $row['b_id'];

} else { ?>

<input type="text" name="bID" id="bID">

<?php } ?>

</td>

</tr>

<tr>

<th scope="row"><label for="bPassword">비밀번호</label></th>

<td class="password"><input type="password" name="bPassword" id="bPassword"></td>

</tr>

<tr>

<th scope="row"><label for="bTitle">제목</label></th>

<td class="title"><input type="text" name="bTitle" id="bTitle" value="<?php echo isset($row['b_title'])?$row['b_title']:null?>"></td>

</tr>

<tr>

<th scope="row"><label for="bContent">내용</label></th>

<td class="content"><textarea name="bContent" id="bContent"><?php echo isset($row['b_content'])?$row['b_content']:null?></textarea></td>

</tr>

</tbody>

</table>

<div class="btnSet">

<button type="submit" class="btnSubmit btn">

<?php echo isset($bNo)?'수정':'작성'?>

</button>

<a href="./index.php" class="btnList btn">목록</a>

</div>

</form>

</div>

</article>

</body>

</html>


먼저 write.php에서 수정된 부분에 대해서 설명드리겠습니다.


//$_GET['bno']이 있을 때만 $bno 선언

if(isset($_GET['bno'])) {

$bNo = $_GET['bno'];

}


이 부분은 <a href="./write.php?bno=<?php echo $bno?>">수정</a>에서 봤던 bno=(번호)를 변수로 받는 부분입니다.

if(isset($_GET['bno'])) {}을 사용한 이유는, 저는 개발할 때 모든 경고가 출력되게 하는데,

이럴 때 $_GET['bno']가 없는 상황(글쓰기 일 때)에는 notice라는 경고나 출력됩니다.


notice 오류는 무시하더라도 거의 정상적으로 동작하지만, 저는 모든 notice를 없애면서 하겠습니다.

어쨋든 이런 방식으로 $_GET['bno']이 존재할 때만 $bNo이라는 변수를 선언하게 됩니다.


if(isset($bNo)) {

$sql = 'select b_title, b_content, b_id from board_free where b_no = ' . $bNo;

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

$row = $result->fetch_assoc();

}


그 아래 부분을 보면 이번에는 if(isset($bNo)) {}으로 되어있습니다.

이 부분도 위와 비슷한데요, 만약 위에서 $bNo = $_GET['bno'];이 실행 되었다면 isset($bNo) 또한 TRUE이므로 정상적으로 실행됩니다.


여기서는 $bNo이 선언 되었을 때만 DB를 이용해서 기존의 b_title, b_content, b_id의 값을 가져오게 됩니다.


<?php

if(isset($bNo)) {

echo '<input type="hidden" name="bno" value="' . $bNo . '">';

}

?>


조금 내려가면 이 부분이 있습니다.

이번에도 isset($bNo)이니 이 부분은 생략하고 진행하겠습니다.

echo를 통해서 '<input type="hidden" name="bno" value="' . $bNo . '">';를 출력해줍니다.


이 부분을 넣은 이유는 form을 submit 할 때 현재의 bNo(게시판 번호)도 함께 전송하기 위해서입니다.

게시판 번호가 있어야 어떤 글인지를 알 수 있으니까요.


<?php

if(isset($bNo)) {

echo $row['b_id'];

} else { ?>

<input type="text" name="bID" id="bID">

<?php } ?>


여기서는 $bNo이 존재한다면 id만 표시하구요.

$bNo이 없다면 <input type="text" name="bID" id="bID">라는 input 태그를 출력합니다.


글을 수정하는데 글쓴이 아이디가 바뀔 필요는 없잖아요?


value="<?php echo isset($row['b_title'])?$row['b_title']:null?>"

<?php echo isset($row['b_content'])?$row['b_content']:null?>


다음은 이 두 부분입니다.

만약 input 태그에 값을 넣으려면 value="값"을 이용해야 하는데, 수정 시에는 전에 작성했던 내용이 들어가야 하기 때문에 위와같이 적습니다.

a == b ? a : b를 3항 연산자라고 하는데, 만약 a == b가 true 라면 a를, false라면 b를 출력하는 연산이죠.


여기서는 $row['b_title']이 있을 때와, $row['b_content']가 있을 때를 가지고 연산을 실행했습니다.

만약 "글쓰기" 라면 null이 출력될 것이고, "글수정"이라면 $row['b_title'], $row['b_content']가 출력되겠죠.


<?php echo isset($bNo)?'수정':'작성'?>


마지막으로 이 부분입니다.

별거 없이 그냥 $bNo이 있으면 수정, 아니라면 작성이라는 버튼으로 변경해주는 부분입니다.


아무래도 시간이 늦어져서 write_update.php 부분의 설명은 다음 포스팅으로 미뤄야 할 것 같네요.

어려운 부분은 댓글 남겨주시구요, 현재 진행 상황은 http://kurien.dothome.co.kr에서 보실 수 있습니다.


시간 나는대로 쓰고 있으니 기다려주세요^^

TAG ,
  1. 운메장 2015.05.12 19:11 신고  댓글주소  수정/삭제  댓글쓰기

    주인장님 자꾸 여쭤 봐서 죄송합니다.ㅜㅜ
    WRITE.php에 코드를 넣을 때,
    //$_GET['bno']이 있을 때만 $bno 선언
    if(isset($_GET['bno'])) {
    $bNo = $_GET['bno'];
    }

    if(isset($bNo)) {
    $sql = 'select b_title, b_content, b_id from board_free where b_no = ' . $bNo;
    $result = $db->query($sql);
    $row = $result->fetch_assoc();

    이 부분을 넣고 실행시키면,
    "Parse error: syntax error, unexpected T_IF in D:\APM_Setup\htdocs\write.php on line 4"
    이런 경고 메시지가 뜹니다.

    이 부분을 지우면 가동 되긴 하지만, 썼던 글을 수정 하려고 '수정'버튼을 누르면 '새로글쓰기'가 됩니다.

    제가 어떤부분을 놓치고 있는 걸까요 ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.흐엉엉
    날씨도 꾸릿꾸릿하고, 바쁘시겠지만, 부족한 저에게 가르침 부탁드립니다.ㅠ
    그럼 감사합니다!

  2. 이승희 2016.07.16 02:35 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 반가워요

  3. JI 2016.09.30 12:27 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 Kurien님. 올려주신 보물같은 포스팅 덕분에 열심히 공부하고 있는데유.

    제가 방금 오류관련 질문을 드렸는데,
    확인해보니 제가 틀린거였내요 ㅎ
    그런데 덧글은 지우기 그렇고, 감사한 마음이라도 전하려구요 ㅎ
    개인적으로 게시판 프로그래밍의 매커니즘을 이해하는데 애를 먹고 있었는데,
    님 덕분에 많은부분 알아갑니다. 좋은 포스팅 감사합니다^ ^

  4. Rothko 2016.11.08 02:56 신고  댓글주소  수정/삭제  댓글쓰기

    처음 부터 계속 쭉~~ 보면서 공부하고 있습니다.
    이런 게시판 기초공부만 잘 해놔두면, 다른 쪽으로 응용하기 좋을 것 같습니다. Kurien님께 감사합니다!!!

  5. 안녕하세요 2017.01.17 02:19 신고  댓글주소  수정/삭제  댓글쓰기

    옛날 버전쓰다가 호환이 안돼 이참에 php업그레이드된 버전을 공부하고 있는 학생입니다!
    공부하다가 문득 궁금해서 여쭤봅니다!
    id값은 if-else문으로 하셨는데 title과 content는 3항 연사자로 하신 이유가 따로 있나요?
    id값 또한 3항 연산자로 해도 되는거죠??
    정말 큰 도움이 되고 있어요 감사합니다!

    • Kurien 2017.01.25 16:16 신고  댓글주소  수정/삭제

      3항 연산자와 if-else문은 거의 같습니다.

      하지만 3항 연산자의 경우 내용이 길어지는 경우 읽기가 힘들 수 있어서 어느정도의 길이가 있는 경우라면 if-else, 짧은경우 3항 연산자로 사용하고 있습니다.

  6. 오타리포팅 2017.03.15 17:30 신고  댓글주소  수정/삭제  댓글쓰기

    view.php 수정 부분 중에 오타가 있습니다.

    $bno -> $bNo

    좋은 강의 제공해주셔서 감사합니다.

  7. patteon 2017.12.27 17:32 신고  댓글주소  수정/삭제  댓글쓰기

    덕분에 열심히 공부하고 있습니다 감사합니다~