ana sayfa : araştırma : uzaktan web tasarımı : form girişinin işlenmesi [ 5 / 5 ] 

GERİ

FORM GİRİŞİNİN İŞLENMESİ

Geri besleme formu için HTML kodları tamamlandı, şimdi kullanıcının gözatıcı yoluyla gönderdiği veriyi alacak feedback.pl adındaki CGI programcığı yaratılmalıdır. Feedback.pl programcığı web sunucudan bilgiyi alır almaz hemen kodunun çözer. Sonra bu bilgiyi alır ve bir e-mail içine koyar. En sonundada okuyucuyu ana sayfaya götürür.

 

Liste 8 - Geri Besleme Formunun HTML Kodları

 

<HTML>

<HEAD>

<TITLE>Feedback Form</TITLE>

</HEAD>

<BODY>

<H1>Feedback</H1>

<FORM METHOD=POST ACTION="/cgi-bin/feedback.pl">

<B>Name</B><BR><INPUT NAME="name" SIZE=42>

<P><B>E-mail Address</B><BR><INPUT NAME="email" SIZE=42>

<P><B>Comments</B><BR><TEXTAREA NAME="comments" ROWS=10

COLS=38></TEXTAREA>

<P><INPUT TYPE="submit" VALUE="Send"></FORM>

</BODY>

</HTML>


 

Şekil 5 - Geri Besleme Formu

 

Giriş Kodunun Çözülmesi

 

Hatırlanacağı gibi kullanıcı girişli CGI programına gönderilen veri URL olarak kodlanmıştır. Bu yüzden programın yapacağı ilk iş bu verinin kodunu çözmektir. Bu veri alınır ve User_Data olarak isimlendirilen bir procedure’e yerleştirilir. Perl’de bir altprogram tam olarak bir fonksiyondur ve başına ampersand (&) konarak çağrılabilir. Bu &User_Data şeklinde ifade edilebilir. Perl dilinde genellikle alt program tanımlamaları dosyanın en sonunda yapılır. Bu durumda feedback.pl dosyası User_Data alt programının bir çağrısını ve tanımlamasını içerebilir. Aşağıdaki liste feedback.pl dosyasının nasıl olacağını gösterir.

 

Liste 9 - Feedback.pl Dosyasının İlk Bölümü

 

 

#!/usr/local/bin/perl

 

# Decode the user data and place it in the

# data_received associative array.

%data_received = &User_Data();

 

sub User_Data {

  local (%user_data, $user_string, $name_value_pair,

         @name_value_pairs, $name, $value);

 

  # If the data was sent via POST, then it is available

  # from standard input. Otherwise, the data is in the

  # QUERY_STRING environment variable.

  if ($ENV{'REQUEST_METHOD'} eq "POST") {

    read(STDIN,$user_string,$ENV{'CONTENT_LENGTH'});

  } else {

    $user_string = $ENV{'QUERY_STRING'};

  }

 

  # This line changes the + signs to spaces.

  $user_string =~ s/\+/ /g;

 

  # This line places each name/value pair as a separate

  # element in the name_value_pairs array.

  @name_value_pairs = split(/&/, $user_string);

 

  # This code loops over each element in the name_value_pairs

  # array, splits it on the = sign, and places the value

  # into the user_data associative array with the name as the

  # key.

  foreach $name_value_pair (@name_value_pairs) {

    ($name, $value) = split(/=/, $name_value_pair);

 

    # These two lines decode the values from any URL

    # hexadecimal encoding. The first section searches for a

    # hexadecimal number and the second part converts the

    # hex number to decimal and returns the character

    # equivalent.

    $name =~

      s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;

    $value =~

       s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;

 

    # If the name/value pair has already been given a value,

    # as in the case of multiple items being selected, then

    # separate the items with a " : ".

    if (defined($user_data{$name})) {

      $user_data{$name} .= " : " . $value;

    } else {

      $user_data{$name} = $value;

    }

  }

  return %user_data;

}

 

 

Girişin E-Mail Olarak Yollanması

 

Kullanıcı girişinin şifresi çözüldükten sonra veri onunla çalışmaya hazır hale gelmiştir. Bu örneği amacına ulaştırmak için e-mail yoluyla bilgiyi yollayan bir CGI programcığına ihtiyacımız olacak. Bu iş e-mail mesajlarını yollayabilmemiz için bir tane SMTP mail sunucusu gerektirir. (SMTP Simple Mail Transfer Protocol anlamına gelir.)

