390 likes | 403 Views
CGI and Form(2). Seree Chinodom seree@buu.ac.th. โปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของ CGI. ให้ % ENV เป็นตัวแปร hash ที่เก็บตัวแปรของสภาพแวดล้อมทั้งหมด ถ้าต้องการพิมพ์ค่า URL ของเว็บเพจที่เรียกโดย CGI จะใช้คำสั่ง print ”Caller= $ENV{‘HTTP_REFERER’}<br>” ;. โปรแกรม env .cgi.
E N D
CGI and Form(2) Seree Chinodom seree@buu.ac.th
โปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของCGIโปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของCGI • ให้ %ENV เป็นตัวแปร hash ที่เก็บตัวแปรของสภาพแวดล้อมทั้งหมด • ถ้าต้องการพิมพ์ค่าURL ของเว็บเพจที่เรียกโดย CGI จะใช้คำสั่ง print ”Caller= $ENV{‘HTTP_REFERER’}\n” ;
โปรแกรม env.cgi #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print "<html><head><title>Print Environment</title></head>"; print "<body>"; foreach $key (keys(%ENV)) { print "$key = $ENV{$key}<br>\n"; } print "</body></html>";
โปรแกรม env.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; print <<EndOfHTML; <html><head><title>Print Environment</title></head> <body> EndOfHTML ; foreach $key (sort(keys %ENV)) { print "$key = $ENV{$key}<br>\n"; } print "</body></html>";
การส่งค่าที่มีหลายค่าการส่งค่าที่มีหลายค่า <form action="env.cgi" method="GET"> First Name: <input type="text" name="fname" size=30><p> Last Name: <input type="text" name="lname" size=30><p> </form> เมื่อเรียกใช้สคริป env.cgiจะได้ดังนี้ $ENV{'QUERY_STRING'} = fname=joe+bob&lname=smith แต่ละค่าจะแยกด้วยเครื่องหมาย & เราสามารถแยกข้อมูลโดยใช้ฟังก์ชัน split ดังนี้ @values = split(/\&/,$ENV{'QUERY_STRING'}); foreach $i (@values) { ($varname, $mydata) = split(/=/,$i); print "$varname = $mydata\n"; }
การค้นหาและแทนที่ • $mystring =~ s/pattern/replacement/; พิจารณาส่วนคำสั่งต่อไปนี้ $greetings = "Hello. My name is xnamex.\n"; $greetings =~ s/xnamex/Seree/; print $greetings; ผลลัพธ์คือ Hello. My name is Seree
Translate Command • $mystring =~ tr/searchlist/replacementlist/; • ตัวอย่าง $lowerc =~ tr/[A-Z]/[a-z]/; เป็นคำสั่งเปลี่ยนค่าตัวอักขระใน $lowerc เป็นตัวเล็ก • ตัวอย่าง $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; คำสั่งแรกเปลี่ยนเปลี่ยนเครื่องหมาย + เป็นช่องว่าง คำสั่งที่2แทนที %HHที่พบเป็นรหัส ASCII โดยใช้ ฟังก์ชัน pack()
split function • Split ใช้แยกสตริงโดยอักขระที่ระบุและจะให้ผลเป็นลิตส์ของสตริง $mystring = "red&blue&green"; @myary = split(/&/,$mystring); จะได้ว่า @myary มีค่า ("red","blue","green").
โปรแกรม post.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } print "<html><head><title>Form Output</title></head><body>"; print "<h2>Resultsfrom FORM post</h2>\n"; foreach $key (keys(%FORM)) { print "$key = $FORM{$key}<br>"; } print "</body></html>";
โปรแกรม post.html <html><head><title>Post.html</title></head> <body> <form action="post.cgi" method="POST"> <pre> Your Name: <input type="text" name="name"> Email Address: <input type="text" name="email"> Age: <input type="text" name="age"> Favorite Color: <input type="text" name="favorite_color"> </pre> <input type="submit" value="Send"> <input type="reset" value="Clear Form"> </form> </body> </html>
Form to mail CGI • การส่ง mail โดยการใช้ form ตอบรับ • ใช้โปรแกรม sendmail เป็นตัวดำเนินการ • โปรแกรม sendmail จะเก็บอยู่ใน /usr/sbin/sendmail • ถ้าไม่แน่ใจให้ตรวจสอบด้วยคำสั่ง which sendmail • การระบุ email address ใน script จะต้องใช้เครื่องหมาย \@ แทน @ • เช่น “seree@buu.ac.th” จะเขียนแทนด้วย “seree\@buu.ac.th”
โปรแกรม mail.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } $mailprog = '/usr/sbin/sendmail'; # change this to your own email address $recipient = ’seree@buu.ac.th';
# this opens an output stream and pipes it directly to the sendmail # program. If sendmail can't be found, abort nicely by calling the # dienice subroutine (see below) open (MAIL, "|$mailprog -t") or &dienice("Can't access $mailprog!\n"); # here we're printing out the header info for the mail message. You must # specify who it's to, or it won't be delivered: print MAIL "To: $recipient\n"; # Reply-to can be set to the email address of the sender, assuming you # have actually defined a field in your form called 'email'. print MAIL "Reply-to: $FORM{'email'} ($FORM{'name'})\n"; # print out a subject line so you know it's from your form cgi. # The two \n\n's end the header section of the message. Anything # you print after this point will be part of the body of the mail.
print MAIL "Subject: Form Data\n\n"; # here you're just printing out all the variables and values, just like # before in the previous script, only the output is to the mail message # rather than the followup HTML page. foreach $key (keys(%FORM)) { print MAIL "$key = $FORM{$key}\n"; } # when you finish writing to the mail message, be sure to close the # input stream so it actually gets mailed. close(MAIL); # now print something to the HTML page, usually thanking the person # for filling out the form, and giving them a link back to your homepage print <<EndHTML; <h2>Thank You</h2> Thank you for writing. Your mail has been delivered.<p> Return to our <a href="index.html">home page</a>. </body></html> EndHTML ;
sub dienice { ($errmsg) = @_; print "<h2>Error</h2>\n"; print "$errmsg<p>\n"; print "</body></html>\n"; exit; }
โปรแกรม mail.html <html><head><title>Mail.html</title></head> <body> <form action="mail.cgi" method="POST"> <pre> Your Name: <input type="text" name="name"> Email Address: <input type="text" name="email"> Age: <input type="text" name="age"> Favorite Color: <input type="text" name="favorite_color"> </pre> <input type="submit" value="Send"> <input type="reset" value="Clear Form"> </form> </body> </html>
หมายเหตุ • ถ้าต้องการส่ง mail ถึงผู้รับหลายคนจะต้องแก้ไขที่ตัวแปร $recipients ดังนี้ • $recipient = ’seree@buu.ac.th, jiraj@bucc.ac.th, webmaster@k12.compsci.buu.ac.th';
การผ่านข้อมูลที่ได้จากฟอร์มเก็บในตัวแปรการผ่านข้อมูลที่ได้จากฟอร์มเก็บในตัวแปร • เพื่อให้การจัดการข้อมูลที่ได้จากฟอร์มสะดวกขึ้น เราควรจะเก็บข้อมูลจากฟอร์มไว้ในตัวแปร แบบ Associative arrayเราสามารถใช้โปรแกรมย่อยต่อไปนี้ช่วยได้ sub readform { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @inputpairs = split(/&/,$buffer); foreach $inputpair (@inputpairs) { ($name,$value) = split(/=/,$inputpair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value =~ s/~!/~!/g; $FORM{$name}=$value; } }
ตัวอย่าง:form2.cgi • ตัวอย่างต่อไปนี้แสดงตัวอย่างการใช้โปรแกรมย่อยข้างต้น #!/usr/bin/perl print "Content-type:text/html\n\n"; &readform; print "name is $FORM{'name'}<p>"; print "dept is $FORM{'dept'}<p>";
sub readform { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @inputpairs = split(/&/,$buffer); foreach $inputpair (@inputpairs) { ($name,$value) = split(/=/,$inputpair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value =~ s/~!/~!/g; $FORM{$name}=$value; } }
โปรแกรม form2cgi.html • เรียกใช้ form2.cgi มีรายละเอียดคือ <HTML> <HEAD><TITLE>Form woth CGI</TITLE></HEAD> <BODY> <form method=POST action="form2.cgi"> Name : <input type=text name="name"> Dept : <input type=text name="dept"> <input type=submit><input type=reset> </form></BODY> </HTML>
ผลลัพธ์ • ผลที่ได้จากการกรอกฟอร์มโดยป้อนข้อมูลเป็นดังนี้ Name : Dept : ผลที่ได้จากการกรอกฟอร์มและ submit เมื่อป้อนข้อมูลแล้วเป็นดังนี้ name is Seree Chinodom dept is Computer Science Seree Chinodom Computer Science Submit Query Reset
การดักจับข้อผิดพลาด if ($FORM{'name'} eq "") { print "<h2>Error!</h2>\n"; print "Please fill out the field for your name.<p>"; die; }
การใช้ Checkbox (colors.html) เราสามารถใช้ Checkbox ในฟอร์มเพื่อ ประมวลผลได้ดังนี้ <html><head><title>colors</title></head> <body> <form action="colors.cgi" method="POST"> <h3>What are your favorite colors?</h3> <input type="checkbox" name="red" value=1> Red<br> <input type="checkbox" name="green" value=1> Green<br> <input type="checkbox" name="blue" value=1> Blue<br> <input type="checkbox" name="gold" value=1> Gold<br> <input type="submit"> </form> </body> </html>
โปรแกรม colors.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; }
โปรแกรม colors.cgi(ต่อ) print "<html><head><title>Results</title></head>\n"; print "<body>\n"; print "<h2>Results</h2>\n"; @colors = ("red","green","blue","gold"); foreach $x (@colors) { if ($FORM{$x} == 1) { print "You picked $x.\n"; } } print "</body></html>\n";
Radio Buttons • Radio buttons แกต่างจาก checkbox คือจะเลือกได้รายการเดียวเท่านั้น ดังนั้นชื่อตัวแปรที่ใช้เก็บค่าจะมีเพียงตัวเดียว • คำสั่งของ HTML ที่ใช้สร้างปุ่ม radio คือ <input type="radio" name="color" value="red"> Red<br> <input type="radio" name="color" value="green"> Green<br> <input type="radio" name="color" value="blue"> Blue<br> <input type="radio" name="color" value="gold"> Gold<br> • ค่าของ Radio buttons ที่ต้องการแสดงเขียนเป็นคำสั่งใน Perl คือ print "Your favorite color is: $FORM{'color'}<br>\n";
โปรแกรม color2.html <html> <head> <title>colors</title> </head> <body> <form action="colors2.cgi" method="POST"> <h3>What is your favorite color?</h3> <input type="radio" name="color" value="red"> Red<br> <input type="radio" name="color" value="green"> Green<br> <input type="radio" name="color" value="blue"> Blue<br> <input type="radio" name="color" value="gold"> Gold<br> <input type="submit"> </form> </body> </html>
โปรแกรม color2.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } print "<html><head><title>Results</title></head>\n"; print "<body>\n"; print "<h2>Results</h2>\n"; print "Your favorite color is: $FORM{'color'}<br>\n"; print "</body></html>\n";
ปรับปรุงให้ดีขึ้น ส่วนของโปรแกรมcgi ในภาษา Perl ที่ใช้ดำเนินการคือ %colors = ("red” => "ff0000", "green" => "00ff00", "blue" => "0000ff", "gold" => "ffcc00"); print "<html><head><title>Colors</title></head>\n"; print "<body bgcolor=$colors{$FORM{'color'}}>\n"; print "<h2>Your favorite color is: $FORM{'color'}</h2><br>\n"; print "</body></html>";
โปรแกรม color2a.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; }
โปรแกรม color2a.cgi(ต่อ) %colors = ("red" => "ff0000", "green" => "00ff00", "blue" => "0000ff", "gold" => "ffcc00"); print "<html><head><title>Colors</title></head>\n"; print "<body bgcolor=$colors{$FORM{'color'}}>\n"; print "<h2>Your favorite color is: $FORM{'color'}</h2><br>\n"; print "</body></html>"; print "</body></html>\n";
การใช้ Select เลือกฟิลด์ • เราสามารถใช้คำสั่ง select เลือกฟิลด์จากแบบฟอร์มได้ โดยใช้คำสั่ง HTML ดังนี้ <select name="color"> <option value="red"> Red <option value="green"> Green <option value="blue"> Blue <option value="gold"> Gold </select> และพิมพ์ผลลัพธ์จากการเลือกจากฟอร์มด้วยคำสั่ง print "Your favorite color is: $FORM{'color'}<br>\n";
Survey Form และ CGI สร้าง HTML form บันทึกเก็บชื่อ survey.html ดังนี้ <html><head><title>Survey</title></head> <body> <h2>Survey</h2> <form action="survey.cgi" method="POST"> Enter your name: <input type="text" name="name" size=30><p> Your email address: <input type="text" name="email" size=30<p> How did you reach this site? <select name="howreach"> <option value=0 selected>Choose one... <option value=1>Typed the URL directly <option value=2>Site is bookmarked <option value=3>A search engine <option value=4>A link from another site <option value=5>From a book <option value=6>Other </select><p>
How would you rate the content of this site?<br> Poor <input type="radio" name="rating" value=1> 1 <input type="radio" name="rating" value=2> 2 <input type="radio" name="rating" value=3> 3 <input type="radio" name="rating" value=4> 4 <input type="radio" name="rating" value=5> 5 Excellent<p> Are you involved in any of the following? (check all that apply):<br> <input type="checkbox" name="des" value=1> Website Design<br> <input type="checkbox" name="svr" value=1> Web Server Administration<br> <input type="checkbox" name="com" value=1> Electronic Commerc<br> <input type="checkbox" name="mkt" value=1> Web Marketing/Advertising<br> <input type="checkbox" name="edu" value=1> Web-related Education<br> <p> Any other comments?<br> <textarea name="comments" rows=5 cols=70 wrap="VIRTUAL"> </textarea> <p> <input type="submit"> </form> </body></html>
โปรแกรม survey.cgi #!/usr/bin/perl print "Content-type:text/html\n\n"; read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; }
# Since the "how you reached this site" list was saved as a number, # we need a hash to translate it back to english: %howreach = ( 0 => "", 1 => "Typed the URL directly", 2 => "Site is bookmarked", 3 => "A search engine", 4 => "A link from another site", 5 => "From a book", 6 => "Other" ); print <<EndHTML; <html><head><title>Results</title></head> <body> <h2>Results</h2> Here's what you entered:<p> Your name: $FORM{'name'}<p> Email: $FORM{'email'}<p>
How you reached this site: $howreach{$FORM{'howreach'}}<p> How you'd rate this site (1=poor,5=excellent): $FORM{'rating'}<p> EndHTML ; %boxes = ("des" => "Website Design", "svr" => "Web Server Administration", "com" => "Electronic Commerce", "mkt" => "Web Marketing/Advertising", "edu" => "Web-related Education" ); print "You're also involved in the following:<br>\n"; foreach $key (keys %boxes) { if ($FORM{$key} == 1) { print "$boxes{$key}<br>\n"; } } print <<EndFoot; <p> Your comments:<br> $FORM{'comments'} <p> </body></html> EndFoot ;