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

제 12강 - msqlperl - 삽입


웹과 DB의 연동은 대부분 비슷한 절차(DB 엔진 접속, DB 선택, 질의, 결과출력)를 거치며, 질의를 수행하는 SQL 문만 차이가 난다.

사용자가 데이터를 직접입력하는 것도 대부분은 검색 CGI와 유사하면 차이가 나는 부분은 SQL문에 불과하다. 입력폼(dbinsert.html)

사용자의 입력을 받아들이는 폼문서이다. 한번에 5명의 사용자를 입력할 수 있도록 작성됐다. 소스

 1 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
 2 : <HTML>
 3 : <HEAD>
 4 : <TITLE>학적부 관리</TITLE>
 5 : <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=EUC-KR">
 6 : </HEAD>
 7 : 
 8 : <BODY>
 9 : 
10 : <H2> 데이타 삽입 </H2>
11 : <hr noshade size=4>
12 : 
13 : <div align=CENTER>
14 : <FORM ACTION="/~artech/cgi-bin/dbinsert.cgi" METHOD="post">
15 : <table border="1" cellpadding="0" cellspacing="2">
16 : <TR>
17 : 	<TH>학  번</TH>
18 : 	<TH>이  름</TH>
19 : 	<TH>전  화</TH>
20 : 	<TH>강좌번호</TH>
21 : 	<TH>학  과</TH>
22 : </TR>
23 : <TR>
24 : 	<TD><INPUT TYPE="TEXT" NAME="sid1" SIZE="8" MAXLENGTH="8"></TD>
25 : 	<TD><INPUT TYPE="TEXT" NAME="sname1" SIZE="12" MAXLENGTH="12"></TD>
26 : 	<TD><INPUT TYPE="TEXT" NAME="phone1" SIZE="15" MAXLENGTH="15"></TD>
27 : 	<TD><INPUT TYPE="TEXT" NAME="lid1" SIZE="8" MAXLENGTH="8"></TD>
28 : 	<TD><INPUT TYPE="TEXT" NAME="class1" SIZE="20" MAXLENGTH="20"></TD>
29 : </TR>
30 : <TR>
31 : 	<TD><INPUT TYPE="TEXT" NAME="sid2" SIZE="8" MAXLENGTH="8"></TD>
32 : 	<TD><INPUT TYPE="TEXT" NAME="sname2" SIZE="12" MAXLENGTH="12"></TD>
33 : 	<TD><INPUT TYPE="TEXT" NAME="phone2" SIZE="15" MAXLENGTH="15"></TD>
34 : 	<TD><INPUT TYPE="TEXT" NAME="lid2" SIZE="8" MAXLENGTH="8"></TD>
35 : 	<TD><INPUT TYPE="TEXT" NAME="class2" SIZE="20" MAXLENGTH="20"></TD>
36 : </TR>
37 : <TR>
38 : 	<TD><INPUT TYPE="TEXT" NAME="sid3" SIZE="8" MAXLENGTH="8"></TD>
39 : 	<TD><INPUT TYPE="TEXT" NAME="sname3" SIZE="12" MAXLENGTH="12"></TD>
40 : 	<TD><INPUT TYPE="TEXT" NAME="phone3" SIZE="15" MAXLENGTH="15"></TD>
41 : 	<TD><INPUT TYPE="TEXT" NAME="lid3" SIZE="8" MAXLENGTH="8"></TD>
42 : 	<TD><INPUT TYPE="TEXT" NAME="class3" SIZE="20" MAXLENGTH="20"></TD>
43 : </TR>
44 : <TR>
45 : 	<TD><INPUT TYPE="TEXT" NAME="sid4" SIZE="8" MAXLENGTH="8"></TD>
46 : 	<TD><INPUT TYPE="TEXT" NAME="sname4" SIZE="12" MAXLENGTH="12"></TD>
47 : 	<TD><INPUT TYPE="TEXT" NAME="phone4" SIZE="15" MAXLENGTH="15"></TD>
48 : 	<TD><INPUT TYPE="TEXT" NAME="lid4" SIZE="8" MAXLENGTH="8"></TD>
49 : 	<TD><INPUT TYPE="TEXT" NAME="class4" SIZE="20" MAXLENGTH="20"></TD>
50 : </TR>
51 : <TR>
52 : 	<TD><INPUT TYPE="TEXT" NAME="sid5" SIZE="8" MAXLENGTH="8"></TD>
53 : 	<TD><INPUT TYPE="TEXT" NAME="sname5" SIZE="12" MAXLENGTH="12"></TD>
54 : 	<TD><INPUT TYPE="TEXT" NAME="phone5" SIZE="15" MAXLENGTH="15"></TD>
55 : 	<TD><INPUT TYPE="TEXT" NAME="lid5" SIZE="8" MAXLENGTH="8"></TD>
56 : 	<TD><INPUT TYPE="TEXT" NAME="class5" SIZE="20" MAXLENGTH="20"></TD>
57 : </TR>
58 : <TR align=center>
59 : 	<TD colspan=5>
60 : 	<INPUT TYPE="SUBMIT" VALUE="보내기">
61 : 	<INPUT TYPE="RESET" VALUE="지우기">
62 : 	</TD>
63 : </TR>
64 : </table>
65 : </FORM>
66 : </div>
67 : </BODY>
68 : </HTML>
결과
삽입화면
삽입 프로그램(dbinsert.cgi)