Windows ya da UNIX kullanmanıza göre SMTP mail sunucusu arayüzü çeşitlenebilir. Buna göre birisi Wındows’ta diğeri de UNIX’te e-mail yollayabilen iki tane alt program yaratalım. Bu alt programların her ikisi de e-mail olarak yollanacak mesajı içeren tek argümana sahip olacaklardır. Çünkü hangi altprogramı kullandığımıza bakmadan aynı string’i e-mail olarak yollayacağız.

foreach $key (sort keys(%data_received)) {

  $mail .= "$key:\n";

  foreach (split(" : ", $data_received{$key})) {

    $mail .= "$_\n\n";

  }

}

Bu kod iki tane döngü içerir. Dışta olanı her dizi elmanının üzerinde döner.

Hatırlanacağı gibi ilişkili diziler anahtarlar olarak bilinen elemanlarına göre indekslenirler. Böylece tüm dizi üzerinde dönerek tüm anahtarlar üzerinde de dönmek zorunda kalırsınız. Bunu Perl’ün keys() fonksiyonunu kullanarak yaparsınız. Bu fonksiyon parantezler arasındaki ilişkili dizi argümanları için tüm anahtarları döndürür. Sonra her anahtar $key değişkenine atanır. Dıştaki döngünün içinde $key içindeki değer “\n” ile beraber $mail değişkenine aktarılır. İçteki döngü ise her dizi elemanının değerinin “ : “ olup olmadığına bakar.

$mail.=”$_\n\n” satırı isim/değer çifti değerlerini e-mail yoluyla yollanacak stringe yerleştirir.

Eğer Perl bilmiyorsanız bu örnek neler olduğu konusunda sizi aydınlatacak. Geribesleme formu üç tane giriş alanına sahiptir. Bunlar: isim, e-mail ve açıklama metin alanlarıdır. Bu örnek için, isim alanına Robert McDaniel, e-mail alanına robertm@ deltanet.com ve açıklama alanına da Hi There! yazabilirsiniz. Sonra &User_Data() altprogramını çağırırsak %data_received ilişkili dizisi aşağıdaki üç ayrı elemana sahip olur:

 

$data_received{'name'}=Robert McDaniel

$data_received{'email'}=robertm@deltanet.com

$data_received{'comments'}=Hi there

Döngü birkez döndükten sonra $mail stringi aşağıdaki şekli alır:

 

$mail=comments:\nHi there\n\n

Bir kez daha dönünce;

 

$mail=comments:\nHi there\n\nemail:\nrobertm@deltanet.com\n\n

 

Son dönüşte ise;

 

$mail=comments:\nHi

there\n\nemail:\nrobertm@deltanet.com\n\nname:\nRobert McDaniel\n\n

şeklinde olur.

String en sonunda e-mail içine yazıldığında ise;

 

comments:

Hi there

 

email:

robertm@deltanet.com

 

name:

Robert McDaniel

şekline gelir.

 

Unıx Olan Bir Makinada E-Mail Yollama

 

Şimdi e-mail için formatlı bir mesajımız var onu artık e-mail olarak yollayabiliriz. Eğer UNIX üzerinde çalışıyorsanız, SMTP sunucusu olarak sendmail programını kullanacaksınız. Şimdi de Unix’te mail yollayabileceğimiz Perl kodlarını vereli:

 

Bir Wındows Sistemde Mail Yollama

 

Eğer bir Windows sistemiyle çalışıyorsanız SMTP sunucusu için WinSMTP adı verilen bir program kullanmalısınız. WinSMTP WRMail adı verilen bir komut satırı programına sahiptir. Bu program CGI programcığınızdan e-mail yollamaya izin vermektedir. Şimdi de Windows için kullanılan e-mail altprogramını verelim.

 

Liste 10 - Windows E-mail Altprogramı

 

