강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

쉬. 기능붙이기 -4 글 삭제하기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

[강좌] php+mysql 게시판 만들기 #쉬-4

안녕하세요. 디망쉬입니다.

------------------------
빼먹은 부분이 있어 내용 추가합니다.
2000년 8월 21일 이전에 갈무리하신 분들은 새로
갈무리 하시기 바랍니다. 죄송 T_T
------------------------


'쉬'편은 본격적으로 게시판을 만드는 강좌입니다. 단지
게시판이 '돌아가기'만 하면 되기 때문에 현재 전혀
게시판을 꾸미지 않고 있지요. 게시판을 좀 더 이쁘게
꾸미는 작업은 다음 강좌에서 하겠습니다. ^^;

아참. 2000년 7월 4일자로 '쉬'편이 모두 다시
올라왔습니다. 그 이전에 갈무리 하신 분은 새로
갈무리하세요.



------------------------------------------------------------------------------------------------
'쉬'편은 모든 편이 서로 약간씩 관련이 되어 있으므로 모두를 한꺼번에 받으셔서 이 편 저 편 이동하시며 같이
읽는것이 좋습니다.^^;

이유가 각 부분마다 사용하는 변수가 많기 때문에 하나 하나 보시면 이 변수가 뭐에 쓰이는건지 헷갈릴 수
있거든요. 그래서 '쉬-짠1'편에서는 각 부분마다 사용되는 변수를 설명해놓고 있지만, 역시나 더 좋은 방법은 다른 편들을 이동하시며 보는 것입니다. :) '쉬'편의 짠들은 다음과 같으니 별도로 준비하셔서 참조하세요. ^^;



쉬-짠1 : 게시판 만들면서 사용되는 변수 정리 문서
쉬-짠2 : 게시판 만드는데 필요한 약간의 html tag
쉬-짠3 : 게시판 만들면서 만든 사용자 정의 함수
쉬-짠4 : 게시판 만드는데 사용된 php 함수 정리
쉬-짠5 : 게시판 만들면서 필요한 SQL 명령어 정리
------------------------------------------------------------------------------------------------

쉬. 기능 붙이기

a. 글 삭제 하기

역시 글 읽기와 마찬가지로 부담없는 부분일 듯 싶군요. ^^; 글 삭제는 SQL 명령어에서
DELETE 문으로 간단하게 할 수 있습니다.

DELETE FROM testboard WHERE no=13

뭐 이런 식이죠. 만약 우리가 작성한 글을 삭제하고 싶다면 글 내용 중 삭제를 누르면 위의 SQL 명령이 전송되면 됩니다.

하지만 지우고 싶지 않은데 실수로 삭제할 수도 있습니다.
그러니 정말로 삭제할 것인지 확인하도록 하면 좋겠죠?

게다가 웹은 특성상 익명성이 강하기 때문에 누가 어떤 글을 썼는지 장담할 수 없습니다.
그래서 게시물마다 비밀번호를 넣는거죠.
그래서 비밀 번호가 맞으면 글 삭제나 수정이 되겠구요.

그래서 글 삭제 폼에서는 해당 게시물의 데이터가 주루룩 나와서 해당 글을 삭제할 것인지 확인시키고 비밀 번호를 입력하여 실행하면 해당 데이터가 run.php3 에 전달되어 run.php3 가 글을 삭제하도록 하면 되겠죠? ^^;

자. 일단 글 삭제 폼 소스입니다잉.

