본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 20. Perlprog - GuestBook 2

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Perlprog - GuestBook 2

Description

방명록 만들기 2 - 입력사항 추가, 저장


GuestBook 만들기 2

폼에서 입력받은 내용외에 날짜를 추가로 입력, 폼에서 넘어오는 데이터의 판별

Date 얻기

 지난 번에는 폼에서 name과 body를 받아서 ::사용해 각각의 데이터를 파일에 저장하는 내용까지 보았습니다.

 이것만 넣으면 썰렁하니깐....(^^;) 여기에 날짜를 추가해 보도록 하겠습니다.

$fields{'body'} =~ s/\n\n/ /g;
$fields{'body'} =~ s/\n/ /g;

다음 라인에

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);

를 추가 합니다.

 이 localtime() 함수는 시스템의 시간을 9개의 인자(초, 분, 시간, .....)로 반환하는 함수입니다. 이 9개의 변수중 원하는 걸 쓰시면 됩니다. 전 여기서 월과 일, 시간과 분을 쓰겠습니다.

 그 다음...

if(length ($min) == 1) {$min = '0'.$min;}

 만약 분 단위가 1자리수 라면, 앞에 0을 붙여서 저장합니다. length()함수는 문자열의 길이를 반환하여 줍니다. 그리고 펄을 C와 다르게 if문 다음에 한줄의 명령행이 오더라도 {}로 감싸주어야 합니다.

 그 다음....

$mon = $mon + 1;

 월을 표시하는 변수에 1을 더하여 줍니다. 이유는 $mon의 값은 0-11의 값을 가지기 때문입니다. 그냥 표시하면 1이 모자라기 때문에 1을 더해서 표시하는 겁니다.

 그리고 $date라는 변수에 출력에 알맞게 해서 년, 월, 일, 시, 분을 저장합니다. 이건 여러분들 입맛에 맞게 하세여.

예로

$date = ``$year/$mon/$mday.....'';
$date = "$year년 $mon월 $mday일 $hour시 $min분";

Data 판별

 이제 사용자가 이름이나 내용을 넣었는지, 우리가 분리자로 사용하는 ::를 입력하지나 않았는지 검사를 해야져.....

if (!$fields{'username'})
{
	print "Content-type: text/html\n\n";
	print "<html><body bgcolor=white>";
	print "<font size=2><b>이름을 입력하셔야 합니다.</b></font><p>";
	print "<font size=2><b>다시 한번 확인하여 주십시요.</b></font>";
	print "</body></html>";
}
# 위의 내용은 이름을 입력했는지 확인하는 절차 입니다. 안했으면 .....를 출력하게 됩니다.
# 같은 방식으로 모두를 검사합니다. if~elsif~else를 사용합니다.
elsif (!$fields{'body'})
{
	print "Content-type: text/html\n\n";
	print "<html><body bgcolor=white>";
	print "<font size=2><b>내용을 입력하셔야 합니다.</b></font><p>";
	print "<font size=2><b>다시 한번 확인하여 주십시요.</b></font>";
	print "</body></html>";
}
elsif ($fields{'username'} =~ /::/)
{
	print "Content-type: text/html\n\n";
	print "<html><body bgcolor=white>";
	print "<font size=2><b>이름에 사용할수 없는 문자 <font color=red><b>::</b></font>를 사용하셨습니다.</b></font><p>";
	print "<font size=2><b>다시 한번 확인하여 주십시요.</b></font>";
	print "</body></html>";
}
elsif ($fields{'body'} =~ /::/)
{
	print "Content-type: text/html\n\n";
	print "<html><body bgcolor=white>";
	print "<font size=2><b>본문에 사용할수 없는 문자 <font color=red><b>::</b></font>를 사용하셨습니다.</b></font><p>";
	print "<font size=2><b>다시 한번 확인하여 주십시요.</b></font>";
	print "</body></html>";
}
					

저장(Save)

 위와 같이 조건문을 사용해서 입력 내용을 확인 하였습니다. 위의 내용이 다 맞으면 저장을 해야져..

 하지만 저번과는 다릅니다. 저번엔 그냥 있던 파일에 덧붙여서 썼었지여.... 하지만 그렇게 하면 최근의 파일이 가장뒤에 나열되게 됩니다. 최근에 것이 가장 위에 올라와야 보기가 좋아여....

 다음과 같이 합니다.

else
{
	open (FILE, "guestbook.txt") || open (FILE, ">guestbook.txt");
	@dbfile = <FILE>;
	close (FILE);

	# 파일을 읽기 전용으로 열어서(없으면 새로 하나 만듭니다. 맨 처음 입력하는 사람을 위해서...)
	# 모든 내용을 @dbfile에 저장합니다. "< >"도 펄의 연산자중 하나인데, 파일의 한 라인을 읽어들입니다.
	# 한 라인씩 읽어서 배열에 차곡차곡 넣습니다. 
	
	open (FILE, ">guestbook.txt");
	print FILE "$fields{'username'}::$fields{'body'}::",$date,"\n";
	foreach (@dbfile)
	{
		print FILE $_;
	}
	close (FILE);

	# 그리고 파일을 다시 열어서(덮어쓰기용으로 엽니다), 새로 입력한 내용을 저장합니다.
	# 그리고 나서 @dbfile에 저장된 내용을 다시 한줄씩 차례로 저장을 합니다. 
	
	print "Location: guest_view.cgi\n\n";
	
	# 모두 저장하고 나서 guest_view.cgi 파일을 브라우저에 표시합니다.
	# location은 위치를 표시하죠. 브라우져에 어느 위치의 파일을 표시하는 겁니다. 저장을 했으니깐... 이뿌게 출력을 해서 사용자에게 보여야 겠죠... 
}
					

NOTES

이것으로 이번 얘기는 끝을 맺겠습니다. 다음엔 guest_view.cgi파일을 작성해서 저장된 내용을 출력해 보도록 하겠습니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo