날짜: 1996-05-10 | 글쓴이: 도아 | 4869 번 | 프린트 | 메일로보내기

제 10강 - msqlperl - msql


msqlperl을 이용한 웹/DB 연동의 두 번째 예로서 Unix 명령행에서 사용한 msql 모니터 프로그램을 구현해보자.

msql 모니터 프로그램은 사용자가 입력한 SQL문을 mSQL DB 엔진으로 전송하면 되므로 상당히 쉽게 구현될 수 있다.

프로그래밍과 사용의 편의를 위해 msql 모니터 프로그램은 다음과 같은 구조로 구현되었다. msql 모니터 프로그램의 구조

모니터 프로그램의 구조
mindex.html
프레임 배치용파일로서 하나의 창을 두 개의 프레임으로 나누는 역할을 한다. 윗 프레임에는 데이터베이스의 목록과 msql 모니터 입력폼을 생성하기위해 msql.cgi를 호출하며, 아래쪽 프레임에는 msql 모니터 프로그램에대한 간단한 도움말이 포함되어 있는 mbelow.html을 불러온다.
mbelow.html
msql 모니터 프로그램에대한 간단한 도움말을 포함하고 있는 HTML 문서이다. 현재에는 어떠한 도움말도 없으므로 필요한 사람이 필요에 맞게 작성하도록 한다.
msql.cgi
msql 모니터 프로그램의 핵심으로 인자 없이 호출하면 등록된 데이터베이스 목록을 포함한 검생폼을 생성한다. 데이터베이스의 이름과 SQL문을 주면 해당 SQL 질의를 수행한 후 그 결과를 리턴한다.
프레임 파일(mindex.html)

프레임 배치용파일로서 하나의 창을 두 개의 프레임으로 나누는 역할을 한다. 간단한 HTML 파일이며, 프레임에대한 자세한 사항은 HTML 매뉴얼을 참조한다.

 1 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
 2 : <HTML>
 3 : <HEAD>
 4 : <TITLE>mSQL 모니터 프로그램</TITLE>
 5 : 
 6 : <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-KR">
 7 : <LINK REV="made" HREF="mailto:webmaster@mailx2.com">
 8 : <META NAME="author" content="Jae-Geun, Kim">
 9 : </HEAD>
10 : <FRAMESET ROWS="120,*" FRAMEBORDER="NO" FRAMESPACING="0" BORDER="0">
11 :      <FRAME NAME="searchtop" SRC="http://qaos.com/~artech/cgi-bin/msql.cgi"
		 MARGINHEIGHT="0" MARGINWIDTH="0" SCROLLING="NO" NORESIZE >
12 :      <FRAME NAME="searchbelow" SRC="./mbelow.html" MARGINHEIGHT="0"
		 MARGINWIDTH="10" SCROLLING="AUTO" >
13 : </FRAMESET>
14 : </HTML>
15 : </html>
도움말 파일(mbelow.html)

msql 모니터 프로그램에대한 간단한 도움말을 포함하고 있는 HTML 문서이다. 마찬가지로 보다 자세한 사항은 HTML 매뉴얼을 참조한다.

 1 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
 2 : <HTML>
 3 : <HEAD>
 4 : <TITLE>사이트검색</TITLE>
 5 : 
 6 : <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-KR">
 7 : <LINK REV="made" HREF="mailto:webmaster@mailx2.com">
 8 : <META NAME="author" content="Jae-Geun, Kim">
 9 : <META name="generator" content="Super NoteTab 4.0">
10 : <META name="keywords" content="DoA, Site, Search, Crack, File">
11 : <META name="description" content="Search DoA's Site">
12 : 
13 : </HEAD>
14 : <body>
15 : 
16 : <H2> 도움말 </H2>
17 : <hr noshade size=4>
18 : 
19 : </body>
20 : </html>
모니터 프로그램(msql.cgi)

