5. Perl

5.1. 펄 사용하기 위한 apache, mysql 설정

  1. 아파치 설정

    펄이 설치 되어 있나 한번 봅니다.

    # which perl

    아파치 설정디렉토리 (/www/conf/httpd.conf)의 다음 내용이 없으면 추가를 합니다.
    AddHandler cgi-script .cgi 
    
    ScriptAlias /cgi-bin/ "/www/cgi-bin/" 
         
    AllowOverride None 
    Options None 
    Order allow,deny 
    Allow from all 
            

  2. 1) 펄 모듈 설치

    Perl `DBD'/`DBI' client code 는 최신 안정 버전을 사용한다.

    Perl 관련프로그램 두가지(세가지)를 다운로드한다.

    http://www.cpan.org/modules/01modules.index.html

    Msql-Mysql-modules-1.2204.tar.gz

    DBI-1.13.tar.gz

    Data-Dump-0.03.tar.gz

    ('Data-Dumper'), 'DBI', 'Msql-Mysql-modules' 을 순서대로 설치한다.

    2) 우선 압축된 패키지를 푼다.
    shell> tar xzvf DBI-VERSION.tar.gz 
    shell> tar xzvf Msql-Mysql-modules-VERSION.tar.gz 
           

    3) 생성된 디렉토리로 이동
    shell> cd DBI-VERSION 
           

    4. 컴파일 하고 설치
    shell> perl Makefile.PL 
    shell> make 
    shell> make test( 참고) 
    shell> make install 
           

    5) 테스트

    참고로 make test. 모든 모듈을 검증하기 때문이다.

    6) 나머지지 두개 패키지 설치

    나머지 'Msql-Mysql-modules'를 위와 같은 방법으로 설치한다.

  3. 테스트

    1) /www/cgi-bin/datedisp.cgi 이 화일을 vi 로 편집한다.
     
    #! /usr/bin/perl 
    print "Content-type: text/html"; 
    
    $date = `date`; 
         
    print ("Today is $date"); 
           

    2) 권한을 바꾸어 준다.
    chmod 755 datedisp.cgi 
           

    3) /www/cgi-bin 디렉토리에서 실행을 해본다.
     
    ./datedisp.cgi 
    or 
    perl datedisp.cgi 
           

    4) 브라우저에서 다음을 실행합니다.
     
    http://localhost/cgi-bin/datedisp.cgi
            

5.2. 디렉토리, 화일 만들기

디렉토리, 화일 만들기
#!/usr/bin/perl 

use Mysql; 

$dbh = Mysql->connect("","dbname","user","password"); 

print "Content-type: text/html"; 

mkdir('aaa/bbb' , 0777) or die print "디렉토리를 만들수 없습니다. 이미 만들어 졌습니다.<br>"; 
print "오게이 오게이"; 

&printf_file("aaa/bbb/test.htm"); 

exit; 

sub print_file{ 
my ($filename) = @_; 
      
$imsi; 
$top="<div align=left><table border=0 cellpadding=5><tr><td valign=top><p align=left><font face=굴림 size=2>";

$bottom="</font></td></tr></table></div>"; 
          
$parse{content} =~ s//<br>/g; 
                 
$imsi = $top; 
$imsi.= "안녕하세요. >(///)< 드세요."; 
$imsi.= $bottom; 
          
open(fh,">$filename"); 
print fh $imsi; 

close(fh); 
}
  