<?
/*--------------------------
filename : delete.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

$result = mysql_query("SELECT * FROM $board
WHERE no=$no", $connect);

$view = mysql_fetch_array($result);

echo "
<form method="post" action="run.php3"
enctype="multipart/form-data">
<input type="hidden" name="board"
value="$board">
<input type="hidden" name="mode" value="remove">
<input type="hidden" name="delno" value="$no">

작성자명 : $view[usrname]<br>
E-mail : $view[usremail]<br>
글 번호 : $view[num]<br>
글 제목 : $view[usrtitle]<br>
조회수 : $view[hit]<br>
본문 : <p>
$view[contents]
<p>
비밀 번호 : <input type="password" name="delpw">
<input type="submit" value="삭제">
</form>
";
?>

위에서 별로 중요한 건 없습니다. 이미 이전 회에서 설명한 것들이죠?

우선 사용자가 어떤 글을 지우려는지 글에 대한 정보를 알아야하기 때문에 delete.php3 가 실행되면서
함께 딸려온 정보인 $board 와 $no 의 정보를 기초로 해당 게시물의 정보를 가져옵니다. 그리고 화면에
출력하죠. 이건 게시물 읽기와 동일합니다.

하지만 해당 글을 지우는건 run.php3 가 하며 run.php3 는 $mode 라는 변수를 통해 어떤
작업을 할지 알 수 있기 때문에 숨겨진(hidden) 타입의 input tag 로 mode 를 정해줍니다.
여기서 저는 mode 가 remove 일 때 게시물이 지워지도록 했습니다. 그 부분이 바로

<input type="hidden" name="mode" value="remove">

이죠. 에 그리고 어떤 게시판에서 어떤 글을 삭제할 것인지를 알아야 하기 때문에 마찬가지로
hidden 타입의 모습으로 board 와 no 를 잡아놨습니다.

그리고 글을 지우려면 게시말의 비밀 번호를 입력해야 하기 때문에 화면 하단에 비밀 번호
입력란을 넣은거죠.

비밀 번호 : <input type="password" name="delpw">

바로 요고. :]

자. 이제 글 삭제 폼이 나왔으니 실제로 글을 삭제해주는 걸 구현해볼까요?
이건 글 입력과 마찬가지로 run.php3 에서 해줘야 합니다.

일단 글 입력 기능까지 구현된 run.php3 를 볼까요?

<?
/*--------------------------
filename : run.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

if ($mode == "write") {
$result = mysql_query("
SELECT MAX(num) AS num, MAX(idx) AS idx,
MAX(no) AS no FROM $board", $connect);

$ist[num] = mysql_result($result, 0, "num");
$ist[num] += 1;
$ist[idx] = mysql_result($result, 0, "idx");
$ist[idx] += 1;

mysql_free_result($result);

$intime = time();
$passwd = crypt($fil[pw]);

$result = mysql_query("INSERT INTO $board VALUES('',
$ist[num], $ist[idx], '$fil[title]', '$fil[text]',
0, 0, 0, 0, 0, '', '', 0, '$fil[name]', '$passwd',
'$fil[email]', '$fil[homepage]', $intime)", $connect);
}
?>

이군요. 여기서 우리는 $mode 가 remove 일 때 게시물 삭제하는 것을 추가하면 됩니다.

if ($mode == "write") { 가 이미 나왔으니
이제는 elseif 가 되겠죠? 구현해볼까요?

elseif ($mode == "remove") {
$result = mysql_query("DELETE FROM $board
WHERE no=$delno", $connect);
}

에고 에고. 정말 간단하군요. ^^; 일단 구현 자체는 했습니다. 하지만 문제가 있죠.
비밀번호를 체크하지 않으니까. ^^;

자아. 우리는 게시물 입력할 때 게시물의 비밀 번호를 crypt 함수를 이용하여 했습니다.
이놈에 대해서는 이미 '쉬-짠4'에서 설명이 되어 있습니다.
거기의 설명을 보면 맨 앞 2 bytes 는 임의의 문자가 들어갑니다. 랜덤이죠.
그리고 이것을 토대로 나머지 부분에 문자가 들어갑니다.
물론 맨 앞 2bytes 와 암호화할 문자열과의 계산이겠죠.
중요한 건 crypt 함수는 사용될 때마다 맨 앞 2bytes 가 변하며, 이 맨 앞 2bytes 를 모른다면 기존에 암호화된
비밀 번호와 동일한 모습으로 비밀 번호를 만들 수 없습니다. 즉 이 말은 비밀 번호가 서로 일치하지 않는 걸로 된다는거죠.

하지만 여기서 우리는 한 가지 방법을 알 수 있습니다. 맨 앞 2bytes 만 알 수 있다면 새로 입력된 비밀 번호를 그것을 토대로 암호화하면 서로 일치되게 만들 수 있다는 것을.

에구. 설명이 굉장히 이상하죠? 전 설명을 어떻게 해야할지 몰라 죽을 맛이랍니다. T_T
더 자세한 설명은 무리라고 판단되어 일단 설명은 여기서 멈추고 구현부터 보겠습니다.
^^;

이것이 바로 비밀 번호 체크 부분입니다.
우선 기존암호는 SELECT 문을 통해 값을 가져와야 합니다. 이것의 맨 앞 2bytes 의 문자를 가져와서 이것을 근거로 crypt 함수로 delete.php3 에서 입력받은 비밀 번호를 암호화하죠.
그런 뒤 이거 두 개를 서로 비교해서 동일하지 않으면 '비번 틀려' 라고 출력한 뒤 프로그램을 '강제로 종료'합니다.
강제로 종료하는 것이 바로 exit; 이거죠.

실제로 소스에서 구현해불까요?

<?
/*--------------------------
filename : run.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

if ($mode == "write") {
$result = mysql_query("
SELECT MAX(num) AS num, MAX(idx) AS idx,
MAX(no) AS no FROM $board", $connect);

$ist[num] = mysql_result($result, 0, "num");
$ist[num] += 1;
$ist[idx] = mysql_result($result, 0, "idx");
$ist[idx] += 1;

mysql_free_result($result);

$intime = time();
$passwd = crypt($fil[pw]);

$result = mysql_query("INSERT INTO $board VALUES('',
$ist[num], $ist[idx], '$fil[title]', '$fil[text]',
0, 0, 0, 0, 0, '', '', 0, '$fil[name]', '$passwd',
'$fil[email]', '$fil[homepage]', $intime)", $connect);
}
elseif ($mode == "remove") {
$result = mysql_query("
SELECT * FROM $board WHERE no=$delno",$connect);
$dels = mysql_fetch_array($result);

$origi = substr($dels[usrpasswd], 0, 2);
$inppw = crypt($delpw, $origi);

if ($dels[usrpasswd] != $inppw) {
echo "비밀번호가 일치하지 않습니다.";
exit;
}

$result = mysql_query("DELETE FROM $board
WHERE no=$delno", $connect);
}
?>

에헤. 그리고 마지막이 남았습니다. 글을 지웠다면 글 리스트를 출력할 때 제대로 소트(sort) 되도록
글 인덱스(idx)를 고쳐야 합니다. 이건 간단하죠? :]

UPDATE $board SET idx = idx - 1 WHERE no > $delno;

이거면 끝납니다. 만약 10번 글이 지워졌다면 10번 글 이후의 글들의 idx attribute 를 1씩 줄여주는
거죠. 이거 안하면? ^^ 예상하지 못한 결과가 나올 거에요. 저도 예전에 많이 당했었죠.

코드를 추가해보겠습니다.

<?
/*--------------------------
filename : run.php3
--------------------------*/
$connect = mysql_connect("localhost","아이디","비번");
mysql_select_db("사용DB명",$connect);

