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

제 11강 - msqlperl - 검색


이제 앞서 입력한 Student Table를 검색하고 그 결과를 출력하는 CGI를 작성하도록 하자. Student 테이블은 다음과 같다.

Student Table
sid sname phone lid class
924201 김재근 244-2912 1 전자공학과
964201 조경룡 123-4598 1 전자공학과
974201 김제찬 244-6597 2 전자공학과
974202 차은정 211-5555 2 전자공학과
974203 한창문 357-5678 2 전자공학과

이 DB 검색 CGI도 msql.cgi와 비슷한 구조를 갖는다. DB 검색 CGI의 구조

DB 검색 CGI의 구조
sindex.html
msql 모니터 CGI에서와 동일한 역할을 하는 프레임 배치용파일이다. 윗 프레임에는 테이타베이스에 등록된 테이블의 목록과 검색폼을 출력하는 dbsearch.cgi를 호출하며 아래쪽 프레임에는 dbsearch.cgi에대한 간단한 도움말이 포함되어 있는 sbelow.html을 불러온다.
sbelow.html
dbsearch.cgi에대한 간단한 도움말을 포함하고 있는 HTML 문서이다. 현재에는 어떠한 도움말도 없으므로 필요한 사람이 필요에 맞게 작성하도록 한다.
dbsearch.cgi
DB 검색 CGI의 핵심으로 인자 없이 호출하면 등록된 데이터베이스의 테이블 목록과 필드명을 포함한 검색폼을 생성한다. 테이블의 이름과 검색기준(필드명), 검색어를 주면 검색을 수행한 후 그 결과를 리턴한다.
프레임 파일(sindex.html)

msql 모니터 CGI에서와 동일한 역할을 하는 프레임 배치용파일이다.

 1 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
 2 : <HTML>
 3 : <HEAD>
 4 : <TITLE>DB 검색 CGI</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="80,*" FRAMEBORDER="NO" FRAMESPACING="0" BORDER="0">
11 :      <FRAME NAME="searchtop" SRC="http://qaos.com/~artech/cgi-bin/dbsearch.cgi"
		 MARGINHEIGHT="0" MARGINWIDTH="0" SCROLLING="NO" NORESIZE >
12 :      <FRAME NAME="searchbelow" SRC="./sbelow.html" MARGINHEIGHT="0"
		 MARGINWIDTH="10" SCROLLING="AUTO" >
13 : </FRAMESET>
14 : </HTML>
15 : </html>
도움말 파일(sbelow.html)

dbsearch.cgi에대한 간단한 도움말을 포함하고 있는 HTML 문서이다.

 1 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
 2 : <HTML>
 3 : <HEAD>
 4 : <TITLE>DB 검색 CGI 도움말</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>
검색 프로그램(dbsearch.cgi)

DB 검색 CGI의 핵심으로 인자 없이 호출하면 등록된 데이터베이스의 테이블 목록과 필드명을 포함한 검색폼을 생성한다.