5.3. 시간 출력및 테이블 내용 출력

  1. Mysql 내용
    mysql> select * from test; 
    +------+--------+------+-------------+ 
    | id | name | age | tel | 
    +------+--------+------+-------------+ 
    | 1 | 김용일 | 29 | 02-825-xxxx | 
    +------+--------+------+-------------+ 
    1 row in set (0.03 sec) 
          

  2. 소스
    #!/usr/bin/perl 
    
    print "Content-type:text/html"; #웹에서 html을 볼수 있게 해준다. 
    
    useMysql; #mysql을 사용한다. 
    
    $dbh=Mysql->connect("","kbc","",""); #db와 펄을 연결한다. 
    
    #시간 값을 얻어 낸다. 
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); 
    
    #출력할 폼을 작성한다. 
    $date = sprintf("%d-%d-%d",$year += 1900, $mon+1, $mday); 
    
    print $date, " "; #출력을 한다. 
    
    #print '$curdate()'; #간단히 시간을 나타내는 방법 
    
    $query_string = "select * from test"; # 질의를 변수에 저장한다. 
    $sth=$dbh->query($query_string); #변수를 실행한다. 
    
    print $sth->fetchrow_array, " "; # 출력을 해준다.
           

5.4. 이름을 입력받아 mysql에 저장하고 출력하기

  1. Sql 을 작성한다.
     create table test ( 
       no int default '0' not null auto_increment, 
       name char(10), 
       regdate date, 
       PRIMARY KEY(no) 
     ); 
           

  2. name_input.htm 을 작성한다.
    <form name="form" method="get" action="/cgi-bin/write_db.cgi">
    <inputtype="text" name="name" size="10"> 
    <input type="submit" name="ok" value="보내기"> 
    </form>
           

  3. cgi 화일을 작성한다.
    #!/usr/bin/perl #이문서는 펄문서 임을 나타내준다. 
    
    %parse = &parse_input; # form, input을 가능하도록 정의를 한다. 
    
    print "Content-type:text/html"; # html을 사용가능하도록 한다. 
    
    print "입력 되었습니다. <br>"; 
    
    use Mysql; #Mysql 을 정의 해준다. 
    
    $dbh=Mysql->connect("","kedu","root",""); #Mysql을 펄에서 사용가능하도록 연결 시켜준다. connect("", "DB이름", "사용자", "비밀번호")
    
    $query_string = "insert into test values('','$parse{name}',curdate())"; # 이름과 시간을 변수에 저장한다. 
    
    $sth=$dbh->query($query_string); # 실행한다. 
    
    $query_string = "select * from test"; # 테이블 내용을 변수에 저장한다. 
    $sth=$dbh->query($query_string); # 실행을 한다. 
    
    while($row = $sth->fetchrow_arrayref) 
    { # 테이블의 마직막 레코드 까지 
      print "$row->[0] $row->[1] $row->[2]<br>"; # 테이블 내용을 출력 한다. 
    } 
    
    exit; # 분 문서(펄)의 끝임을 나타내 준다. 이하 함수를 정의 한다. 
    # 밑의 함수는 충분한 학습후 수정하고, 초보자는 그냥 그런가 보다 생각하고 넘어간다. 
    
    sub parse_input 
    { 
      my ($buffer,@parse,%parse,$key,$value); 
    
      if($ENV{'REQUEST_METHOD'} eq "GET")
      { 
        @parse = split(/&/,$ENV{'QUERY_STRING'}); 
      } 
      else { 
        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); 
        @parse = split(/&/,$buffer); 
      } 
      foreach (@parse) 
      { 
        $_=~ tr/+/ /; 
        $_ =~ s/%([dA-Fa-f][dA-Fa-f])/pack("C",hex($1))/eg; 
        ($key,$value) = split(/=/,$_); 
        $parse{$key} = $value; 
      } 
      return %parse; 
    } 
           

