본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 36. Perlprog - Bookmark Program

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

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

Perlprog - Bookmark Program

Description

Perl과 DB를 이용한 Bookmark Program 세 번째


새로운 디렉토리 추가(Add Directory)

 이번에는 웹 상에서 디비에 새로운 데이터(새로운 디렉토리)를 넣어 보도록 하겠습니다. 다음에 할 내용과 상당부분이 유사합니다.

선행작업(Start)

프로그램에 들어 가기전에, 기존에 해왔던 소스에서 조금 수정을 해야 하는 부분이 있습니다. 처음에 했던, index.cgi 에서 Html() 함수의

<a href="./add.cgi">북마크 등록</a>

 이런 부분이 있죠? 여기를

<a href="./add_directory.cgi">디렉토리 등록</a>

 이거로 바꿔 주세요.

 이유는... 메인 화면에서는 디렉토리를 추가할수 있게 하고, 이 디렉토리으로 검색된 화면에서 URL을 등록할 수 있게 하려고 합니다. 그리고.. 앞으로 진행하면서, 기존에 했던 소스들을 조금씩 수정해야 하는 일이 있을 겁니다.

 그때 그때마다 조금씩 수정하면서 나가도록 하겠습니다. 또, 추가하고픈 기능들이 있으면 말씀하세요. 같이 만들어 가는게 전 더 좋아요.

시작(add_directory.cgi)

 그럼 add_directory.cgi라는 이름으로 시작합니다.

Main 프로그램

 처음은 늘 같죠. :)

#!/usr/local/bin/perl 
# CGI, DBI 모듈을 사용한다고 알립니다.
use CGI;
use DBI;

# CGI의 새로운 객체를 만들고, http헤더를 찍습니다.
$add_directory = new CGI;
print $add_directory->header;

# 입력되는 디렉토리명을 검사하여, 없으면 등록폼을 보여주고, 있으면 새로이 등록을 합니다.
$directory = $add_directory->param('directory');

if(!$directory)
{
	&HtmlStart;
	&Show_Directory_Form;
	&HtmlEnd;
	
	exit;
}
else
{
	# 공백은 '_' 로 치환합니다. 이유요? 코딩하는 작업을 없애기 위해.... ^^;
	$directory =~ s/ /_/g;
	# 받은 디렉을 인수로해서 Add_Directory() 함수를 호출합니다.
	&Add_Directory($directory);
	
	exit;
}
					

 뭐... 이것으로 메인 프로그램은 끝이 났네요.... 여기서부터 서브 함수들입니다.

디렉명이 없을 때 보여주기(sub 1)

 그럼.... 입력되는 디렉토리 명이 없으면 (<a href="./add_directory.cgi">디렉토리 등록</a> 여기에서 링크를 누르면, 당연히 디렉토리 명은 존재하지 않습니다.) 실행하는 함수들을 먼저 살펴볼게요. 이건 그냥 폼입니다. HtmlStart(), HtmlEnd() 는 우리가 전에 했던 함수들하고 거의 같아요. 같은 함수들이 앞으로도 나올 거에요. 뭐.... 귀찮으시면... 따로 라이브러리를 만드셔서 해도 됩니다.

HtmlStart()

살펴 볼 내용... 없습니다. 그냥 타이틀 출력.

sub HtmlStart
{
	print << Html;
<html>
<head>
<title>Add New Url</title>
</head>

<body>
<center>
<b><font size=3 color=green>My Favorite Site!!!</font></b><p>
<font size=2>
<hr size=2 color=green width=100%>
    Html
}
					

Show_Directory_Form()

 입력 내용은 디렉토리명 하나면 돼요.

sub Show_Directory_Form
{
	print << Show_Html;
<font size=3><b>새로운 Directory 를 등록합니다.</b></font>
<form action=./add_directory.cgi method=post>
<table width=600 border=0>
<tr>
	<td align=right height=30><font size=2 color=blue><b>디렉토리 명 : </b></font></td>
	<td><input type=text maxlength=50 size=20 name=directory><br></td>
</tr>
<tr>
	<td colspan=2 align=center>
		<input type=submit value="등록">     
		<input type=reset value="취소">
	</td>
</tr>
</table>
</form>
    Show_Html
}
					

