10. PHP 게시판 만들기, delete 제작 2

2015.04.13 23:22
저자 : Kurien

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

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


일 때문에 피곤함을 핑계로... 업데이트가 조금 늦었네요 ㅠ

이번 시간에는 delete_update.php에 대해서 알아보겠습니다.


201504010_project.zip


파일은 지난번과 동일합니다.


바로 코드로 넘어가겠습니다.


<?php

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


//$_POST['bno']이 있을 때만 $bno 선언

if(isset($_POST['bno'])) {

$bNo = $_POST['bno'];

}


$bPassword = $_POST['bPassword'];


//글 삭제

if(isset($bNo)) {

//삭제 할 글의 비밀번호가 입력된 비밀번호와 맞는지 체크

$sql = 'select count(b_password) as cnt from board_free where b_password=password("' . $bPassword . '") and b_no = ' . $bNo;

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

$row = $result->fetch_assoc();

//비밀번호가 맞다면 삭제 쿼리 작성

if($row['cnt']) {

$sql = 'delete from board_free where b_no = ' . $bNo;

//틀리다면 메시지 출력 후 이전화면으로

} else {

$msg = '비밀번호가 맞지 않습니다.';    

?>

<script>

alert("<?php echo $msg?>");

history.back();

</script>

<?php

exit;

}

}


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

//쿼리가 정상 실행 됐다면,

if($result) {

$msg = '정상적으로 글이 삭제되었습니다.';

$replaceURL = './';

} else {

$msg = '글을 삭제하지 못했습니다.';

?>

<script>

alert("<?php echo $msg?>");

history.back();

</script>

<?php

exit;

}



?>

<script>

alert("<?php echo $msg?>");

location.replace("<?php echo $replaceURL?>");

</script>


이번 코드도 write_update.php와 비슷한 부분이 있을거라고 생각됩니다.

먼저 $_POST['bno']이 있는지 검사하고 있다면 $bNo 변수에 넣어줍니다.

그리고 delete.php에서 받아온 $_POST['bPassword']도 $bPassword 변수에 넣어주고,


$bNo이 있을 때 글 삭제 코드를 실행합니다.


먼저 삭제할 글의 비밀번호와 입력된 비밀번호가 맞는지 체크를 해야겠죠?


select문을 이용해서 b_password가 일치하는 값을 출력받습니다.

여기서 select문에 있는 count를 이용해서 조건에 일치하는 행이 몇 개나 존재하는 지를 알 수 있습니다.

어짜피 b_no은 primary key(기본키)이므로 1개거나, 0개일 수밖에 없습니다.


결과를 출력하고 만약 $row['cnt'](글의 수)가 1이라면 삭제 sql문을 작성합니다.


$row['cnt']가 0이라면 비밀번호가 맞지 않거나 글이 없다는 건데,

여기선 비밀번호가 맞지 않는다는 내용을 출력했네요.

추후에 수정하도록 하고, 비밀번호가 맞지 않거나 글이 없으면 메시지를 출력하고 이전 화면으로 돌아갑니다.


다시 돌아와서 글의 수가 1이였고, 삭제 sql문이 작성되었다면 query를 전송하는 $db->query($sql)을 만나게됩니다.

쿼리 전송 결과 값은 $result에 저장되고, 정상 실행 되었다면 $result = true,

실패되었다면 $result는 false가 되고 각각에 맞는 조건이 실행됩니다.


마지막으로 글 삭제에 성공 했다면 alert와 함께 location.replace가 실행되고, 목록 화면으로 나가지겠죠.


글 삭제 부분은 오히려 더 쉽다고 느껴집니다...만, 글 삭제를 하게 되면 복원을 하지 못하는 만큼 중요하기도 한 부분입니다.
지금 당장은 문제가 없겠지만, 나중에 데이터가 쌓였을 때 작은 오류 하나로 모든 글이 사라지게 되면 문제가 생기는거죠.

어렵지 않으면서 가장 어려워 해야할 부분인 것 같습니다.

게시판의 현재 진행상황은 http://kurien.dothome.co.kr에서 확인하실 수 있구요.
지적할 점, 어려운 부분, 질문 등은 댓글에 남겨주시면 빠르게 답변해드리겠습니다.