sub Windows_Email {

  local ($message) = @_;

 

  # Create the file name

  $filename = substr(time, 3);

  srand(time||$$);

  $filename .= "." . int(rand(999));

 

  # Create the file

  open(MAILFILE, ">$filename") || die "Content-type:

text/text\n\nCan't open the output file $filename!\n";

  print MAILFILE $message;

  close(MAILFILE);

 

  # E-mail the file

  system("c:\\winsmtp\\wrmail -r -t\"From Your Feedback Form\" -

shttpd\@robertm.com -f$filename robertm\@robertm.com");

 

  # Delete the file

  system("del $filename");

 

}

 

 

Bir Cevap Dödürülmesi

 

Alınan ve işlenen bilgiden sonra CGI programcığı olayın tamamlandığını gösteren bir mesajı gözatıcıya yollar. Feedback.pl örneği için eğer isterseniz kullanıcının gözatıcısına ana sayfanızı yollayabilirsiniz. Çünkü bu sayfa hazır, siz tüm HTML kodlarını ve metnini yollamak yerine sadece sayfanın yerini yollasanız yeterli olmaktadır. Bu işlem şu satırla yapılabilmektedir.

 

print "Location: http://www.robertm.com\n\n";

Şu ana kadar feedback.pl dosyasını parça parça vererek tamamladık. Şimdi bu parçaları da birleştirip dosyanın kodlarını bir defada verelim.

 

Liste 11 - Feedback.pl Programcığı

 

 

#!/usr/local/bin/perl

 

# Decode the user data an place it in the

# data_received associative array.

%data_received = &User_Data();

 

foreach $key (sort keys(%data_received)) {

  $mail .= "$key:\n";

  foreach (split(" : ", $data_received{$key})) {

    $mail .= "$_\n\n";

  }

}

 

# If you want to run this program on a Windows

# machine, comment out the &Unix_Email($mail); line (add a # at

# the beginning) and uncomment the &Windows_Email($mail);

# line. Also remember to remove the first line!

&Unix_Email($mail);

#&Windows_Email($mail);

 

 

sub Unix_Email {

  local ($message) = @_;

 

  open(MAIL, "|/usr/sbin/sendmail -t") || die "Content-type:

  text/text\n\nCan't open /usr/sbin/sendmail!\n";

  print MAIL "To: robertm\@robertm.com\n";

  print MAIL "From: httpd\@robertm.com\n";

  print MAIL "Subject: From you Feedback Form\n";

  print MAIL "$message\n\n";

 

  return close(MAIL);

}

 

sub Windows_Email {

  local ($message) = @_;

 

  # Create the file name

  $filename = substr(time, 3);

  srand(time||$$);

  $filename .= "." . int(rand(999));

 

  # Create the file

  open(MAILFILE, ">$filename") || die "Content-type:

  text/text\n\nCan't open the output file $filename!\n";

  print MAILFILE $message;

  close(MAILFILE);

 

  # E-mail the file

  system("c:\\winsmtp\\wrmail -r -t\"From Your Feedback Form\" -

  shttpd\@robertm.com -f$filename robertm\@robertm.com");

 

  # Delete the file

  system("del $filename");

 

}

 

sub User_Data {

  local (%user_data, $user_string, $name_value_pair,

         @name_value_pairs, $name, $value);

 

  # If the data was sent via POST, then it is available

  # from standard input. Otherwise, the data is in the

  # QUERY_STRING environment variable.

  if ($ENV{'REQUEST_METHOD'} eq "POST") {

    read(STDIN,$user_string,$ENV{'CONTENT_LENGTH'});

  } else {

    $user_string = $ENV{'QUERY_STRING'};

  }

 

  # This line changes the + signs to spaces.

  $user_string =~ s/\+/ /g;

 

  # This line places each name/value pair as a separate

  # element in the name_value_pairs array.

  @name_value_pairs = split(/&/, $user_string);

 

  # This code loops over each element in the name_value_pairs

  # array, splits it on the = sign, and places the value

  # into the user_data associative array with the name as the

  # key.

  foreach $name_value_pair (@name_value_pairs) {

    ($name, $value) = split(/=/, $name_value_pair);

 

    # These two lines decode the values from any UR

    # hexadecimal encoding. The first section searches for a

    # hexadecimal number and the second part converts the

    # hex number to decimal and returns the character

    # equivalent.

    $name =~

      s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;

    $value =~

       s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/ge;

 

    # If the name/value pair has already been given a value,

    # as in the case of multiple items being selected, then

    # separate the items with a " : ".

    if (defined($user_data{$name})) {

      $user_data{$name} .= " : " . $value;

    } else {

      $user_data{$name} = $value;

    }

  }

  return %user_data;

}