5.5. 입력 받는 부분을 체크 하기

  1. Sql 작성 ( mysql DBNAME < test.tbl )
    create table test ( 
      no int default '0' not null auto_increment, 
      id char(10), 
      name char(10), 
      pw char(8), 
      regdate date, 
      regtime time, 
      PRIMARY KEY(no) 
    ); 
           

  2. check_input.htm 작성
    <html> 
    <body> 
    
    <table> 
    
      <form name="form" method="post" action=/cgi-bin/access_db.cgi> 
      <tr>
        <td>아이디 </td> 
        <td><input name=id size=10> <br></td>
      </tr> 
      <tr>
        <td>이 름 </td> 
        <td><input name=name size=10> <br></td></tr> 
      <tr> 
        <td>비밀번호</td> 
        <td><input name=pw size=10 type=password> <br></td></tr> 
      <tr> 
        <td>비밀번호확인</td> 
        <td><input name=pw2 size=10 type=password> </td></tr></table> 
    
      <input type="submit" value="보내기"> 
      </form> 
    
    </table> 
    </body> 
    </html> 
           

  3. access_db.cgi 작성(작성후 755 access_db.cgi 를 실행해서 실행모드로 바꾼다.)
    #!/usr/bin/perl 
    
    %parse = &parse_input; 
    
    use Mysql; 
    
    $dbh = Mysql->connect("","kedu","root",""); 
    
    print "Content-type:text/html"; 
    
    if($parse{id} eq ""){ 
      print "아이디를 입력하지 않았습니다.<br>"; 
      print "아이디를 입력 해주세요.<br>"; 
    } 
    elsif($parse{name} eq "" ){ 
      print "이름을 입력하지 않았습니다.<br>"; 
      print "이름을 입력 해주세요.<br>"; 
    } 
    elsif($parse{pw} eq "" ){ 
      print "비밀번호를 입력하지 않았습니다.<br>"; 
      print "비밀번호를 입력 해주세요.<br>"; 
    } 
    elsif($parse{pw2} eq "" ){ 
      print "비밀번호확인을 입력하지 않았습니다.<br>"; 
      print "비밀번호확인을입력 해주세요.<br>"; 
    } 
    elsif(($parse{id} =~ /^d/) || ($parse{name} =~ /^d/)) { 
      print "첫번째 글짜가 숫자로 되어 있습니다.<br>"; 
      print "첫번째글짜를 문자로 바꾸어 주세요.<br>"; 
    } 
    elsif(&registered_id($parse{id})) { 
      print "이미 있는 아이디 입니다.<br>"; 
      print "다른 아이디를 입력 해주세요.<br>"; 
    } 
    elsif($parse{pw} ne $parse{pw2}) { 
      print "비밀번호가 같지 않습니다. <br>"; 
      print "비밀번호를 다시 입력 해주세요. <br>"; 
    } 
    else { 
      print$parse{id}, "가 입력 되었습니다.<br>"; 
      $query_string = "insert into test values('','$parse{id}','$parse{name}','$parse{pw}', curdate(), curtime())"; 
      my $sth=$dbh->query($query_string); 
    } 
    
    $query_string = "select * from test"; 
    
    $sth=$dbh->query($query_string); 
    
    while($row = $sth->fetchrow_arrayref)
    { 
      print "$row->[0] $row->[1] $row->[2] $row->[3] $row->[4] $row->[5]<br>"; 
    } 
    
    exit; 
    
    sub registered_id 
    { 
      my ($id) = @_; 
      my ($query_string) = "select id from test where id = '$id'"; 
      my ($sth) = $dbh->query($query_string); 
      if($sth -> numrows eq "1") 
      { 
        return 1; 
      } 
      else 
      { 
        return 0; 
      } 
    } 
    
    sub parse_input 
    { 
      my ($buffer,@parse,%parse,$key,$value); 
      if($ENV{'REQUEST_METHOD'} eq "GET")
      { 
        @parse = split(/&/,$ENV{'QUERY_STRING'}); 
      } 
      else 
      { 
        read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); 
        @parse = split(/&/,$buffer); 
      } 
      foreach (@parse) 
      { 
        $_ =~ tr/+/ /; 
        $_ =~ s/%([dA-Fa-f][dA-Fa-f])/pack("C",hex($1))/eg; 
        ($key,$value) = split(/=/,$_); 
        $parse{$key} = $value; 
      } 
      return %parse; 
    }