15. PHP 게시판 만들기, view 제작 4

2015.04.26 23:28
저자 : Kurien

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

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


이번에는 입력한 댓글을 view.php 페이지에 표시하는 부분을 만들었습니다.

만든건 이틀 전이지만 개인적인 일로 조금 늦어졌네요ㅠ


바로 파일과 코드 설명으로들어가겠습니다.


20150426_project.zip


파일을 받고 압축을 풀어주세요.


<?php

$sql = 'select * from comment_free where co_no=co_order and b_no=' . $bNo;

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

?>

<div id="commentView">

<?php

while($row = $result->fetch_assoc()) {

?>

<ul class="oneDepth">

<li>

<div>

<span>작성자: <?php echo $row['co_id']?></span>

<p><?php echo $row['co_content']?></p>

</div>

<?php

$sql2 = 'select * from comment_free where co_no!=co_order and co_order=' . $row['co_no'];

$result2 = $db->query($sql2);

while($row2 = $result2->fetch_assoc()) {

?>

<ul class="twoDepth">

<li>

<div>

<span>작성자: <?php echo $row2['co_id']?></span>

<p><?php echo $row2['co_content'] ?></p>

</div>

</li>

</ul>

<?php

}

?>

</li>

</ul>

<?php } ?>

</div>

<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>


짧지만 뭔가 복잡해 보이는건 기분탓일껍니다 ㅠ

이번 코드에서는 두번의 sql 쿼리를 사용해서 2차원 배열을 사용한 것처럼 출력을 했습니다.


이렇게 하는 이유는 1depth 댓글과 2depth 댓글을 함께 출력해야하기 때문입니다.

무슨 말인지 어려울 수 있으니, 이번에도 차근차근 설명드려보겠습니다.


<?php

$sql = 'select * from comment_free where co_no=co_order and b_no=' . $bNo;

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

?>


먼저 comment_free 테이블에서 co_no이 co_order와 같고, b_no이 $bNo인 댓글을 가져옵니다.

write_update에서 에서 co_order는 co_no의 값을 넣어줬는데요.


여기서 co_order는 1depth인 부분에서만 co_no과 같은 값을 갖도록 했습니다.

하지만 아직은 글쓰기 부분에서 2Depth 부분은 수정하지 않았으니 일단은 DB에 직접 데이터를 넣었습니다.



이미지에서 빨간색 부분은 co_order가 1, 초록색 부분은 co_order가 3입니다.

빨간색 부분에서 co_no가 1인 부분은 co_order도 1이므로 1Depth이고, co_no이 2, 5인 부분은 co_order와 다르므로 2Depth입니다.

초록색 부분도 3, 3은 1Depth 4, 3은 2Depth가 되겠죠?


일단은 위에 있는 쿼리로 sql에서는 1Depth 부분을 먼저 가져옵니다.


<div id="commentView">

<?php

while($row = $result->fetch_assoc()) {

?>

<ul class="oneDepth">

<li>

<div>

<span>작성자: <?php echo $row['co_id']?></span>

<p><?php echo $row['co_content']?></p>

</div>


여기서 div로 댓글 부분을 감싸주고, ul과 li 태그로 댓글 부분을 나타냈습니다.

여기서 $row['co_id']는 댓글을 남긴 사람의 id, $row['co_content']는 댓글 내용을 나타냅니다.


<?php

$sql2 = 'select * from comment_free where co_no!=co_order and co_order=' . $row['co_no'];

$result2 = $db->query($sql2);

while($row2 = $result2->fetch_assoc()) {

?>

<ul class="twoDepth">

<li>

<div>

<span>작성자: <?php echo $row2['co_id']?></span>

<p><?php echo $row2['co_content'] ?></p>

</div>

</li>

</ul>

<?php

}

?>

</li>

</ul>

<?php } ?>

</div>


그 아래는 또 하나의 sql이 있습니다.


이 부분은 2Depth의 댓글을 출력하는 부분입니다.

1Depth를 출력하는 while문 안에 한번 더 while문이 있는데요,

이번에는 co_order가 $row['co_no'](1Depth의 댓글 번호)와 같고 co_no이 co_order와 다른 것을 찾게됩니다.


sql을 통해서 찾은 결과는 ul li 태그를 한번 더 출력해줍니다.



순서대로 하면 먼저 댓글을 출력한 후, 그에 따른 댓글들을 출력합니다.

여기까지 댓글 뷰 부분이였습니다.


현재 상황은 http://kurien.dothome.co.kr에서 볼 수 있고,

어려운 부분은 댓글에 남겨주세요!

저작자 표시 비영리 변경 금지
신고
TAG ,
  1. 백수왕 2015.04.27 18:44 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 게시판 만드는법 보고 따라 해보고 있는데요
    지난번에 올리신 댓글 부분에서 막히네요 comment_free DB에 아무것도 입력되지가 않아요
    제가 타이핑한데 오타가 있나 싶어서 올리신 파일 그대로 받아서 적용해봐도 그렇구요

    • Kurien 2015.04.27 20:08 신고  댓글주소  수정/삭제

      제 comment_free 테이블 생성 코드에 문제가 있었네요! 죄송합니다 ㅠ

      일단 "drop table comment_free"를 적어서 기존의 댓글 테이블을 지워주신 후,
      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
      );
      를 통해서 다시 생성해주시면 정상적으로 작동 할 겁니다.

      실행이 안됐던 이유는 co_order 부분에 있는 not null로 인해서 정상적으로 쿼리가 전송되지 않았던 것 같네요.

      앞으로도 이런 부분은 댓글 남겨주시면 최대한 빨리 답변 드리겠습니다^^

  2. 초보왕 2015.06.23 09:29 신고  댓글주소  수정/삭제  댓글쓰기

    while($row = $result->fetch_assoc()) 여기서 오류가 나는데 Call to a member function fetch_assoc() on a non-object 이렇케 오류가 뜨네요? 어떤 문제죠?

  3. DH 2015.11.30 11:32 신고  댓글주소  수정/삭제  댓글쓰기

    코멘트 달아도 DB에 저장이 안되네요...

    • Kurien 2015.12.09 15:02 신고  댓글주소  수정/삭제

      DH님이 제작하고 계신 코드를 알 수 없으니 어느 부분에 문제가 있는지 알 수 없네요.
      어딘가가 안맞을 경우 DB 저장이 안됩니다.
      오류를 찾아보세요~

  4. 건의합니다. 2016.11.15 12:15 신고  댓글주소  수정/삭제  댓글쓰기

    댓글을 다는 부분에 있어 덕분에 열심히 공부중입니다.
    근데 댓글을 달았으면 뭔가 알림이나 댓글이 달렸다는 표시가 있어야하는데 그걸 넣기가 힘들더군요.
    예를들면 댓글 달시 그 게시물의 제목 끝에 [댓글 달림] 이런 문장 추가라든지..
    이런 것 외 답변 게시판두 좀 강의해주시면 감사하겠습니다.

    • Kurien 2016.11.15 13:31 신고  댓글주소  수정/삭제

      댓글 알림같은 경우엔 주로 관리자 페이지에서 자주 사용됩니다.

      만드시는 가장 쉬운 방법은 게시물 데이터에 댓글 알림용 열 하나 더 생성하셔서 현재 게시물에서 댓글이 등록 되면 해당 열의 값을 1로 변경하고, 값이 1일 때는 관리자 페이지에서 "댓글달림"이라는 문구 등을 나타나게 해주면 되는거죠.

      추가적으로 "댓글달림"이 떠있는 게시물을 관리자가 확인하면 해당 열의 값은 다시 0으로 바꿔주면 되는거구요.