ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PHP] 게시판 만들기 - 관리자 기능 ②
    프로그래밍/PHP 2020. 9. 27. 20:28

     

     

     

     

    관리자 기능을 본격적으로 구현해보도록 하겠습니다. 관리자 계정의 기능 요구사항은 다음과 같습니다.

     

    1. 모든 게시판 글을 수정, 삭제할 수 있다.

    2. 모든 댓글을 삭제할 수 있다.

     

    게시글 관리

     

    먼저 첫번째 요구사항을 구현해보도록 하겠습니다. 관리자는 모든 게시글을 관리할 수 있어야합니다. 즉, 내가 쓴 글이 아니라도, 비밀 글이라도 전부 읽기, 수정, 삭제가 가능해야합니다.

     

    list.php로 이동하여 관리자 계정일 때에는 비밀글의 비밀번호를 모르더라도 바로 해당 게시글을 읽을 수 있도록 구현해보도록 하겠습니다. 

     

    <!-- 비밀 글 가져오기 -->	 
    			          <?php 
    			          	$lockimg="<img src='./img/lock.png' alt='lock' title='lock' width='18' height='18'>";
    			          	if($board['lock_post']=="1"){ // lock_post 값이 1이면 잠금
    			          ?>
    			          		<span class="lock_check" style="cursor:pointer" data-action="./read.php?idx="
    			          		data-check=<?=$role ?> data-idx="<?=$board['idx']?>" ><?=$title?> <?=$lockimg?></span>
    			          <!-- 일반 글 가져오기 -->
    			          <?php 

     

    lish.php에서 <tbody> 태그쪽 비밀 글을 가져오는 부분에서 span 태그의 속성 값으로 data-action="./read.php?idx="와 data-check=<?=$role ?> 을 추가해주었습니다. 비밀 글을 클릭해 제이쿼리 이벤트가 발생할 때, data-check의 $role 값을 확인하여, USER일 경우에는 그대로 모달창 이벤트가 발생하고, ADMIN일 경우에는 모달창 이벤트가 발생하지 않고 바로 일반 게시글로 넘어가게끔 구현할 예정입니다.

     

    <!-- 비밀글 클릭시 모달창을 띄우는 이벤트 -->
    		$(function(){
    		    $(".lock_check").click(function(){
    			    <!-- 관리자 계정일 경우 바로 해당 글로 이동 -->
    			    if($(this).attr("data-check")=="ADMIN") {
    			    	var action_url = $(this).attr("data-action")+$(this).attr("data-idx");
    					$(location).attr("href",action_url);
    			    }
    				$("#modal_div").modal();
    				<!-- 주소에 data-idx(idx)값을 더하기 -->
    				var action_url = $("#modal_form").attr("data-action")+$(this).attr("data-idx");
    				$("#modal_form").attr("action",action_url);
    			});
    		});

     

    다음은 비밀글 클릭시 이벤트를 수정한 것입니다. data-check의 값을 확인하고, data-action의 값에 인덱스 번호를 더한 후, 해당 주소로 이동하게끔 구현하였습니다. 이렇게하면 관리자 계정으로 게시판을 이용할 시 비밀 글의 비밀번호를 모르더라도 해당 글을 읽을 수 있습니다.

     

    다음으로는 read.php로 이동해 수정, 삭제 기능을 구현하겠습니다. 저번 실습에서, 다음과 같이 세션의 아이디와 게시글에 등록된 아이디를 비교해, 이 게시물이 본인이 작성한 게시글인지 아닌지를 확인했었습니다. 기존의 코드에 정말 간단한 수정을 하여 관리자 기능을 구현해보겠습니다.

     

    <!-- 자신의 글만 수정, 삭제 할 수 있도록 설정-->
    <?php 
        if($userid==$board['name'] || $role=="ADMIN"){ // 본인 아이디거나, 관리자 계정이거나
    ?>
            <a href="update.php?idx=<?=$board['idx']?>" class="btn btn-primary">수정</a>
            <a href="delete.php?idx=<?=$board['idx']?>" class="btn btn-primary">삭제</a>
    <?php } ?>

     

    위의 코드를 통해 $role의 값이 ADMIN이거나 $userid의 값이 DB에 저장된 사용자 이름과 같을 때에만 게시글을 수정, 삭제 할 수 있게 됩니다.

     

    관리자 계정으로 게시글 관리가 가능하다.

     

    댓글 관리

     

    두번째 요구사항을 구현해봅시다. 관리자는 모든 댓글을 관리할 수 있어야합니다. 댓글의 비밀번호를 모르더라도 댓글을 삭제할 수 있어야합니다.

     

    <!-- 회원일 때 댓글 삭제 -->
    							<?php if($role=="USER") {?>
    								<form method="post" id="modal_form1" action="reply_delete.php">
    									<input type="hidden" name="rno" value="<?=$reply['idx'];?>" /><input type="hidden" name="b_no" value="<?=$bno;?>">		
    									<p>비밀번호  <input type="password" name="pw" /> <input type="submit" class="btn btn-primary" value="확인" /></p>
    								</form>
    								
    							<!-- 관리자일 때 댓글 삭제 -->
    							<?php } else if($role=="ADMIN") {?>
    								<form method="post" id="modal_form2" action="reply_delete.php">
    									<input type="hidden" name="rno" value="<?=$reply['idx'];?>" /><input type="hidden" name="b_no" value="<?=$bno;?>">
    									<input type="hidden" name="pw" value="">		
    									<p>삭제하시겠습니까? <input type="submit" class="btn btn-primary" value="확인" /></p>
    								</form>
    							<?php }?>

     

    $role의 값이 USER일 때와 ADMIN일 때 분기를 나눴습니다. USER일 때는 이전의 코드와 똑같고, ADMIN일 때도 비슷한데, 다른점은 비밀번호를 입력받지 않고 hidden 값으로 "" 값을 준것입니다. 이는 확인 버튼을 눌러서 reply_delete.php 의 코드를 실행할 때, 오류가 발생하지 않기 위해 설정한 것입니다.

    <?php
    	include './config.php';
    	include './db/db_con.php';
    	
    	// hidden의 값 rno를 받아와 그 값에 해당하는 idx 에 대한 reply 테이블 정보 가져오기
    	$rno = $_POST['rno']; 
    	$role = $_SESSION['role'];
    	$sql = mq("select 
    					* 
    			   from 
    					reply 
    			   where 
    					idx='".$rno."'
    			");
    	$reply = $sql->fetch_array();
    	
    	// hidden의 값 b_no를 받아와 그 값에 해당하는 idx 에 대한 board 정보 가져오기
    	$bno = $_POST['b_no'];
    	$sql2 = mq("select 
    					* 
    			    from 
    					board 
    			    where 
    					idx='".$bno."'
    			");
    	$board = $sql2->fetch_array();
    	
    	$pwk = $_POST['pw']; // 모달창에서 입력한 비밀번호
    	$rpw = $reply['pw']; // reply 테이블에 저장된 해쉬값
    	
    	if($role=="USER") {
    		/* 비밀번호를 db의 해쉬값과 비교,  세션값과 db의 name을 비교  */
    		if((password_verify($pwk, $rpw)) && ($userid == $reply['name']))
    		{
    			// 테이블 reply에서 인덱스값이 $rno인 값을 찾아 삭제
    			$sql = mq("delete
    					   from
    							reply
    					   where
    							idx='".$rno."'
    					");
    			?>
    					<script>
    						alert("댓글이 삭제 되었습니다.");
    					</script>
    					<meta http-equiv="refresh" content="0 url=/bbs/gimal/read.php?idx=<?=$bno?>">
    		
    				<?php 
    			}else{ ?>
    					<script>
    						alert('본인의 댓글이 아니거나 비밀번호가 틀립니다');
    						history.back();
    					</script>
    		<?php } ?>
    	<?php 
    	} else if($role=="ADMIN") { 
    				// 테이블 reply에서 인덱스값이 $rno인 값을 찾아 삭제
    				$sql = mq("delete
    							   from
    									reply
    							   where
    									idx='".$rno."'
    							");
    				?>
    					<script>
    						alert("댓글이 삭제 되었습니다.");
    					</script>
    					<meta http-equiv="refresh" content="0 url=/bbs/gimal/read.php?idx=<?=$bno?>">
    		
    		<?php } ?>
    	
    

     

    마지막으로 reply_delete.php의 코드를 수정하겠습니다. $role의 값이 USER일 때만 비밀번호를 비교하고, ADMIN일 때는 바로 댓글을 삭제할 수 있게 구현했습니다.

     

    이렇게 세션을 활용하여 계정을 관리자, 사용자 두개로 나누어 관리자 기능을 아주아주 간단하게 구현해보았습니다. 처음 프로젝트를 설계하고 진행했을 때, 관리자 기능을 애초에 염두해두지 않고 DB를 설계하였기 때문에, DB 수정을 최소화 하면서 관리자 기능을 추가하려고 하니 제한사항이 많고 어설픈 감이 있습니다 ㅠㅠ 세션을 활용해서 이런것들을 할 수 있구나 정도를 느껴볼 수 있는 실습이셨으면 합니다 ㅎㅎ

     

    PHP 게시판 만들기 시리즈 👇

     

    노력의 천재

    Carpe Diem, Seize the day

    transferhwang.tistory.com

     

     

     

     

     

    댓글

Designed by Tistory.