14. PHP 게시판 만들기, view 제작 3

2015. 4. 21. 22:13
저자 : Kurien

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

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


이번에는 view의 댓글 기능을 만들어보겠습니다.


댓글은 지금까지 만든 게시판의 write, list와 흡사한 부분이 많습니다.

하지만 댓글과 게시판의 다른 점이 있는데, 바로 댓글의 깊이입니다.


댓글의 깊이라는게 어떤건지 잘 모르시겠죠?

어떤 게시판이든 댓글이 있으면 그 댓글에 또 하나의 댓글을 달 수 있는 기능들이 있죠,

게시판마다 다른 부분인데 어떤 곳은 댓글의 댓글(2depth)까지 댓글을 달 수도 있고, 어떤곳은 계속해서 달 수 있는 곳도 있습니다.


제 블로그의 경우에는 2depth 까지 댓글을 지원한다고 보시면 됩니다.


제가 만들어볼 댓글 기능도 2depth까지만을 지원할 생각이구요.

만약 더 depth를 늘리고 싶다면 구글에서 댓글에 대한 다른 알고리즘을 참고해보세요~


이제 아래의 파일과 함께 코드를 확인해보죠.


20150421_project.zip


comment.php와 comment_update.php를 만들기 전에 댓글을 저장할 DB 테이블을 만들어야 합니다.


create table comment_free(

co_no int unsigned not null primary key auto_increment,

b_no int unsigned not null,

co_order int unsigned default 0,

co_content text not null,

co_id varchar(20) not null,

co_password varchar(100) not null

);


board_free와 비슷하게 comment_free라는 테이블을 만들었습니다.

각 열에 대해 설명드리자면 co_no은 각 댓글의 고유 번호구요,

b_no은 댓글이 달리는 게시판의 번호를 나타냅니다.

co_order는 depth를 위해 만든 부분인데요,

만약 1depth의 댓글이라면 co_no과 같은 값이 들어가게 되고 2depth라면 부모 댓글의 co_no 값이 들어가게 됩니다.

나머지 co_content, co_id, co_password는 b_content, b_id, b_password와 같으니 넘어가겠습니다.



<form action="comment_update.php" method="post">

<input type="hidden" name="bno" value="<?php echo $bNo?>">

<table>

<tbody>

<tr>

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

<td><input type="text" name="coId" id="coId"></td>

</tr>

<tr>

<th scope="row">

<label for="coPassword">비밀번호</label></th>

<td><input type="password" name="coPassword" id="coPassword"></td>

</tr>

<tr>

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

<td><textarea name="coContent" id="coContent"></textarea></td>

</tr>

</tbody>

</table>

<div class="btnSet">

<input type="submit" value="코멘트 작성">

</div>

</form>


이 부분은 comment.php입니다.

아직 댓글이 보이는 부분은 제작하지 않았고, 댓글을 쓰는 부분만 만들었습니다.


comment.php는 아직 크게 어려운 부분이 없습니다.

그냥 form 태그에 table로 레이아웃을 잡고, th, td를 사용해서 아이디, 비밀번호, 내용을 전송하는 부분입니다.

comment.php는 view.php의 하단에 include 됩니다.


<?php

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

$bNo = $_POST['bno'];

$coId = $_POST['coId'];

$coPassword = $_POST['coPassword'];

$coContent = $_POST['coContent'];

$sql = 'insert into comment_free values(null, ' .$bNo . ', null, "' . $coContent . '", "' . $coId . '", password("' . $coPassword . '"))';

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

$coNo = $db->insert_id;

$sql = 'update comment_free set co_order = co_no where co_no = ' . $coNo;

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

if($result) {

?>

<script>

alert('댓글이 정상적으로 작성되었습니다.');

location.replace("./view.php?bno=<?php echo $bNo?>");

</script>

<?php

}

?>


이번에는 comment_update.php입니다.

위에서 봤던 comment.php에서 넘어온 데이터를 먼저 각각의 변수에 받아줍니다.


$bNo, $coId, $coPassword, $coContent에 각 POST 변수를 넣어준 후 sql 쿼리문을 만듭니다.


여기서는 insert 문을 이용해서 각각의 값을 삽입하는데, $coPassword는 password()로 감싸주는 것 잊지마세요!

$db->query($sql)로 전송이 성공적으로 끝났다면 $coNo = $db->insert_id;를 이용해서 방금 insert한 댓글의 번호를 받아옵니다.


그 다음 다시 sql을 작성하는데, 이번엔 update문입니다.

comment_free 테이블에서 co_no이 $coNo과 같은 데이터의 co_order의 값을 co_no의 값으로 바꿔줍니다.

이렇게 해준 이유는 아까 말한 것처럼 댓글이 1depth일 때는 co_no == co_order이여야 하기 때문이죠.


만약 $result 값이 정상이라면 "댓글이 정상적으로 작성되었습니다."라는 문구와 함께 다시 view.php화면으로 돌아갑니다.


여기까지 댓글 1depth 작성이였습니다.

아직 view.php에서는 작성한 댓글이 보이지 않겠지만,

DB상에는 정상적으로 올라오는 것을 확인 했으니 다음 포스팅에서 그 값으로 댓글 출력 부분을 알아보겠습니다.


어려운 부분은 댓글에 남겨주시구요.

현재 상황이 궁금하신 분은 http://kurien.dothome.co.kr에서 확인하실 수 있습니다.