msql 모니터 프로그램의 핵심으로 인자 없이 호출하면 등록된 데이터베이스 목록을 포함한 검색폼을 생성하며, 데이터베이스의 이름과 SQL문을 주면 해당 SQL 질의를 수행한 후 그 결과를 아래쪽 프레임으로 리턴한다. 소스

 1 : #! /usr/local/bin/perl
 2 : require './cgi-lib.pl';
 3 : 
 4 : ReadParse(*FORM);
 5 : 
 6 : use Msql;
 7 : 
 8 : $dbh = Msql->connect;
 9 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
10 : 
11 : if($FORM{'database'} eq '') {
12 : 	print SearchForm();
13 : }
14 : 
15 : $dbh->selectdb($FORM{'database'});
16 : $FORM{'query'} =~ s/[\cM | \n]/ /g;
17 : $sth = $dbh->query($FORM{'query'});
18 : 
19 : unless(defined($sth)) {
20 : 	$msg = $dbh->errmsg;
21 :  	CgiDie("$msg", $FORM{'query'});
22 : }
23 : 
24 : CgiDie("질의결과", "테이블 생성", "테이블이 생성되었습니다") 
		if($FORM{'query'} =~ /^create/i);
25 : CgiDie("질의결과", "테이블 삭제", "테이블이 삭제되었습니다") 
		if($FORM{'query'} =~ /^drop/i);
26 : CgiDie("질의결과", "데이타 삽입", "데이타가 삽입되었습니다") 
		if($FORM{'query'} =~ /^insert/i);
27 : CgiDie("질의결과", "데이타 수정", "데이타가 수정되었습니다") 
		if($FORM{'query'} =~ /^update/i);
28 : CgiDie("질의결과", "데이타 삭제", "데이타가 삭제되었습니다") 
		if($FORM{'query'} =~ /^delete/i);
29 : @fields = $sth->name;
30 : 
31 : print PrintHeader();
32 : print HtmlTop('질의결과');
33 : 
34 : print <<Table;
35 : <div align=center>
36 : <table border=1 celpadding=1>
37 : <tr>
38 : Table
39 : 
40 : for(0..$#fields) {
41 : 	print "<th> $fields[$_] </th>\n";
42 : }
43 : 
44 : print "</tr>\n";
45 : 
46 : while(@row = $sth->fetchrow) {
47 : 	print "<tr>\n";
48 : 	for(0..$#row) {
49 : 		$row[$_] = '&nbsp;' if($row[$_] eq '');
50 : 		print "<td> $row[$_] </td>\n";
51 : 	}
52 : 	print "</tr>\n";
53 : }
54 : 
55 : print "</table></div>\n";
56 : 
57 : print HtmlBot();
58 : 
59 : sub SearchForm {
60 : print PrintHeader();
61 : print HtmlTop();
62 : print <<Form;
63 : <div align=center>
64 : <form action="/~artech/cgi-bin/msql.cgi" method=post target=searchbelow>
65 : <table border="0" cellpadding="0" cellspacing="1">
66 : <TR>
67 : 	<TH>DB</TH>
68 : 	<TH>질의</TH>
69 : 	<TH>&nbsp;</TH>
70 : </TR>
71 : <TR>
72 : 	<TD align=center valign=top>
73 : 	<select name="database">
74 : Form
75 : 
76 : @db = $dbh->listdbs;
77 : for(0..$#db) {
78 : 	print "<option> $db[$_]\n";
79 : }
80 : 
81 : print <<Form;
82 : 	</select>
83 : 	</TD>
84 : 
85 : 	<TD>
86 : 	<textarea name=query cols=40 rows=5 wrap=soft></textarea>
87 : 	</TD>
88 : 
89 : 	<TD valign=top><input type=submit value="보내기"></TD>
90 : </TR>
91 : </table>
92 : </form>
93 : </div>
94 : Form
95 : 
96 : print HtmlBot();
97 : 
98 : exit;
99 : }
실행결과
msql의 실행결과
설명
1~9
앞서와 마찬가지로 폼데이타를 읽고, mSQL DB 엔진에 접속하는 부분이다. 다만 msql.cgi에서는 Perl의 호출규칙보다는 일반적인 언어의 함수 호출규칙을 따랐다. 또한
ReadParse(*FORM);
과 같은 식으로 ReadParse를 호출하면 이후의 폼데이타의 참조는 %FORM를 통해이루어진다는 것에 주의하기 바란다.