TAG ,
  1. 상연님 2015.08.05 17:57 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!!!
    저번에는 4번 한글에서 막혀서 글 한번 썻었는데 하하
    처리하고 지우는곳까지 발전했습니다 언제나 감사드려요

    저는 직접 타이핑하고 오류사항이 생기면 올려주신 파일과 비교해보면서 공부하는데요
    Delete쪽 공부하면서 좀 오류사항으로 이렇게 글써봅니다.

    view와 Delete 쪽 각각의 페이지별로 $bNo 이변수가 소문자도 있고 대문자도 있고 하더라구요
    가끔 한번씩 막힐때 비교해보면 view에서는 소문자 delete에서는 대문자 이렇더라구요..
    또, view에서 블로그페이지에는

    하단 a테그에 ./delete.php 삭제로만 써주시고
    다운파일에는 ./delete.php?bno=<?php echo $bno?>
    라고....

    삭제는 안되고 어디가 문제인지 한참 버벅거리다 소스비교하다 눈치챘어요 ㅋㅋㅋ
    이거 일부러 테스트인가요? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    언제나 열심히 잘보고있습니다.
    일단은 한번 쭉~~ 따라해보고
    해석하면서 또한번 풀어볼려고요!!!
    더운데 열사병, 냉방병 조심하세요!!

    • Kurien 2015.08.05 17:56 신고  댓글주소  수정/삭제

      ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
      죄송합니다...

      왜인지 모르게 bNo이랑 bno이 섞여있네요 ㅋㅋㅋㅋㅋㅋㅋ
      말씀해주시는 부분은 퇴근 후 바로 수정하겠습니다^^
      혹시 어려운 부분 있으시면 댓글 남겨주세요.

      시간 나는대로 빠르게 답변 드리겠습니다.

  2. 상연님 2015.08.05 17:58 신고  댓글주소  수정/삭제  댓글쓰기

    댓글을 쫙썻는데.. 자꾸 금칙어 걸려서 계속 수정을...
    delete 이부분 쓰는데 자꾸 금칙어가 걸려요 ㅋㅋㅋㅋ
    저거 잘못하면 엄청 고생 ㅋㅋㅋㅋㅋ

  3. 삐구엘 2015.08.20 13:20 신고  댓글주소  수정/삭제  댓글쓰기

    다른 이벤트 처리들은 잘되는데 딜리트.php소스에서
    $bno를 못받아 오는건지; 정상적인 경로를 이용해주세요 라고 팝업창만 뜨네요;
    경로도 확인했고 틀린게 없는데 왜이런건가요?ㅠ

  4. 123 2016.02.02 19:24 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 잘 보고 따라하고 있씁니다!!!

    근데 한가지 질문좀 드리고 싶은게 게시판을 만들었는데 삭제를 한다음
    다시 게시판에서 글을 작성하게되면 번호가 더 증가된 상태 예를들어 10번 글을 지우고 글을쓰면
    다시 10번이 나타나는게 아니라11번 글이 등록이 되는데 이런 부분은 어떻게 해결해야 되나요?

    • Kurien 2016.02.03 10:28 신고  댓글주소  수정/삭제

      제가 만들었던 게시판의 경우 해당 데이터베이스의 기본 키 값을 그대로 가져오면서 나타나는 현상입니다.

      만약 10번 글을 지웠을 때 11번 글이 10번으로 변하게 하기 위해서는

      전체 게시물[85개] - ((현재 페이지[2 페이지]-1) * 한 페이지의 게시물[10개])

      위의 연산을 하시면 85 - 10 즉 75가 나옵니다.
      위와 같은 연산이 나오는 이유는 전체 게시물이 마지막 게시글의 번호와 같기 때문이고,
      현재 페이지 - 1을 해주는 이유는 첫 페이지가 1페이지이기 때문에 -1을 해줘야만 해당 페이지의 첫번째 값이 나오게 됩니다.

      이 값을 $current_no이라고 할 때,
      그 다음 for문을 통해서 리스트를 출력할 때 $current_no--로 출력해주시면 될 것 같습니다.

  5. 고왕익 2016.05.16 01:16 신고  댓글주소  수정/삭제  댓글쓰기

    하루동안 게시판 만드는거 보면서 공부하고 있습니다.
    그런데 문제가 있는게.......
    비밀번호를 맞게 해도 비밀번호가 틀리다고 창이 뜨는 이유는 무엇때문일까요..?
    (ps. 직접 올려주신 파일로 테스트 중입니다.)

    • Kurien 2016.05.16 17:46 신고  댓글주소  수정/삭제

      해당 소스를 줘보실 수 있으신가요?
      kurien92@gmail.com 이쪽으로 보내주시면 됩니다.

      잘못된 결과가 나온다는분들 모두 같은 코드를 보고 하지만, 실수를 했을 수도 있고, 파일 자체의 인코딩, DB의 인코딩 등 여러가지 변수가 많아서 제가 짠 코드 그대로 쓰셨더라도 직접 보지않고서는 확실히 하긴 힘드네요.

  6. su 2016.06.20 12:03 신고  댓글주소  수정/삭제  댓글쓰기

    저도 올려주신 파일로 테스트 중인데, 비밀번호를 맞게 해도 비밀번호가 틀리다고 창이 뜹니다. 뭔가 코드상에서 문제가 있는거 같은데 한번 테스트를 해보심이 어떠실런지요. 위에 분도 저랑 같은 문제라서요. 제가 수정 부분도 체크 중인데 수정하는곳의 비밀번호를 다른 걸로 넣어도 수정이 되드라구요. 비밀번호 부분이 문제가 있는거 같습니다. 시간 되시면 확인 부탁드립니다. 이제까지 올려주신거 너무 잘 보고 있습니다. 감사합니다. 근데 여기서 막히니 속상하네요. ㅋㅋ

    -------------------------------------------------------------------------------------------------
    제가 제 코드를 살짝 바꾼걸 깜빡하고 괜히 주인장님만 괴롭혀드렸네요. 죄송하구요. 도와주셔서 진심으로 감사드립니다. 꾸벅~

    • Kurien 2016.06.20 21:23 신고  댓글주소  수정/삭제

      //b_no에 해당하는 글의 패스워드가 사용자가 입력한 패스워드와 같은 글의 개수를 출력 합니다.
      $sql = 'select count(b_password) as cnt from board_free where b_password=password("' . $bPassword . '") and b_no = ' . $bNo;

      //쿼리를 전송하구요.
      $result = $db->query($sql);
      //결과를 $row에 저장합니다.
      $row = $result->fetch_assoc();

      //만약 결과가 있다면
      if($row['cnt']) {
      //$sql을 저장합니다.
      $sql = 'delete from board_free where b_no = ' . $bNo;
      }

      위의 쿼리에서 잘못 입력될만한 부분은 없습니다.
      위에 적었던 것처럼 kurien92@gmail.com으로 작성하신 코드를 보내줘보세요.

  7. bigstar131 2016.07.16 22:19 신고  댓글주소  수정/삭제  댓글쓰기

    게시판에 있는 글을 삭제 했을 때 글 번호를 정렬 하고 싶은데 쿼리를 어떻게 만들어야 하나요?
    예) 1,2,3,4 글이 있을 때 2번을 삭제 하면 뒤에 있는 3, 4번이 2, 3번으로 변경 되고 새 글을 올렸을 때에
    번호가 4번 부터 시작 한다.

    • Kurien 2016.07.17 11:57 신고  댓글주소  수정/삭제

      위에 적혀 있긴 하지만 다시 적어드리겠습니다.
      제가 만들었던 게시판의 경우 해당 데이터베이스의 기본 키 값을 그대로 가져오면서 나타나는 현상입니다.

      만약 10번 글을 지웠을 때 11번 글이 10번으로 변하게 하기 위해서는

      전체 게시물[85개] - ((현재 페이지[2 페이지]-1) * 한 페이지의 게시물[10개])

      위의 연산을 하시면 85 - 10 즉 75가 나옵니다.
      위와 같은 연산이 나오는 이유는 전체 게시물이 마지막 게시글의 번호와 같기 때문이고,
      현재 페이지 - 1을 해주는 이유는 첫 페이지가 1페이지이기 때문에 -1을 해줘야만 해당 페이지의 첫번째 값이 나오게 됩니다.

      이 값을 $current_no이라고 할 때,
      그 다음 for문을 통해서 리스트를 출력할 때 $current_no--로 출력해주시면 될 것 같습니다.

  8. sskim 2017.07.04 11:10 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. php 게시판 만드는것을 잘 보고 있습니다. 정말 감사합니다.
    다름아니라 질문이 하나 있습니다.
    //글 삭제
    if(isset($bNo)) {
    //삭제 할 글의 비밀번호가 입력된 비밀번호와 맞는지 체크
    $sql = 'select count(b_password) as cnt from board_free where b_password=password("' . $bPassword . '") and b_no = ' . $bNo;
    $result = $db->query($sql);
    $row = $result->fetch_assoc();

    //비밀번호가 맞다면 삭제 쿼리 작성
    if($row['cnt']) {
    $sql = 'delete from board_free where b_no = ' . $bNo;
    //틀리다면 메시지 출력 후 이전화면으로
    } else {
    $msg = '비밀번호가 맞지 않습니다.';
    ?>
    <script>
    alert("<?php echo $msg?>");
    history.back();
    </script>
    <?php
    exit;
    }
    }

    $result = $db->query($sql);
    이 문에서 지금 마지막 줄인 $result = $db->query($sql); 가 궁금한데요.
    if문 괄호 블록 안에 선언된 변수는 지역변수로서 블록을 빠져 나가게되면 사용하지 못하는것 아닌가요??
    어떻게 $sql을 쓸수 있는지가 궁금합니다.

    • Kurien 2017.07.04 22:43 신고  댓글주소  수정/삭제

      말씀하신 부분 중 if문 내에서 생성한 변수는 지역변수가 아니구요.

      비밀번호가 맞다면 삭제 쿼리가 생성되므로, 삭제가 실행되는 것입니다.