HtmlEnd()

그냥... 아래 폼 출력.

sub HtmlEnd
{
	print << End;
<hr size=2 color=green width=100%>
<center>
<a href="http://localhost/~bookmark/"><font color=blue>BlackUnicorn's BookMark Site</font></a>
</center>
</font>
</center>
</body>
</html>
    End
    }
					

디렉토리명이 있을때 작동하는 함수들(sub 2)

 위에서 등록폼이 나와서, 우리가 원하는 디렉토리명을 넣었을때 작동하는 함수들에 대해서 알아보도록 하겠습니다. 여기서 이제.. DB와의 작업이 이루어집니다.

Add_Directory

sub Add_Directory
{
	# 디렉토리명을 받고,
	my ($new_dir) = @_;
	
	# DB와 접속을 시도합니다.
	$dbh = DBI->connect('DBI:ODBC:bookmark', 'sa', '') || die print "$DBI::errstr";
	
	# 기존에 등록되어 있는 디렉명인지 확인하기 위해
	# Check_Directory() 함수를 디렉명을 인자로주고 호출합니다.
	# 이 함수의 설명은 아래에....
	
	# 기존에 등록된 디렉명이라면, 메세지 출력후 끝내고, 그렇지 않다면, 적절한 쿼리문을 실행시켜서
	# DB 에 자료를 넣습니다. 성공메세지를 보내고, DB와의 접속을 끝내고, 닫습니다.
	if (&Check_Directory($new_dir))
	{
		&Old_Reg;
	}
	else
	{
		$sth = $dbh->prepare(q {insert into bookmark(type, path, name) values ('f', '/', ?)} ) || die print "$DBI::errstr";
		$sth->execute($new_dir) || die print "$DBI::errstr";
		&Success;
		$sth->finish;
	}
	
	$dbh->disconnect;
}
					

Check_Directory()

 입력된 디렉토리가 존재하는지 확인하는 함수입니다.

sub Check_Directory
{
	my ($ch_dir) = @_;
	my ($Con_dir);
	
	# type 은 'f' , name 은 현재 입력한 값으로 필드를 불러옵니다.
	# 우리가 필요한 필드는 'name' 이니깐, 그것만 불러옵니다.
	my $ch_sth = $dbh->prepare( q{select name from bookmark where type='f' and name=?} ) || die print "$DBI::errstr";
	$ch_sth->execute($ch_dir) || die print "$DBI::errstr";
	
	# 불러온 필드값을 $old_dir에 저장
	my $old_dir = $ch_sth->fetchrow_array;
	
	# $old_dir 이 존재하면, 참(1)을 그렇지 않으면 거짓(0)을 리턴합니다.
	if ($old_dir)
	{
		$Con_dir = 1;
	}
	else
	{
		$Con_dir = 0;
	}
	
	$ch_sth->finish;
	
	return $Con_dir;
}
					

Old_Reg()

 이미 존재하는 디렉토리 명일 경우 출력합니다.

sub Old_Reg
{
	print << Old;
<center>
<font size=2 color=blue>
이미 등록된 Directory 입니다.<br>
다시 등록하여 주십시요.<p>
<a href="javascript:history.go(-1)">Back Page</a>
</font>
</center>
	Old
}
					

Success()

자료가 등록되었을 때 출력합니다.

sub Success
{
	print << Success_Data;
<center>
<font size=2 color=blue>
자료가 등록 되었습니다.<br>
이용해 주셔서 감사합니다.<p>
<a href="http://web.archive.org/web/20001018142757/http://localhost/~bookmark">Main Page</a>
</font>
</center>
	Success_Data
}
					

NOTES

 함수만 몇 개 되고... 내용은 별루 없는거 같애요.... -.-;; 좀 더 빨리 내용을 진행시키지 못해서 죄송하구요. 수정사항이나, 건의 사항이 있으시면 언제든지 멜이나, 게시판에 글 남겨주시기 바랍니다. 다음엔 URL을 등록하는 프로그램의 이야기를 하겠습니다.


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