테이블의 이름과 검색기준(필드명), 검색어를 주면 검색을 수행한 후 그 결과를 리턴한다. 소스

  1 : #! /usr/local/bin/perl
  2 : require './cgi-lib.pl';
  3 : 
  4 : $database = 'commlab';
  5 : 
  6 : ReadParse(*FORM);
  7 : 
  8 : use Msql;
  9 : 
 10 : $dbh = Msql->connect;
 11 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
 12 : 
 13 : $dbh->selectdb($database);
 14 : 
 15 : if($FORM{'table'} eq '') {
 16 : 	print SearchForm();
 17 : }
 18 : 
 19 : $query =<<Query;
 20 : select _rowid, sid, sname, phone, lid, class from $FORM{'table'}
 21 : where $FORM{'select'} like '%$FORM{'query'}%'
 22 : Query
 23 : 
 24 : $query =~ tr/[\n,\r]/[ , ]/;
 25 : 
 26 : $sth = $dbh->query($query);
 27 : 
 28 : unless(defined($sth)) {
 29 : 	$msg = $dbh->errmsg;
 30 :  	CgiDie("$msg", $FORM{'query'});
 31 : }
 32 : 
 33 : @fields = $sth->name;
 34 : 
 35 : print PrintHeader();
 36 : print HtmlTop('질의결과');
 37 : 
 38 : print <<Table;
 39 : <div align=center>
 40 : <table border=1 celpadding=1>
 41 : <tr>
 42 : Table
 43 : 
 44 : for(0..$#fields) {
 45 : 	print "<th> $fields[$_] </th>\n";
 46 : }
 47 : 
 48 : print "</tr>\n";
 49 : 
 50 : while(@row = $sth->fetchrow) {
 51 : 	print "<tr>\n";
 52 : 	for(0..$#row) {
 53 : 		$row[$_] = '&nbsp;' if($row[$_] eq '');
 54 : 		print "<td> $row[$_] </td>\n";
 55 : 	}
 56 : 	print "</tr>\n";
 57 : }
 58 : 
 59 : print "</table></div>\n";
 60 : 
 61 : print HtmlBot();
 62 : 
 63 : sub SearchForm {
 64 : print PrintHeader();
 65 : print HtmlTop();
 66 : 
 67 : print <<Form;
 68 : <div align=center>
 69 : <form action="/~artech/cgi-bin/dbsearch.cgi" method=post
		target=searchbelow>
 70 : <table border="0" cellpadding="0" cellspacing="1">
 71 : <TR>
 72 : 	<TH>테이블</TH>
 73 : 	<TH>검색기준</TH>
 74 : 	<TH>검색어</TH>
 75 : 	<TH>&nbsp;</TH>
 76 : </TR>
 77 : <TR>
 78 : 	<TD align=center valign=top>
 79 : 	<select name="table">
 80 : Form
 81 : 
 82 : @tables = $dbh->listtables;
 83 : for(0..$#tables) {
 84 : 	print "<option> $tables[$_]\n";
 85 : }
 86 : 
 87 : print <<Form;
 88 : 	</select>
 89 : 	</TD>
 90 : 
 91 : 	<TD>
 92 : 	<select name=select>
 93 : 	<option value=sid>학번
 94 : 	<option value=sname>이름
 95 : 	<option value=phone>전화
 96 : 	<option value=lid>강좌번호
 97 : 	<option value=class>학과
 98 : 	</select>
 99 : 	</TD>
100 : 
101 : 	<TD><input type=text name=query size=40></TD>
102 : 
103 : 	<TD valign=top><input type=submit value="보내기"></TD>
104 : </TR>
105 : </table>
106 : </form>
107 : </div>
108 : Form
109 : 
110 : print HtmlBot();
111 : 
112 : exit;
113 : }
실행결과
DB 검색 결과
설명
1~13
cgi-lib.pl 라이브러리를 호출하고, 폼 데이터를 읽고, DB 엔진에 접속, DB를 선택하는 부분이다. msql.cgi나 listdb.cgi와는 달리 데이터베이스의 이름을 알고 있어야 하므로 데이터베이스의 이름은 CGI 프로그램 내에서 할당했다.
  4 : $database = 'commlab';
또한 테이블의 목록을 가져오기위해 데이터베이스를 선택한 후 폼을 출력하는 SearchForm()를 호출한다는 사실에 주의하기 바란다.
 13 : $dbh->selectdb($database);
 14 : 
 15 : if($FORM{'table'} eq '') {
 16 : 	print SearchForm();
 17 : }

19~22
검색할 질의어를 생성하는 부분이다. msql 모니터 프로그램에서 SQL문을 입력하는 것과 동일하다. query 메소드에 직접입력해도 되지만 가독성을 위해 따로처리하였다. 이 부분에서 주의할 것은 _rowid라는 시스템 변수를 출력 필드에 포함시킨다는 점이다. 필드 데이타는 같을 수 있지만 시스템에의해 생성되는 _rowid는 항상 다르기 때문에 데이터의 수정이나 삭제는 반드시 이 _rowid를 이용해야 한다.
 20 : select _rowid, sid, sname, phone, lid, class from FORM{'table'}
SQL문에서 조건은 중간자 검색을 수행하기위해 LIKE 정규식을 사용했으며, 폼의 VALUE 속성의 값을 필드명으로 사용했다. 21 : where $FORM{'select'} like '%$FORM{'query'}%'

$query =~ tr/[\n,\r]/[ , ]/;
SQL 질의를 입력하는 중에 삽입된 개행문자를 공백으로 변환하는 부분이다. Unix를 기반으로 동작시키는 경우에 이 행은 생략해도 된다.

$sth = $dbh->query($query);
실제 사용자의 질의가 mSQL DB 엔진으로 전송된다. msql 모니터 프로그램에서 '\g'를 입력한 것과 동일하다고 보면 된다.

33~61
msql.cgi와 완전히 동일하다. 질의를 수행하고 그 결과를 HTML의 표로 출력하는 부분이다.

63~113
msql.cgi와 거의 동일하다. 다만 msql은 데이터베이스에대한 질의를 수행하지만 검색은 테이블에 대한 질의를 수행하므로 출력되는 검색폼에 약간의 차이가 있을 뿐이다. 한가지 주의 한 것은 92~98행에서 사용한 <SELECT> 태그이다. 사용자가 선택한 값을 바로 WHERE 구문의 필드명으로 사용하기위해 <OPTION> 태그의 VALUE 속성을 필드명으로 했다.
 92 : 	<select name=select>
 93 : 	<option value=sid>학번
 94 : 	<option value=sname>이름
 95 : 	<option value=phone>전화
 96 : 	<option value=lid>강좌번호
 97 : 	<option value=class>학과
 98 : 	</select>


다음글: 제 12강 - msqlperl - 삽입 (4780)1996-05-12
이전글: 제 10강 - msqlperl - msql (5048)1996-05-10

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


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