japanese site
온라인강좌책메일다운로드동아리쇼핑기술지원기업정보갤러리동영상 블로그
『신개념 4단계 리눅스기술지원 시스템 공개』

※ 『무료 리눅스 배포판 배송서비스』 ※

 
쉬. 기능붙이기 -4 글 삭제하기
조회 : 2,964  


[강좌] 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
----------------------------


- ?! 디망쉬


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=585


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
디망쉬
E-mail : dimanche@coco.st

Homepage : http://dimanche.coco.st

 
   
 


『신개념 4단계 리눅스기술지원 시스템 공개』

CentOS 리눅스 전문서적 국내최초출시

 
회사소개 | 보도기사 | 채용안내 | 광고안내 | 이용약관 | 개인정보취급방침 | 책임한계와 법적고지 | 불편사항 신고하기 | 사이트맵
ㅇ 서울 : 서울특별시 강남구 노현로79길 66, 402호(역삼동,청송빌딩)  ㅇ 부산 : 부산광역시 해운대구 우동 1470 에이스하이테크21 914호
ㅇ 대표 : 1544-8128 ㅇ부산직통 : 051-744-0077 ㅇ서울직통 : 02-856-0055 ㅇ FAX : 02-6280-2663
ㅇ 사업자번호 : 128-86-68239 ㅇ 통신판매업 신고번호 : 2013-부산금정-0035호 ㅇ 개인정보책임자 : 이재석
ㅇ 상호명 : (주) 수퍼유저 ㅇ 대표자 : 박성수
Copyright ⓒ (주)수퍼유저. All rights reserved.

 아 이 디
 비밀번호
회원 가입 | 비밀번호 찾기

블로그~
 
▷ 웹개발언어
PHP
JSP
python
기타
책제목
리눅스서버관리실무바이블v3.0


저자 박성수
페이지수 2,032 pages
펴낸곳(주)수퍼유저

리눅스 서버 구축 및 관리에 필요한 거의 모든 부분과 전반적인 실무 기법들을 다루고 있음
책제목
리눅스보안관리실무(2/E)


저자홍석범
페이지수 820 pages
펴낸곳(주)수퍼유저

리눅스 보안에 관련된 내용을 종합적으로 쓴 책. 저자의 명성 그대로 보안관련의 모든 내용이 그대로 담겨져 있다.