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

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

 
는. 좀 더 깔끔하게 다듬기 -2 에러 처리
조회 : 3,006  


[강좌] php+mysql 게시판 만들기 #는-2

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

나우누리의 '푸른잎새'님의 건의로 이젠 소스를 보여드리기 전에 간단한 흐름도를 먼저 넣겠습니다. ^^;
(그 분은 짬뽕을 무척 좋아하시더군요. 흑. 먹고 싶어서 침 흘리며 쳐다봐도 제 시선을 무참히 씹어버리고 혼자서 맛있게 야금 야금 드시더군요. 흑...미어 T_T (...... 진실일까..))


는. 화면을 좀 더 이쁘게

b. 에러 처리


이제 마무리에 해당하는 거군요. 제가 이전 강좌에서 보안에 대해 강조했었습니다.
그리고 보안 강화의 방법 중 하나로 '예외 처리'를 하라고 했는 걸 기억하실 겁니다.
(..기억나세요? -_-;) 예를 들어 게시판이 1이라는 행동을 하도록 하려는데 이용자가 장난을 쳐서(?) 2라는 행동을 하게 되었다고 하죠.
이때 게시판에 1 이외의 행동은 거부하는 등의 예외 처리가 없을 경우 그것은 어쩌면 심각한 보안 문제를 불러올 수 있습니다.

갑자기 왜 이 이야기냐구요? ^^; 바로 에러 처리 때문입니다.
그런데 에러 처리는 꼭 위와 같은 예외 처리뿐 아니라 게시판의 문제점을 손쉽게 찾을 수 있는 방법입니다.
또한 이용자가 게시판 이용 중 뭔가 비정상적으로 작동이 될 경우 에러가 발생되며 운영자에게 제보할 수도 있을 겁니다(..정말?).

자 그럼 우리가 여지껏 작성한 delete.php3, edit.php3, fill.php3, function.php3, list.php3, run.php3, view.php3 들의 에러 처리의 문제를 알아보죠.

앗. 알아볼 것도 없군요. 여지껏 우리는 기능 구현만 했지 전혀 에러 처리를 하지 않았습니다. ^^;

그럼 발생될 수 있는 에러를 찾아보고 해결해볼까요?


1. board 지정 안함


예이. 어떤 게시판인지 지정 안했을 때입니다.
예를 들면

list.php3?board=testboard

처럼 하지 않고

list.php3

처럼 했다거나

fill.php3?board=testboard

처럼 하지 않고

fill.php3

만 했을 경우겠죠. 이렇게 하면 게시판 script 는 어떤 게시판(테이블)을 access 해야할 지 모릅니다.
그러니 우리는 이걸 체크해서 지정되지 않으면 에러 메시지를 출력해보겠습니다.

이러한 에러 처리는 function.php3 에 넣겠습니다.

function error_board () {
global $board;

if ($board == "") {
echo "
<script language="javascript">
alert("게시판이 선택되지 않았습니다.");
history.back();
</script>
";
exit;
}
}

그런 뒤 fill.php3 등에서 사용할 곳마다 error_board(); 를 넣으시면 $board 변수가 있는지 없는지 체크한답니다. 방식은

게시판이 선택되지 않았습니다 라고 경고창 띄운 뒤 자동으로 이전 화면으로 이동시켜줍니다.

물론 그 전에 function.php3 파일이 사용하는 파일에 읽혀진 상태가 아니라면 읽어와야겠죠.

require "function.php3";

를 넣으세요. 가급적 위에. 예를 들어 fill.php3 에 넣는다면

<?
/*--------------------------
filename : fill.php3
--------------------------*/
require "function.php3";

error_board();


이렇게 하면 간단하겠죠? :]


2. no 지정 안함


글 읽기, 글 수정, 글 삭제는 특정 글에 대한 접근을 합니다.
그리고 우리는 어떠한 특정 글임을 구분 짓는 고유한 것으로 no attribute 를 사용합니다.
(PRIMARY KEY) 때문에 글을 읽거나 수정하거나 삭제할 때는 반드시 어떤 글을 접근할 건지 지정해줘야 합니다. (다음 회에 나올 답신 달기도 마찬가지입니다)

view.php3?board=testboard&no=10
~~~~~

바로 이거. 이게 없으면 글 읽기, 수정, 삭제가 안됩니다. 그래서 우리는 no 도 체크해줄 필요가 있습니다. ^^;

방법은 위와 거의 동일합니다. (같다고 해야하나)

function error_no () {
global $no;

if ($no == "") {
echo "
<script language="javascript">
alert("게시물 번호가 선택되지 않았습니다.");
history.back();
</script>
";
exit;
}
}

에헤헤. 그런데 조금 더 꼼꼼하게 해볼까요?
사용자가 말을 잘 들어서 no=12 뭐 이런 거를 순순히 했는데 갑자기 장난하고 싶어서 게시판에 존재하지 않는 글 번호를 입력했습니다.
예를 들어 no 는 12까지 밖에 없는데 no=13 이라고 한다거나 no=0 으로 한다거나요.
이럴 경우는 위의 if 문을 살짝 더 다듬어야 합니다.

일단 글번호가 0 보다 작은 경우를 체크해야하고, 존재하는 글인지 체크해야 합니다.

