본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 21. Perlprog - GuestBook 3

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

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

Perlprog - GuestBook 3

Description

방명록 만들기 3 - 입력내용 출력


GuestBook 만들기 3

 폼을 만들고, 입력을 누르면 자료가 전송되고, 전송된 자료를 다시 분리해서 파일에 저장까지 하였습니다.

 이젠 그걸 부르는 일만 남았어요. 근데 자료가 1,2개라면 그냥 보여주면 되지만, 수십개가 된다면 그냥 보여주긴 그렇죠. 저는 이 방법으로 다른거와 조금 다르게, 그냥 편하게 하였 습니다. 물론 여러분들이 직접 더 나은 프로그램을 만들어서 쓰시면 되구여....

 처음엔 10개의 자료를 출력하고, 다음 버튼을 누르면 그 다음 10개의 자료를 출력하지만, 이전 버튼을 누르면 자바스크립트의 history()객체를 사용해서 이전걸 그냥 보여 주도록 프로그램 하였습니다. 물론 쉽긴 하지만.... 이렇게 안하고 프로그램이 직접 제어 하는게 더 낫죠...

guest_view.cgi - 데이터 출력

 그럼 guest_view.cgi라는 파일을 만들고 시작합니다.

#! /usr/bin/perl

 이건 물론 다 아실거고....

$filepos = $ENV{'QUERY_STRING'};

 이건 처음 10개의 파일을 출력하고, 다음 버튼을 눌렀을 때 그 다음 10개 자료의 처음 부분을 알리는 위치를 환경변수로 받아서 $filepos에 저장합니다.

 여기서 환경변수로 "이름=값"으로 넘겨 받는게 정석이지만 저는 편하게 그냥 "값"만 넘겨 받았습니다.

if ($filepos == ' ')
{
	$filepos = 0;
}
					

 만약 사용자가 방명록 폼에 입력을 하고, 저장 버튼을 눌렀을때를 생각해 보죠. 지난 프로그램을 생각해 보시면 print "Location: guest_view.cgi\n\n";라는 걸 아시죠. 이 때 넘어오는 변수는 없습니다. 즉 맨 처음 10개의 자료를 보여 주기 위한거죠. 이렇게 변수의 값이 없다면 $filepos값을 0으로 합니다.

print "Content-type: text/html\n\n";

헤더를 보내고...

출력(Print)

 여기서 부터 출력부분입니다.

 여기를 어떻게 하느냐에 따라서 저처럼 멋없는 페이지가 나오기도 하고, 어디처럼 멋있는 페이지가 나오기도 합니다.

print "
<html>
	<body bgcolor=white>
		<p><font size=2 color=#376ed><b>흔적을 남기신 분들께 감사드립니다.</b></font></p>\n";
					

 이거 다 아시죠? print문을 이용해서 출력을 합니다.

open (FILE, "guestbook.txt");

 화일을 엽니다. 읽기전용으로...

seek(FILE, $filepos, 0);

 바로 이부분이 파일의 위치를 이동합니다. seek() 함수는 파일의 위치를 찾아주죠. 위의 예는 FILE의 처음부터(0), $filepos 만큼 이동을 하라는 얘깁니다. '0'이면 처음부터, '1'이면 현재위치부터, '2'이면 파일의 끝부터 라는 얘기가 됩니다.

 위에서 입력을 하고 저장을 하면, 처음에는 $filepos가 0의 값을 가지니깐, 파일의 처음부분터 읽게 됩니다. 10개의 데이터를 읽고 나면 그 위치의 파일 포인터를 다음 단추를 누를때 변수로 다시 넘겨지게 되는 거죠. 그건 밑의 tell()함수로 하게 됩니다.

$i = 1;

 10개의 데이터만을 추려내기 위한 카운터 변수 $i를 1로 초기화 합니다.

