58 - Formdan gelen bilgilerde arama-bulma-deitirme Perlde...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Formdan gelen bilgilerde arama-bulma-deitirme Perlde arama-bulma-deitirme ilemlerini gzden geirmeyi de tamamladktan sonra, bir Formdan gelen veriyi istediimiz biimde kullanlr hale getirmek iin hereyi renmi olduk. imdi forn_analiz.pli an ve form_islem.pl adyla kaydedin; ve programn ba tarafndaki u deyimlere bakn: ................ @girdiler = split(/&/, $ENV{'QUERY_STRING'}); ................ @girdi = split(/&/, $depo); ................ ($anahtar, $deger) = split (/=/, $girdi); $anahtar =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~s/<!--(.|\n)*-->//g; ................ Bu program yazdmzda iinde anlamadmz eyler bulunduunu belirtmitik; imdi anlalmayan bir taraf kalmam olsa gerek. Browsern yumak yapp yollad Form bilgilerini iine yazdmz $depo adl deikenin deerini & iaretinden blmlere ayrdmz, ortaya kan btn paralar, @girdi dizisinin elemanlar haline getirdiimi ve sonra bu dizinin her bir satrn bu kez eittir iaretinden blp, ortaya kan Stringleri bu kez %formveri adl Balantl Dizi (Hash) deikenin anahtar/veri iftleri olarak kaydettiimi gryorsunuz. imdi bu ilemin arasnda, hem anahtar ad olacak Stringde, hem de deer olacak Stringde nce + iaretlerini bolukla deitirdiimizi; sonra biraz karka bir deyimle, s/// ilemi yaptrdmz gryorsunuz: =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Aslnda bu s/// ileminin arama blmn biliyoruz: deeri a-f veya A-F ve 0-9 arasnda olan iki basamakl ve % ile balayan hereyi bul. Fakat bulunan eyin yerine konacak deer yabanc. Perln paket denilen haric aralar dosyalar (externel utilities files) vardr. Bu paketler (modller) Perl ile birlikte kurulur ve Perl programlarnz altran Perl Program tarafndan tannr. Burada gnderme yaptmz C paketi 16 tabanl say sistemiyle yazlm kodlarn ASCII, ANSI ve Unicode karlklarn verir. Yukardaki rnekte yer alan son s/// ilemi Web Form verisi yoluyla sitenize zararl program kodu yollamak isteyebileceklere kar alnm bir nlemdir. Ktniyetli kii HTTP Servera zararl programlar <!--- ve - iaretleri arasnda yollamak zorundadr. Bu ilemle bu tr girdileri tmyle yok ediyoruz. Bu rnekte grdnz tr/// ve s/// ilemlerini ieren deyimler, neredeyse btn dnyada standart olarak kullanlr. Form ileme programnda da bu blm aynen brakacaz. Yapacamz ilk deiiklik, ekrana gnderdiimiz deiiklikleri bu kez bir dosyaya gndermek olaca iin Perl programna gemeden nce bu dosya ile ilgili hazrlklar yapalm. Bu dosyada, ziyaretilerimizden gelen btn Form bilgileri belirli bir biimde yazlmas gerekir, ki sonra bu dosyay Web Sitemize evsahiplii yapan bilgiyardan kendi bilgisayarmza ekerek, inceleyebilelim, ziyaretilerimiz hakknda fikir edinelim. Bu dosyadaki bilgilerin, Formdaki Input alanlarn stun olarak dnerek kaydedilmesi uygun olur. Bunun iin nce iine Form bilgilerinin eklenecei dzyaz dosyasn oluturabiliriz, birinci satr olarak stun balklarn yazabiliriz. rnein yle: Ad Adres Kod Merak e-posta mesaj eitim Burada stun balklarndan sonraki ok iaretleri kelimelerin arasna sekme (Tab) koyduumuzu gsteriyor. Form bilgilerimizi de deiken deerlerinin arasna sekme koyarak yazacaz. imdi bu dosyay form_bilgileri.txt adyla kaydedin. sterseniz bu dosyay daha sonra dzyaz programyla deil bir veritaban program ile aabilirsiniz; sekme ile ayrlan metinler stun haline dntrlr. (Bu altrmay birlikte yapyorsak, eitim kelimesinden sonra Enter tuuna basarak yeni satr (newline) kodu girmeyi unutmayn!) Eer hala yapmadysanz, imdi form_analiz.pl dosyasn dz yaz programnzda an ve form_islem.pl adyla kaydedin. Bu programn yapt iki i var: (1) Formdan gelen bilgileri %formveri deikenine, Input alan adlar anahtar, ziyaretinin bu alana yazdklar deer olarak ekilde yerletirmek; sonra bir dizi print() fonksiyonu ile bunlar ekranda grntlemek. Yukarda grmtk ki, ekrana yazdrmak ile dosyaya yazdrmak arasnda sadece bir dosya tutama fark vard. Hatrlarsak, dosya tutama (handle) dediimiz ey, dosyay atmz srada verdiimiz keyf bir kelimeden ibaretti. Demek ki nce Perle, biraz nce oluturduumuz ve Web sitemizde form_isleme.pl programnn bulunduu dizine gnderdiimiz dosyay ek yaplmak zere aalm. (imdilik bu dosyay kiisel Web Serverda Perl program dosyalarnzn durduu dizine kopyalamakla yetineceiz; fakat gerek CGI ynetimi ile ilgili bilgileri ve bu dosyay FTP ile HTTP Serverna gndermeyi bundan sonraki blmde ele alacaz.) open (EKLE, >>form_bilgileri.txt); Bu deyimle, biraz nce oluturduumuz ve tek satrlk stun balklarmz eklediimiz metin dosyasn ek yapmak amacyla ayoruz; ve bu dosyaya EKLE tutaman (Handle) veriyoruz. imdi artk, Formdan gelen bilgileri (%formveri deikenindeki deerleri) bu dosyaya kaydedebiliriz. Fakat bu noktada dikkatinizi bir duruma ekmek istiyorum. Elimizi altrmak amacyla yazdmz iin bu form_analiz.pl programnda ziyaretiden gelen verileri ieriklerine ok dikkat etmeden, tmyle iledik ve ve hereyi ekrana gnderdik. Bu arada Form etiketinin otomatik olarak gnderdii Gonder dmesinin (aslnda dmenin zerine yazlan metinden baka bir ey olmayan) deeri de %formveri deikeninde Gonder anahtarna Gnder deeriylle kaydedildi. Acaba, hi bir iimize yaramayacak bu bilgi dosyaya kaydettirmemek mmkn mdr? Tabi. u anda ekrana yazma iini yapan print() fonksiyonunun nasl ilediini hatrlayalm: foreach $anahtar (sort keys(%formveri)) { print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri girildi."; } %formveri deikeninin her bir anahtar iin, ekrana anahtar ad ile alanna kelimesini, anahtarn deerini ve deeri girildi kelimelerini yazdryoruz. Yazdrdmz anahtarn Gonder deerine eit olmas halinde bu yazma ilemini yaptrmayabiliriz. Veya, tersini: foreach $anahtar (sort keys(%formveri)) { if ($anahtar ne Gonder) { print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri girildi."; } } Perl, print() fonksiyonunu ancak ve sadece elindeki anahtarn Gonder olmamas (ne, Stringler iin eit deilse anlamna gelir) halinde icra edecektir. (Ayn amac baka yntemlerle de salayabiliriz. Gnder dmesinin oluturduu deeri %formveri deikenine yazdrmamay baarabilir misiniz?) Peki, Gnder dmesinin deerini yazdrmamay baardk; fakat oluturmak istediimiz form bilgileri dosyasnda anahtar adlarna ihtiyacmz var m? Anahtarlar stun bal olarak dosyaya yazdk; imdi artk ziyaretilerin verdii bilgileri ilerken anahtarlar dei sadece deerleri, aralarna sekme (Tab) iareti koyarak yazdrabiliriz. Bunu mevcut kodda uygulayalm: foreach $anahtar (sort keys(%formveri)) { if ($anahtar ne Gonder) { print EKLE "$formveri{$anahtar}\t"; } } print EKLE "\n"; Burada EKLE tutama ile tannan ak dosyaya (form_bilgileri.txt) sadece %formveri ilikili deikeninde srasyla btn anahtarlarn deerlerini, bir sekme (Tab) iaretiyle yazdryoruz. Bir ziyaretinin form bilgilerinin ilenmesi bittiinde, yani bu ziyaretiye ait son veri de yazdrldktan sonra, satrn sonuna yenisatr (newline) iaretini yazdryoruz, ku bylece bir bayka ziyareti iin bu dosyaya ek yaplrken, yeni bilgiler yeni bir satrdan balayabilsin. Bylece ziyaretiden aldmz bilgileri ilediimiz dosya ile iimiz tamamlanm oluyor; atmz dosyay kapatabiliriz: close (EKLE); Bu arada, ziyaretimize bir teekkr mesaj vermeyi unutmalaym. Bunu, ziyaretinin bilgisayarna HTML kodlaryla mesajmz yazdrarak yapabiliriz. Teekkr blmyle birlikte form_isleme.pl u ekli alm oluyor: #!/usr/local/bin/perl #form_islem.pl if ($ENV{'REQUEST_METHOD'} eq 'GET') { @girdiler = split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read (STDIN, $depo, $ENV{'CONTENT_LENGTH'}); @girdi = split(/&/, $depo); } else { print "Content-type: text/html\n\n"; print "<P>Formda bir hata var!"; } foreach $girdi (@girdiler) { ($anahtar, $deger) = split (/=/, $girdi); $anahtar =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~s/<!--(.|\n)*-->//g; if ($formveri{$anahtar}) { $formveri{$anahtar} .= ", $deger"; } else { $formveri{$anahtar} = $deger; } } #dosya ekleme blm open (EKLE, >>form_bilgileri.txt); foreach $anahtar (sort keys(%formveri)) { if ($anahtar ne Gonder) { print EKLE "$formveri{$anahtar}\t"; } } print EKLE "\n"; close(EKLE); #teekkr blm print "Content-type: text/html\n\n"; print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n"; print "<H3><CENTER>Teekkrler</CENTER></H3>\n"; print "<P>Sayn $formveri{Adi}\n"; print "<BR>$formveri{Adres} $formveri{Kod}\n"; print "<P>Sitemizi ziyaret ettiiniz ve formumuzu doldurduunuz iin size teekkr ederiz!\n"; print "<BR>Size $formveri{Merak} alannda daha iyi hizmet etmek iin aba gstereceiz.\n"; print "<BR>Adynyzy ve<B> $formveri{eposta} </B>eklindeki elektronik adresinizi tanesi 250 bine kimseye satmayacamza sz veriyoruz.\n"; print "<P>Ana sayfamza geri dnmek iin buray <A HREF=\"index.htm\">tklaynz</A>.\n"; te bu kadar! Ziyaretinizden sitenizdeki bir Forma yazd ve size gnderdii bilgileri bir dosyaya eklettirmeyi baarm bulunuyorsunuz. Bu dosyadaki bilgilerle ziyaretilerinizi daha yakndan tanmak, sitenizi braklan mesajlar dorultusunda zenginletirmek, ve sitende yaptnz gncelletirmeleri derlediiniz elektronik posta adreslerine dzenli ekilde bildirmek size kalm bulunuyor. Fakat bir durum var: Ziyareti zene-bezene formu doldurdu; Perl byk bir beceriyle, bu bilgileri dosyaya ekledi. Bizim Site sahibi olarak bu durumdan haberimiz olmas gerekmiyor mu? Veya baka bir deyile Perl programmzn bu durumu bir elektronik mesajla bize bildiresini istiyoruz. Bunun iin btn yapacamz i, form_islem.pl programnda teekkr blmnden nce, bir e-posta yollama blm koymaktan ibaret. HTTP Server, CGIdan ald talep zerine, kendi bulunduu bilgisayardaki programlar altrabilir. Bu programlar arasnda elektronik mesaj gnderme program olan sendmail vardr. Web Server programlarnn elektronik mesaj gnderme programlar farkl olabilir; sizin site ynetmeni olarak kullanabileceiniz elektronik posta gnderme programnn adn ve adresini, Web Server ynetimi verebilir. cretsiz Web sitesi hizmeti veren irketler genellikle CGI program altrmaya ve elektronik mesaj gndermeye izin vermezler. Eer Web sitenize evsahiplii yapan firma CGI ve elektronik posta gnderme destei veriyorsa muhtemelen bunun iin gerekli FORM/ACTION bilgisini de size verecektir. Bu tr bilgiler genellikle evsahibi firmann ska sorulan sorular belgelerinde de bulunabilir. Unix tabanl Serverlarda hemen hemen daima elektronik mektup gnderme ilemi sendmail program ile yaplr ve bu program /usr/sbin/ veya /usr/lib/ dizininde bulunur. CGI programmzla HTTP Servera bir program altrmas iin komut gndermekle, bir dosyay yazmak-okumak-eklemek iin atrtmak arasnda fark yoktur; bu ilemi de open() fonksiyonu ile yaparz. rnein: open(MEKTUP, "|/usr/sbin/sendmail -t $kime") || die ("sendmail programn bulamyorum"); Burada dikkat edeceiniz nokta, open() fonksiyonunu dosya atrmada kullandmzdan farkl olarak programn yolu ve adndan nce pipe (|) simgesini kullanm olmamzdr. Bu Unix sistemlerinde HTTP Servern baka bir program ardmz anlamasn salar. Yukardaki rnek kodda, #teekkr blm satrnn stne u kodlar girin: ($kime deikeninin karsna isim yerine e-posta adnz ve adres.com yerine de elektronik posta adresinizi yazmanz gerekir. rnek olarak, bu kodu ben yazyor olsa idim, bu satr yle yazmam gerekirdi: $kime = "hocal\@pcworld.com.tr ";) # e-posta yollama blm $kime = "isim\@adres.com"; open(MEKTUP, "|/usr/sbin/sendmail -t $kime") || die ("sendmail programn bulamyorum"); print MEKTUP "Kimden: $formveri{'eposta'}\n"; print MEKTUP "Kime: $kime\n"; print MEKTUP "Konu: Ziyareti Formu\n\n"; print MEKTUP "Ad: $formveri{'adi'}\n"; print MEKTUP "E-Posta: $formveri{'eposta'}\n"; print MEKTUP "lgi alan: $formveri{'Merak'}\n"; print MEKTUP "Eitim Dzeyi: $formveri{'egitim'}\n"; print MEKTUP "Mesaj: $formveri{'mesaj'}\n"; close(MEKTUP); Bu ekibi yaptktan sonra CGI programnz nce size bir ziyaretinin daha sitenizdeki Formu doldurduunu bildirecek, daha sonra ziyaretiye teekkr edecektir. Burada yerimiz olmad iin ayarntl olarak inceleyemediimiz bir dier konuk defteri-mesaj gnderme Formu rneini bu kitapn malzemesini ieren Zip dos eposta.htm ve eposta.pl adyla bulabilirsiniz. zellikle bir Formun doru ve eksiksiz doldurulup doldurulmadn denetleyen blmleri bakmndan bu Perl program rnek olabilir. Bylece, CGI amacyla iimize yarayacak lde Perle balang yapm olduk. Bu bizi Perl uzman yapmyor. Ama artk hi olmazsa, HTML Formlarmz iin gerekli CGI programn yazabiliriz. CGI konusunda buraya kadar deinmediimiz fakat bir Web tasarmcsnn bilmesi gereken noktalar son blmde bulabilirsiniz. ...
View Full Document

This note was uploaded on 02/23/2012 for the course CS CS281 taught by Professor Özgürulusoy during the Winter '12 term at Bilkent University.

Ask a homework question - tutors are online