11~13
폼에서 데이터베이스의 이름을 주지 않은 경우, 데이터베이스의 목록과 검색폼을 출력하는 SearchForm() 함수를 호출한다.

$dbh->selectdb($FORM{'database'};
폼을 통해 데이터베이스의 이름이 전달된 경우, 해당 데이터베이스를 선택한다.

$FORM{'query'} =~ s/[\cM | \n]/ /g;
사용자 입력에 포함된 개행문자를 제거한다. 여기서 \cM은 Ctrl-M을 의미하며, 사용자의 클라이언트가 Windogs 95나 Windogs NT인 경우 개행문자외에 Ctrl-M을 포함하기 때문에 삽입된 부분이다.

$sth = $dbh->query($FORM{'query'});
실제 사용자의 질의가 수행되는 부분이다. 이 것은 msql 모니터 프로그램에서 '\g'를 입력한 것과 동일한 역할을 한다.

19~22
앞서 언급한 것처럼 질의가 정상적으로 수행되었는지를 검사하는 부분이다. SQL 문상의 오류로 질의가 수행되지 않은 경우 CgiDie()와 $dbh->errmsg를 이용해서 해당 오류 메시지를 출력한다.

24~28
create, drop, insert, update, delete와 같이 Row 데이터를 리턴하지 않는 질의의 경우, 질의수행 결과를 리턴하는 문장이다.

while(@row = $sth->fetchrow)
$sth->fetchrow를 이용해서 한행씩 가져와 배열 @row에 저장하는 문장이다. Perl에서는 조건연산자과 와야하는 부분에 할당연산자가 올 수 있으며, 이 경우 Row 데이터를 가져올 수 있는한 참이다. 일단 데이터를 가져오면 dataseek는 자동으로 1씩증가한다.

$row[$_] = '&nbsp;' if($row[$_] eq '');
가져온 데이터가 필드값을 갖지 않은 경우, HTML Table에서는 표의 모양이 깨짐으로 이 것을 막기위해 &nbsp;를 할당한다. 여기서 &nbsp;는 Non-breaking Space를 의미하며 공백문자를 출력하는 HTML 코드이다.
46 : while(@row = $sth->fetchrow) {	#표의 한줄을 생성
47 : 	print "<tr>\n";
48 : 	for(0..$#row) {			# 표의 한 셀을 생성
49 : 		$row[$_] = '&nbsp;' if($row[$_] eq '');
50 : 		print "<td> $row[$_] </td>\n";
51 : 	}
52 : 	print "</tr>\n";
53 : }

31~57
결과를 HTML 표로 만드는 부분이다. 자세한 것은 HTML 매뉴얼을 참조한다.

59~99
msql.cgi가 인자없이 호출되는 경우 등록된 데이터베이스의 목록과 검색폼을 만드는 서브루틴이다. 등록된 데이터베이스의 목록은 listdb.cgi에서 생성한것과 동일한 방법으로 생성한다. 검색폼은 Part I에서 설명한 <FORM> 관련 태그를 이용하고 있다. 자세한 사항은 Part I를 참조하기 바란다.


다음글: 제 11강 - msqlperl - 검색 (5178)1996-05-11
이전글: 제 9강 - msqlperl - relshow 구현 (4858)1996-05-09

세상사는 이야기

  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >
  • 탈옥의 필수, QuickDo >
  • 윈도 10, 한영 전환도 >
  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2014 QAOS.com All rights reserved.