1 / 39

CGI and Form(2)

CGI and Form(2). Seree Chinodom seree@buu.ac.th. โปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของ CGI. ให้ % ENV เป็นตัวแปร hash ที่เก็บตัวแปรของสภาพแวดล้อมทั้งหมด ถ้าต้องการพิมพ์ค่า URL ของเว็บเพจที่เรียกโดย CGI จะใช้คำสั่ง print ”Caller= $ENV{‘HTTP_REFERER’}<br>” ;. โปรแกรม env .cgi.

colletti
Download Presentation

CGI and Form(2)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CGI and Form(2) Seree Chinodom seree@buu.ac.th

  2. โปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของCGIโปรแกรมสดงการใช้ตัวแปรสภาพแวดล้อมของCGI • ให้ %ENV เป็นตัวแปร hash ที่เก็บตัวแปรของสภาพแวดล้อมทั้งหมด • ถ้าต้องการพิมพ์ค่าURL ของเว็บเพจที่เรียกโดย CGI จะใช้คำสั่ง print ”Caller= $ENV{‘HTTP_REFERER’}\n” ;

  3. โปรแกรม 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>";

  4. โปรแกรม 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>";

  5. การส่งค่าที่มีหลายค่าการส่งค่าที่มีหลายค่า <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"; }

  6. การค้นหาและแทนที่ • $mystring =~ s/pattern/replacement/; พิจารณาส่วนคำสั่งต่อไปนี้ $greetings = "Hello. My name is xnamex.\n"; $greetings =~ s/xnamex/Seree/; print $greetings; ผลลัพธ์คือ Hello. My name is Seree

  7. 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()

  8. split function • Split ใช้แยกสตริงโดยอักขระที่ระบุและจะให้ผลเป็นลิตส์ของสตริง $mystring = "red&blue&green"; @myary = split(/&/,$mystring); จะได้ว่า @myary มีค่า ("red","blue","green").

  9. โปรแกรม 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>";

  10. โปรแกรม 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>

  11. Form to mail CGI • การส่ง mail โดยการใช้ form ตอบรับ • ใช้โปรแกรม sendmail เป็นตัวดำเนินการ • โปรแกรม sendmail จะเก็บอยู่ใน /usr/sbin/sendmail • ถ้าไม่แน่ใจให้ตรวจสอบด้วยคำสั่ง which sendmail • การระบุ email address ใน script จะต้องใช้เครื่องหมาย \@ แทน @ • เช่น “seree@buu.ac.th” จะเขียนแทนด้วย “seree\@buu.ac.th”

  12. โปรแกรม 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';

  13. # 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.

  14. 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 ;

  15. sub dienice {     ($errmsg) = @_;     print "<h2>Error</h2>\n";     print "$errmsg<p>\n";     print "</body></html>\n";     exit; }

  16. โปรแกรม 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>

  17. หมายเหตุ • ถ้าต้องการส่ง mail ถึงผู้รับหลายคนจะต้องแก้ไขที่ตัวแปร $recipients ดังนี้ • $recipient = ’seree@buu.ac.th, jiraj@bucc.ac.th, webmaster@k12.compsci.buu.ac.th';

  18. Advance Form

  19. การผ่านข้อมูลที่ได้จากฟอร์มเก็บในตัวแปรการผ่านข้อมูลที่ได้จากฟอร์มเก็บในตัวแปร • เพื่อให้การจัดการข้อมูลที่ได้จากฟอร์มสะดวกขึ้น เราควรจะเก็บข้อมูลจากฟอร์มไว้ในตัวแปร แบบ 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; } }

  20. ตัวอย่าง: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>";

  21. 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; } }

  22. โปรแกรม 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>

  23. ผลลัพธ์ • ผลที่ได้จากการกรอกฟอร์มโดยป้อนข้อมูลเป็นดังนี้ Name : Dept : ผลที่ได้จากการกรอกฟอร์มและ submit เมื่อป้อนข้อมูลแล้วเป็นดังนี้ name is Seree Chinodom dept is Computer Science Seree Chinodom Computer Science Submit Query Reset

  24. การดักจับข้อผิดพลาด if ($FORM{'name'} eq "") { print "<h2>Error!</h2>\n"; print "Please fill out the field for your name.<p>"; die; }

  25. การใช้ 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>

  26. โปรแกรม 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; }

  27. โปรแกรม 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";

  28. 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";

  29. โปรแกรม 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>

  30. โปรแกรม 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";

  31. ปรับปรุงให้ดีขึ้น ส่วนของโปรแกรม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>";

  32. โปรแกรม 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; }

  33. โปรแกรม 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";

  34. การใช้ 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";

  35. 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>

  36. 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>

  37. โปรแกรม 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; }

  38. # 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>

  39. 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 ;

More Related