if ($mode == "write") {
$result = mysql_query("
SELECT MAX(num) AS num, MAX(idx) AS idx,
MAX(no) AS no FROM $board", $connect);

$ist[num] = mysql_result($result, 0, "num");
$ist[num] += 1;
$ist[idx] = mysql_result($result, 0, "idx");
$ist[idx] += 1;

mysql_free_result($result);

$intime = time();
$passwd = crypt($fil[pw]);

$result = mysql_query("INSERT INTO $board VALUES('',
$ist[num], $ist[idx], '$fil[title]', '$fil[text]',
0, 0, 0, 0, 0, '', '', 0, '$fil[name]', '$passwd',
'$fil[email]', '$fil[homepage]', $intime)", $connect);
}
elseif ($mode == "remove") {
$result = mysql_query("
SELECT * FROM $board WHERE no=$delno",$connect);
$dels = mysql_fetch_array($result);

$origi = substr($dels[usrpasswd], 0, 2);
$inppw = crypt($delpw, $origi);

if ($dels[usrpasswd] != $inppw) {
echo "비밀번호가 일치하지 않습니다.";
exit;
}

$result = mysql_query("DELETE FROM $board
WHERE no=$delno", $connect);

$result = mysql_query("UPDATE $board SET
idx = idx - 1 WHERE no > $delno", $connect);
}
?>


케헷헷. 끝났군요. ^^; 너무 싱겁죠? 하지만 어째유. 이미 예고했는걸. ^^;

다만 주의해야할 점이 있다면 delete.php3 에서 해당 게시물의 내용을 출력할 때 view.php3
처럼 게시물 제목, 작성자명, 게시물 본문을 htmlspecialchars() 함수로 한 번 변환해주면
더 좋겠죠? :]


드디어 끝이 보이기 시작하는 강좌! 좀 더 힘을 내어
아자!


다음 강좌에서 뵈요.

----------------------------
함께하면 즐거운 사이트들 (-_-; 광고임 -_-;)
http://game.creple.com/delthia
http://creple.com
http://coco.st
----------------------------


- ?! 디망쉬

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,041 명
  • 현재 강좌수 :  35,855 개
  • 현재 접속자 :  126 명