if (($no < 0) || ($no > $tlpn[num])) {

이겁니다. 쉽죠? 그런데 이거는 중대한 결점 한 가지가 있습니다. 뭐냐구요?
자. 이번엔 저 혼자 묻고 저 혼자 대답하지 않습니다.
한 번 맞춰보세요. (답은 이번 회 끝나는 부근에 있습니다)


3. 필수 입력 체크

글 입력할 때 필수적으로 입력되야할 사항들이 있을 겁니다. 뭐. 게시판 만드는 분의 마음이지만
보통의 경우 작성자명과 글 제목, 본문은 필수로 하죠. 때에 따라서는 비밀 번호도. 이걸 체크해서
만약 입력되지 않았다면 되돌아가서 입력되게 해야합니다.

이 방법은 크게 두 가지입니다.
Java script 를 이용한 Client 체크 방식과 php script 자체가 체크하는 Server 체크 방식이죠.

전자의 방식은 서버로 데이터 넘겨서 체크하고 하는 식이 아닌 이용자의 웹 브라우저가 직접체크하기 때문에 무척 빠릅니다.
게다가 서버에게 일을 시키지 않으므로 서버에 일을 안시켜서 자잘하게나마 서버의 부하를 막을 수 있구요.
하지만 Java script 를 지원하지 않거나 정확한 테스트 없이 코딩해서 웹 브라우저간의 차이가 나타나면 곤란합니다. :]

후자의 방식은 이용자가 어디에서 어떤 환경에서 글을 입력하건 상관없이 처리가 가능하죠. 단점요?
예상하셨다시피 서버가 직접 체크하기 때문에 크건 작건간에 서버에 부하를 줍니다.

그러나 우리는 php 를 이용한 웹 게시판 작성을 배우는 것이지 java script 를 이용한 효율적인
웹 게시판 작성을 배우려는게 아니므로 후자의 방식 체크만 알아보겠습니다.
(흑..소..솔직히 타이핑 하기 귀찮아서 -_-; 지금 너무나 배가 고프거든요)

그러나 방법은 이미 나와버렸습니다. 바로 이거죠.

if ($board == "") {

변수의 내용이 "", 즉 아무것도 없다면.. 이라는 내용입니다.
이런 식으로 체크해서 없으면 에러 발생하시면 된답니다. 그런데 자주 쓰일지 모르죠?
함수로 묶어버리겠습니다.

function check_input ($name, $title, $text) {
if (($name == "") || ($title == "") || ($text == "")) {
echo "<script language="javascript">
alert("작성자명, 글 제목, 글 본문은 필수적으로 입력해야 합니다");
history.back();
</script>
";
exit;
}
}

위 함수 function.php3 에 들어가는거 아시죠?
그런 뒤 run.php3 를 수정하세요. 일단 맨 위에

require "function.php3";

넣으시구요.

if ($mode == "write") {

if ($mode == "modify") {

두 개 각 각에

check_input($fil[name], $fil[email], $fil[text]);

를 넣으시면 됩니다. :]

아아 강좌가 갈수록 허접해갑니다. 제가 느끼고 있으니 제 강좌를 보시는 분들은 오죽할까. T_T 요즘 일에
치여 사는데 강좌는 써야겠고 하다보니 어쩔 수 없이 내용이 부실해지내요. 정말 죄송합니다. T_T

이제 게시판 만드는 건 80% 정도가 끝났습니다. 이제남은 20%(무려 20%!!)에 해당하는 답신글 구현을
하면 사실상 게시판으로서의 작업은 끝나는군요.

아참. 제가 예전에 유치뽕짝이라는 이름의 웹진에 perl 강좌를 쓴 적이 있습니다.
그건 지금거보다 매우 허접했죠.
차후에 기회가 닿으면 보강해서 올리겠습니다. (하지만 귀찮아잉. 흑흑. php 는 편한뎅)

냐냥. 7월 13일에 뵈요. :]

p.s : 본 강좌는

나우누리의 isf (Internet Study Forum)
나우누리의 sgcgi (cgi forum)
제 개인 홈페이지 (http://creple.com/dimanche)
co.co.Netizen (http://coco.st)

에만 올라와 있어야 합니다. 다른 곳에 게재하실 때에는 반드시 제게 먼저 연락을 주세요.
안그러면 폭주할 겁니다. --+

*** : 답
글의 총 갯수와 no 의 숫자는 관계가 없습니다. 만약 글이 17개 입력되었다가 3개가 삭제되었다고 하죠.
그러면 글 총 갯수는 14개입니다.
그래서 no > $tlnp[num] 이라고 체크할 경우 15, 16, 17번 글은 존재하지 않는 게시물로 체크가 되는 버그가 있습니다.

때문에 SELECT 로 글을 검색시켜봐서 결과값이 나오면 존재하는 글로, 결과값이 안나오면 존재하지 않는
글로 처리해야겠죠.

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

if (($no <= 0) || (!$ok)) {

이어야 합니다. :] mysql_num_rows() 함수가 뭐냐구요? 이건 결과값의 rows 값, 즉 행의 값을 구합니다.
저는 회원 id 등을 검색시킨 뒤 mysql_num_rows 로 나온 값이 0 이면 존재하지 않음, 1 이면 존재함으로 체크해서 사용한답니다.
^^

근데 이거 그다지 좋은 방법은 아니에요. 두 세번 db 에 접속해서 쿼리를 날리잖아요. 가급적이면
최적화시켜서 한 번 접속으로 일들을 처리하는게 좋죠. 물론 게시물 번호 체크도 충분히 된답니다.

그 방법은 다음 회에서 다루겠습니다. ^^;

----------------------------
함께하면 즐거운 사이트들 (-_-; 광고임 -_-;)
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=588


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

 
디망쉬
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
펴낸곳(주)수퍼유저

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