while(<FILE>)
{
	($username, $body, $date) = split (/::/, $_);
	# 파일 연산자<>를 이용해서 한줄한줄을 ::로 분리해서 각각의 변수에 저장을 시킵니다.
	
	print "
	<table width=550 border=0>
		<tr>
			<td width=70 align=center valign=top bgcolor=#d2eefe>
				<font size=2 color=#376eda>
					날 짜 <br>
					성 명 <br>
					내 용 
				</font>
			</td>
			<!-- 여기까지는 일반 html양식입니다. -->
			<td width=480 align=left valign=top bgcolor=#d2eefe>
				<font size=2 color=#376eda>
					$date<br>
					$username<br>
					<b>$body</b>
					<!-- 이곳에 이렇게 변수명을 넣어주면 위에서 분리, 저장되었던 변수가 출력되게 되죠. print문 어느곳에서나 지정 할수 있죠.-->
				</font>
			</td>
		</tr>
	</table>
	<br>
	\n";
	
	# 출력이 끝나는 곳입니다.
	$i++;
	
	# 한 개의 데이터를 출력하면 카운터를 하나 증가 시켜야죠.
	last if $i == 10;
	
	# 그리고 $i가 10이되면 이 while루프를 빠져 나가게 됩니다.
	# 이 얘기는 10개의 데이터가 출력이 되면 더 이상 하지 않게 되는 겁니다.
}

$filepos_1 = tell(FILE);
        
# 바로 이곳이 tell()함수를 사용해서 파일에서 읽혀지고 난 파일 
# 포인터의 위치를 변수 $filepos_1에 저장합니다.
					

페이지 나눔(Page)

 이제 남은 일은 데이터가 더 남아있는지를 확인해서 다음 단추가 눌려지지 않게, 이전 단추가 눌려 지지 않게 하는 일입니다.

 우선 처음의 10개의 데이터를 보여줄 땐 이전 단추가 눌려지면 안되겠죠. $filepos의 값이 0일 때가 바로 그 때 입니다.

 <a href=./guest_view.cgi?filepos_1>이라고 되어있는 부분이, 10개의 데이터를 읽고 난 다음의 파일 포인터의 위치를 넘겨주는 라인입니다. CGI에 변수를 넘길때는 '?'를 사용합니다.

 위의 코드를 생각해 보면, 그 다음 파일 포인터가 넘어가고, seek() 함수를 사용해서 그 만큼 이동한 다음에(읽은 10개의 데이터 다음), 그 곳에서 다시 10개를 출력하고, 다시 tell() 함수를 사용하게 되고, 그것을 다시...... 이렇게 되는 겁니다.

if ($filepos == 0)
{
	print "<table width=550 border=0>\n";
	print "<tr><td>\n";
	print "<a href=../guest/guest.html target=top><img src=../images/write.gif border=0></a>";
	print "&nbsp<img src=../images/b_up.gif border=0 alt=\"목록의 처음입니다\">";
	print "<a href=./guest_view.cgi?$filepos_1><img src=../images/b_down.gif border=0></a>";
	print "</td></tr>";
	print "</table>\n";
}
					

 그 다음 파일에 데이타가 남아 있는지 확인을 해야죠. if(<FILE>) 이 조건으로 확인할 수 있습니다. 파일이 널 값을 가지면 거짓이 됩니다. 그렇지 않으면 다음 버튼을 누를 수 있게, 그렇지 않으면 누르지 못하게 합니다. 하지만 두 경우 모두 이전 버튼은 누를 수 있죠. <a href=javascript:history.go(-1)>을 사용하였습니다.(이 부분을 직접 프로그램 해 보세여)

else
{
	if (<FILE>)
	{
		print "<table width=550 border=0>\n";
		print "<tr><td>\n";
		print "<a href=../guest/guest.html target=top><img src=../images/write.gif border=0></a>";
		print "&nbsp<a href=javascript:history.go(-1)><img src=../images/b_up.gif border=0></a>";
		print "<a href=./guest_view.cgi?$filepos_1><img src=../images/b_down.gif border=0></a>";
		print "</td></tr>";
		print "</table>\n";
	}
	else
	{
		print "<table width=550 border=0>\n";
		print "<tr><td>\n";
		print "<a href=../guest/guest.html target=top><img src=../images/write.gif border=0></a>";
		print "&nbsp<a href=javascript:history.go(-1)><img src=../images/b_up.gif border=0></a>";
		print "<img src=../images/b_down.gif border=0 alt=\"목록의 마지막입니다\">";
		print "</td></tr>";
		print "</table>\n";
	}
}

close (FILE);

print "</body></html>\n";
					

 파일을 닫고 html을 닫음으로 해서 끝이 났습니다.

NOTES

 여기까지 오시느라 고생하셨습니다. 다음엔 게시판을 만들겠습니다.

 게시판은 방명록 보다는 복잡하져... 그럼 천천히, 차근차근 나가겠습니다.


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