5-2 CGI �Ѽƪ��ǻ��P���

¤W¸`¤¶²Ð¤F CGI ªº°ò¥»¥\¯à»P­ì²z¡A¥»¸`±N¤¶²Ð CGI ¦p¦ó¥Ñ¨Ï¥ÎªÌ¨ú±oªí³æ¸ê°T¡C

§Ú­Ì¥ý¥H¤@­Ó²³æªº½d¨Ò (widget0.htm) ¨Ó»¡©ú¡G

Example¡]widget0.htm¡^¡G

¦¹½d¨Ò¥]§t¤F¤@­Ó«Ü²³æªºªí³æ¡A¨ä­ì©l½X¦p¤U¡G

­ì©lÀÉ¡]widget0.htm¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
<TITLE>A Simple Form for CGI Programming</TITLE>
</head>

<body background="/jang/graphics/background/paper.jpg">
<h2 align=center>A Simple Form for CGI Programming</h2>
<hr>

<form method=get action="getCgiParam.pl">
<ul>
<li>¤j¦W¡G<input name="your_name" value="Roger Jordan & ¤j¶¯">
<li>©Ê§O¡G<input type="radio" name="gender" value="male">¨k
	<input type="radio" name="gender" value="female">¤k
	<input type="radio" name="gender" value="unknown" checked>¤£½T©w
</ul>
<input type="submit">
<input type="reset">
</form>
<hr>
<body>
</html>

¥Ñ¤W­z­ì©l½X¥i¬Ý¥X¡Aªí³æ¸ê°T¶Ç°eªº¤èªk¬O get¡]³o¤]¬Oªí³æªº method ©Ê½èªº¹w³]­È¡^¡A·í¨Ï¥ÎªÌ«ö¤U¡u°e¥X¬d¸ß¡v®É¡Aªí³æ¸ê®Æ§Y¥Ñ¦øªA¾¹ºÝªº getCgiParam.pl ¨Ó³B²z¡A¦^¶Çµ²ªG¦p¤U¡G

¥Ñ¤W­z¦^¶Çªººô­¶¡A¥i¬Ý¥Xºô§}¬O¡ugetCgiParam.pl?your_name=Roger+Jang&gender=unknown¡v¡A¥Nªíªí³æªº¬ÛÃö¸ê°T¬Oªþ¥[¦b³B²zµ{¦¡«á­±¡A¦A¤@°_°e¨ì¦øªA¾¹¡A³o´N¬O·í method µ¥©ó get ®Éªº§@ªk¡C¦øªA¾¹¦¬¨ì³o¤@¦ê¸ê°T«á¡A·|±N¤§Àx¦s¦b¦WºÙ¬° QUERY_STRING ªºÀô¹ÒÅܼơAµM«á¦A°e¥æ¥~³¡µ{¦¡¡]¦b¦¹¬° getCgiParam.pl¡^¶i¦æ³B²z¡CgetCgiParam.pl ªº­ì©l½X¦p¤U¡G

­ì©lÀÉ¡]getCgiParam.pl¡^¡G¡]¦Ç¦â°Ï°ì«ö¨â¤U§Y¥i«þ¨©¡^
if ($ENV{"QUERY_STRING"} ne "") {
	$paramStr = $ENV{"QUERY_STRING"};			# method=get
	$method = "get";
} else {
	read(STDIN, $paramStr, $ENV{'CONTENT_LENGTH'});	# method=post
	$method = "post";
}

%FORM = &parseForm($paramStr);

print "Content-type: text/html\n\n";
@allkeys = sort keys %FORM;

print "<html><head><title>Form Elements</title><meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=big5\"></head>\n";
print "<body>\n";
print "<h2 align=center>CGI ¦p¦ó¶Ç»¼¤Î©â¨ú°Ñ¼Æ¡]method=get¡^</h2>\n";
print "<hr>\n";
print "<h3>°Ñ¼Æ¶Ç»¼ªº¤èªk¡G</h3>";
print "<blockquote><font color=green>$method</font></blockquote>\n";
print "<h3>CGI ¦¬¨ìªº¦r¦ê¡G</h3>";
print "<blockquote><font color=green>$paramStr</font></blockquote>\n";
print "<h3>©â¨ú¥X¨Óªº¸ê°T¡G</h3>";
print "<blockquote>\n";
for $key (@allkeys) {
	print "\$FORM(\"$key\") = <font color=green>$FORM{$key}</font><br>\n";
}
print "</blockquote></body></html>\n";

