요즘 게시판들은 답글을 안쓰는 경우도 많지만 공부하는 차원에서 간단한 답글 달기를 알아보자.
답글이라는건 어떤 게시글의 자식같은 개념이다. 그래서 답글을 달때는 해당글의 부모글이 어떤 글인지 기록해주어야한다. 테이블을 조금 수정해보자.
이렇게 parent_id라는 컬럼을 만들어준다. 현재는 값이 비어있다. 답글을 쓰는 경우에 여기에 부모글의 bid를 넣어줄 것이다.
답글을 위해서 우선 view.php를 조금 수정해보자.
/view.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$bid=$_GET["bid"];
$result = $mysqli->query("select * from board where bid=".$bid) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
?>
<h3 class="pb-4 mb-4 fst-italic border-bottom" style="text-align:center;">
- 게시판 보기 -
</h3>
<article class="blog-post">
<h2 class="blog-post-title"><?php echo $rs->subject;?></h2>
<p class="blog-post-meta"><?php echo $rs->regdate;?> by <a href="#"><?php echo $rs->userid;?></a></p>
<hr>
<p>
<?php echo $rs->content;?>
</p>
<hr>
</article>
<nav class="blog-pagination" aria-label="Pagination">
<a class="btn btn-outline-secondary" href="/index.php">목록</a>
<a class="btn btn-outline-secondary" href="/write.php?parent_id=<?php echo $rs->bid;?>">답글</a>
<a class="btn btn-outline-secondary" href="/write.php?bid=<?php echo $rs->bid;?>">수정</a>
<a class="btn btn-outline-secondary" href="/delete.php?bid=<?php echo $rs->bid;?>">삭제</a>
</nav>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
답글이란걸 알려주기 위해서 parent_id라는 파라미터에 부모의 bid값을 넘겨준다. 이제 write.php를 수정해보자.
/write.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
if(!$_SESSION['UID']){
echo "<script>alert('회원 전용 게시판입니다.');history.back();</script>";
exit;
}
$bid=$_GET["bid"];//get으로 넘겼으니 get으로 받는다.
$parent_id=$_GET["parent_id"];
if($bid){//bid가 있다는건 수정이라는 의미다.
$result = $mysqli->query("select * from board where bid=".$bid) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
if($rs->userid!=$_SESSION['UID']){
echo "<script>alert('본인 글이 아니면 수정할 수 없습니다.');history.back();</script>";
exit;
}
}
if($parent_id){//parent_id가 있다는건 답글이라는 의미다.
$result = $mysqli->query("select * from board where bid=".$parent_id) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
$rs->subject = "[RE]".$rs->subject;
}
?>
<form method="post" action="write_ok.php">
<input type="hidden" name="bid" value="<?php echo $bid;?>">
<input type="hidden" name="parent_id" value="<?php echo $parent_id;?>">
<div class="mb-3">
<label for="exampleFormControlInput1" class="form-label">제목</label>
<input type="text" name="subject" class="form-control" id="exampleFormControlInput1" placeholder="제목을 입력하세요." value="<?php echo $rs->subject;?>">
</div>
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">내용</label>
<textarea class="form-control" id="exampleFormControlTextarea1" name="content" rows="3"><?php echo $rs->content;?></textarea>
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
parent_id값을 받아서 제목에 답글이란 표시로 친절하게 [RE]라는 표시를 해주었다. 그리고 hidden으로 parent_id값을 넘겨준다. 그러면 write_ok.php에서는 이값을 어떻게 처리하는지 알아보자.
write_ok.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
if(!$_SESSION['UID']){
echo "<script>alert('회원 전용 게시판입니다.');location.href='/index.php';</script>";
exit;
}
$subject=$_POST["subject"];
$content=$_POST["content"];
$bid=$_POST["bid"];//bid값이 있으면 수정이고 아니면 등록이다.
$parent_id=$_POST["parent_id"];//parent_id가 있으면 답글이다.
$userid=$_SESSION['UID'];//userid는 세션값으로 넣어준다.
$status=1;//status는 1이면 true, 0이면 false이다.
if($bid){//bid값이 있으면 수정이고 아니면 등록이다.
$result = $mysqli->query("select * from board where bid=".$bid) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
if($rs->userid!=$_SESSION['UID']){
echo "<script>alert('본인 글이 아니면 수정할 수 없습니다.');location.href='/';</script>";
exit;
}
$sql="update board set subject='".$subject."', content='".$content."', modifydate=now() where bid=".$bid;
}else{
if($parent_id){//답글인 경우 쿼리를 수정해서 parent_id를 넣어준다.
$sql="insert into board (userid,subject,content,parent_id) values ('".$userid."','".$subject."','".$content."','".$parent_id."')";
}else{
$sql="insert into board (userid,subject,content) values ('".$userid."','".$subject."','".$content."')";
}
}
$result=$mysqli->query($sql) or die($mysqli->error);
if($result){
echo "<script>location.href='/index.php';</script>";
exit;
}else{
echo "<script>alert('글등록에 실패했습니다.');history.back();</script>";
exit;
}
?>
수정이 아니니까 수정을 지나서 글 등록에서 처리해준다. 기존에 없던 parent_id값을 입력하는 부분이 추가됐다.
우선 디비에 어떻게 들어갔는지 확인해보자.
마지막에 입력한 글에는 parent_id가 들어갔다. modifydate에 값이 들어간건 답글때문이 아니다. 수정까지 테스트해봐서 들어간 것이다.
이제 index.php를 확인해보자.
뭔가 이상하다. 분명 답글을 달았는데 답글처럼 보이지 않는다. 답글처럼 보이도록 index.php를 수정해보자
/index.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$search_keyword = $_GET['search_keyword'];
if($search_keyword){
$search_where = " and (subject like '%".$search_keyword."%' or content like '%".$search_keyword."%')";
}
$sql = "select * from board where 1=1";
$sql .= " and status=1";
$sql .= $search_where;
$order = " order by ifnull(parent_id, bid) desc, bid asc";
$query = $sql.$order;
//echo "query=>".$query."<br>";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$rsc[]=$rs;
}
?>
<table class="table">
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">글쓴이</th>
<th scope="col">제목</th>
<th scope="col">등록일</th>
</tr>
</thead>
<tbody>
<?php
$i=1;
foreach($rsc as $r){
//검색어만 하이라이트 해준다.
$subject = str_replace($search_keyword,"<span style='color:red;'>".$search_keyword."</
span>",$r->subject);
?>
<tr>
<th scope="row"><?php echo $i++;?></th>
<td><?php echo $r->userid?></td>
<td>
<?php
if($r->parent_id){
echo " ";
}
?>
<a href="/view.php?bid=<?php echo $r->bid;?>"><?php echo $subject?></a></td>
<td><?php echo $r->regdate?></td>
</tr>
<?php }?>
</tbody>
</table>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"]?>">
<div class="input-group mb-12" style="margin:auto;width:50%;">
<input type="text" class="form-control" name="search_keyword" id="search_keyword" placeholder="제목과 내용에서 검색합니다." value="<?php echo $search_keyword;?>" aria-label="Recipient's username" aria-describedby="button-addon2">
<button class="btn btn-outline-secondary" type="button" id="button-addon2">검색</button>
</div>
</form>
<p style="text-align:right;">
<?php
if($_SESSION['UID']){
?>
<a href="write.php"><button type="button" class="btn btn-primary">등록</button><a>
<a href="/member/logout.php"><button type="button" class="btn btn-primary">로그아웃</button><a>
<?php
}else{
?>
<a href="/member/login.php"><button type="button" class="btn btn-primary">로그인</button><a>
<a href="/member/signup.php"><button type="button" class="btn btn-primary">회원가입</button><a>
<?php
}
?>
</p>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
우선 정렬 쿼리를 바꿔준다.
select * from board order by ifnull(parent_id, bid) desc, bid asc
ifnull을 이용해서 parent_id에 값이 없으면 본인의 bid를 가져오도록 해서 정렬해준다. 그리고 먼저 달린 댓글이 위에 오도록 수정해준다.
그러면 이런식으로 일반게시글과 답글을 구분해서 표시할 수 있다.
답글을 표현하는 방법은 내가 쓴것말고도 다양한 방법이 있다. 이것도 그중 한가지라고 생각하고 적용해보자.
길은 한가지가 아니니.
개발하다 힘들면 눌러.
https://www.zzarbang.com