반응형

 

 

요즘 게시판들은 답글을 안쓰는 경우도 많지만 공부하는 차원에서 간단한 답글 달기를 알아보자.

 

답글이라는건 어떤 게시글의 자식같은 개념이다. 그래서 답글을 달때는 해당글의 부모글이 어떤 글인지 기록해주어야한다. 테이블을 조금 수정해보자.

 

이렇게 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 "&nbsp;&nbsp;";
}
?>
<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

반응형

+ Recent posts