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

는. 좀 더 깔끔하게 다듬기 -2 에러 처리

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

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

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

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


icon04.gif
는. 화면을 좀 더 이쁘게

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
----------------------------


- ?! 디망쉬

관련자료

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

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,850 개
  • 현재 접속자 :  111 명