# Split the name-value pairs of a CGI parameter string
sub parseForm {
	my($parameter_string) = @_;
	my(%FORM);
	@pairs = split(/&/, $parameter_string);			# ®Ú¾Ú "&" ±N name-value pairs ©î¸Ñ¶}¨Ó
	foreach $pair (@pairs) {				# ¹ï¨C¤@­Ó name-value pair ¶i¦æ³B²z
		($name, $value) = split(/=/, $pair);			# §ì¥X name ©M value
		$value =~ tr/+/ /;				# ±N "+" ¥N´«¦¨ªÅ¥Õ
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;	# ±N %-encoding ¸Ñ¦^­ì¥ýªº¤å¦r
		$FORM{$name} .= "#" if defined($FORM{$name});	# ­Y¦³­«½ÆªºÄæ¦ì¡A¥H "#" ³sµ²
		$FORM{$name} .= $value;			# ±Nµ²ªGÀx¦s¦b FORM ÅܼÆ
	}
	return(%FORM);
}

¦b¤W­z­ì©l½X¤¤¡A§Ú­Ì¥[¤F³\¦hµù¸Ñ¡A¥HÅý¦P¾ÇÁA¸Ñ Perl ¦p¦ó©î¸Ñ°e¶i¨Óªº¦r¦ê¡C

¨Æ¹ê¤W¡A¤W­zªºµ{¦¡½X¥i¦P®É¥Î©ó method=get ©M method=post ¨âºØ±¡ªp¡C¤U­±³o­Ó½d¨Ò¡]widget.htm¡^¡A´N¬O¥Î¦P¼Ëªº CGI µ{¦¡¨Ó²q¸Ñ¥Ñ method=post ©Ò°e¶i¨Óªº¦r¦ê¡G

Example¡]widget.htm¡^¡G

¦¹½d¨Ò¥]§t¤F©Ò¦³±`¥Î¨ìªºªí³æ¤¸¯À¡A·í¨Ï¥ÎªÌ«ö¤U¡u°e¥X¬d¸ß¡v®É¡Aªí³æ¸ê®Æ§Y¥Ñ¦øªA¾¹ºÝªº getCgiParam.pl ¨Ó³B²z¡C¥Ñ©ó©Ò¥Î¨ìªº¶Ç°e¤èªk¬O post¡A¦]¦¹ Perl µ{¦¡¥²¶·¸g¥Ñ¼Ð·Ç¿é¤J¨ÓŪ¤J°Ñ¼Æ¦r¦ê¡A¦r¦êªºªø«×«h¥i¥ÑÀô¹ÒÅÜ¼Æ CONTENT_LENGTH ¨ú±o¡C½Ð¦U¦ì¦P¾Ç¦Û¦æ¸Õ¸Õ¬Ý¦¹½d¨Ò¡I

¥H¤U¬O get ©M post ³o¨âºØ°Ñ¼Æ¶Ç°e¤è¦¡ªº¹ï·Óªí¡G

  Method=Get Method=Post
¶Ç°e¤è¦¡ ¸g¥ÑÀô¹ÒÅÜ¼Æ QUERY_STRING ¸g¥Ñ¼Ð·Ç¿é¤J¡]¨äªø«×¥i¥ÑÀô¹ÒÅÜ¼Æ CONTENT_LENGTH ±oª¾¡^
Ū¨ú¤è¦¡ $paramStr = $ENV{"QUERY_STRING"}; read(STDIN, $paramStr, $ENV{'CONTENT_LENGTH'});
ÀuÂI ¼u©Ê¸û¤j ¦r¦êªø«×­­¨î¸û¼eÃP
¯ÊÂI ¦r¦êªø«×­­¨î¸ûÄY­V ¼u©Ê¸û¤p¡]¦³®É¤]ºâ¬OÀuÂI¡^


Perl