사용자의 폼입력을 받아 실제 테이블에 데이터를 삽입하는 CGI이다. 앞의 검색 CGI와 거의 비슷하며, 여러 사용자의 입력을 위해 순환문을 사용했다. 소스

 1 : #! /usr/local/bin/perl
 2 : require './cgi-lib.pl';
 3 : 
 4 : $database = 'mhlee';
 5 : $table = 'stable';
 6 : 
 7 : ReadParse(*FORM);
 8 : 
 9 : use Msql;
10 : 
11 : $dbh = Msql->connect;
12 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
13 : 
14 : $dbh->selectdb($database);
15 : 
16 : for(1..5) {
17 : 	$sid = "sid$_";
18 : 	$sname = "sname$_";
19 : 	$phone = "phone$_";
20 : 	$lid = "lid$_";
21 : 	$class = "class$_";
22 : 
23 : 	next if($FORM{$sid} eq '' || $FORM{$sname} eq '' || $FORM{$lid} eq '' 
		|| $FORM{$class} eq '');
24 : 
25 : 	$insert =<<Query;
26 : insert into $table
27 : values('$FORM{$sid}','$FORM{$sname}', '$FORM{$phone}', $FORM{$lid},
	'$FORM{$class}')
28 : Query
29 : 
30 : 	$query =~ tr/[\n,\r]/[ , ]/;
31 : 
32 : 	$sth = $dbh->query($insert);
33 : 	unless(defined($sth)) {
34 : 		$msg = $dbh->errmsg;
35 :  		CgiDie("$msg", $FORM{'query'});
36 : 	}
37 : }
38 : 
39 : $query =<<Query;
40 : select _rowid, sid, sname, phone, lid, class from $table 
41 : Query
42 : 
43 : $query =~ tr/[\n,\r]/[ , ]/;
44 : 
45 : $sth = $dbh->query($query);
46 : 
47 : unless(defined($sth)) {
48 : 	$msg = $dbh->errmsg;
49 :  	CgiDie("$msg", $FORM{'query'});
50 : }
51 : 
52 : @fields = $sth->name;
53 : 
54 : print PrintHeader();
55 : print HtmlTop('질의결과');
56 : 
57 : print <<Table;
58 : <div align=center>
59 : <table border=1 celpadding=1>
60 : <tr>
61 : Table
62 : 
63 : for(0..$#fields) {
64 : 	print "<th> $fields[$_] </th>\n";
65 : }
66 : 
67 : print "</tr>\n";
68 : 
69 : while(@row = $sth->fetchrow) {
70 : 	print "<tr>\n";
71 : 	for(0..$#row) {
72 : 		$row[$_] = '&nbsp;' if($row[$_] eq '');
73 : 		print "<td> $row[$_] </td>\n";
74 : 	}
75 : 	print "</tr>\n";
76 : }
77 : 
78 : print "</table></div>\n";
79 : 
80 : print HtmlBot();
실행결과
삽입결과
설명
1~14
앞에서 작성한 CGI와 거의 똑같다. 다만 데이터를 삽입, 삭제, 수정하기위해서는 데이터베이스의 이름과 테이블의 이름을 알고 있어야 하므로 이 값을 CGI 프로그램내에서 할당하는 차이만 있다.

16~37
사용자의 입력을 반복적으로 수행하는 문장이다. 이 순환문을 통해 5번의 SQL(insert)문이 수행된다. 23행은 Not Null 속성이 부여된 필드가 Null인 경우 순환문을 다시 시작하도록 next문을 사용하고 있다. 25~28행은 $insert라는 변수에 SQL문을 할당하는 문장이다. 실제 질의가 수행되는 것은 아니며 단지 SQL문만 할당하고 있다. query 메소드에 직접입력해도 되지만 가독성을 위해 따로 분리한 것이다. 32행에서 실제 질의가 수행되며, 오류가 발생할 경우 33~36행이 수행된다.

39~41
$query라는 변수에 SQL문을 할당하는 문장이다. 일반적으로 INSERT, UPDATE, DELETE와 같은 SQL문은 Row 데이터를 리턴하지 않으므로 실제 데이터가 제대로 삽입됐는지 확인하기위한 검색 질의문이다.

45~80
검색 CGI와 완전히 동일하다. 39~41에서 할당한 SQL문을 mSQL DB 엔진에 전송하고 그 결과를 HTML 표로 변환하는 부분이다.


다음글: 제 13강 - msqlperl - 수정, 삭제 (5310)1996-05-13
이전글: 제 11강 - msqlperl - 검색 (5390)1996-05-11

세상사는 이야기

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


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