![]()
![]()
![]()
CGIの作成方法(HTMLのフォームタグ&PerlのTip)
LastUpdate : 11/09/11
PerlでCGIを作成する時に、メモしたことが書かれています。
☆ もくじ
基本的なコントロールを列挙し、HTMLでの書き方をサンプルとして、載せます(これですべてではありません)。
また、タグの中で、nameとvalueという部分がありますが、この値をCGIで識別子・値として使います。
|
<input type="submit" value="送信。"> <input type="reset" value="リセット。"></form> /formでフォームの終わりを示す。 |
#最後に\n\nと改行を二回行うのは決まり事です。 #文法みたいなもんですw #ヘッダ以外の部分の\nに特に意味はありません。 #HTMLを見たとき、見やすくするための改行です。 print "Content-type: text/html\n\n"; #ヘッダの出力。 print "<html>\n"; print " <header>\n"; print " <title>CGIテスト用のページだよんw</title>"; print " </header>\n\n\n\n"; print "<body>"; print "<p>にゃんにゃんにゃん〜〜〜〜〜〜〜〜</p>"; print "</body>"; print "</html>"; |
フォームから送信されてきたデータは、inputタグやtextareaタグで設定ししたnameという属性の値を識別子に、「 識別子=value 」という形になって送信されてきます。valueとは、そのコントロールに入力された値もしくはタグでvalue属性で指定した値のことです。
コントロールが複数有る場合、たとえば、二つある場合、「 識別子=value&識別子=value 」という形で、「&」を区切りの印とし、データが送信されます。
また、valueの値は場合により、エンコードされて送信されるデータもあります。正規表現で言う「 [^0-9A-Za-z*-.@_] 」にマッチする値は、「 %[0-9A-Fa-f][0-9A-Fa-f] 」という形式の値にエンコードされます。
以下、送信されたデータを$sent_dataにみたてて、その値を、コントロールごとに分割・デコードを行う処理を書いてみます。サンプルの中に出てくる「あ」の文字コードは「0x82a0」です(シフトJIS)
use strict;
#送信されてきたデータ
#name1コントロールは「 abcdef 」という値を持ってる。
#name2コントロールは「 a b c d e f 」という値を持っている。
#name3コントロールは「 あ 」という値を持っている。
my $sent_data = 'name1=abcdef&name2=a+b+c+d+e+f&name3=%82%A0';
#name1=abcdef
#name2=a+b+c+d+e+f
#name3=%82%A0
#と、「 コントロール名前=値 」という形に分ける。
my @res = split(/&/,$sent_data);
#次に「 コントロール名前=値 」という値を
#コントロール名前と値に分割し、連想配列に代入する。
my %data=();
foreach(@res)
{
my $name;
my $value;
( $name,$value )= split(/=/,$_); #文字列を=で分割。
$data{ $name } = $value; #連想配列に代入。
}
#現在の、それぞれの値を表示してみる。
print "Before:\n";
print 'name1 : ',$data{'name1'},"\n";
print 'name2 : ',$data{'name2'},"\n";
print 'name3 : ',$data{'name3'},"\n";
#valueをデコードする。
my @key_arr = keys(%data);
foreach( @key_arr )
{
#スペース文字が+になってるので、それを直す。
$data{$_} =~ tr/+/ /;
#%xxになっているものを直す。
$data{$_} =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg;
}
#それぞれの値を表示してみる。
print "After:\n";
print 'name1 : ',$data{'name1'},"\n";
print 'name2 : ',$data{'name2'},"\n";
print 'name3 : ',$data{'name3'},"\n";
実行結果: Before: name1 : abcdef name2 : a+b+c+d+e+f name3 : %82%A0 After: name1 : abcdef name2 : a b c d e f name3 : あ |
私の使っている環境ではflock関数が使えません。なので、排他制御を擬似的に実現するため、ディレクトリが有るか、無いかで判別しています。
どこの環境でも普通に使える方法のはずです。しかし、flock関数などの、ロック専用の処理ではないので、排他制御処理としては甘い処理だと思います・・・。CGIで使う場合、シビアな処理には向かないと思います。
#実行時、ディレクトリの有る・無しで排他制御が
#できたらいいなぁ、と願う処理。
#flock関数を普通は使ってください。
#しかし、Win32のActivePerlでは使えないらしいです・・・。
#だからこの方式で書いてみます。
use strict;
#作成するディレクトリの名前
my $directory_name = 'lock_directory';
#試行回数
my $try_count = 4;
#使用中だった場合、Sleepしてる時間(秒数)。
my $sleep_time = 3;
while( 1 )
{
if( mkdir($directory_name,0755) | $sleep_time-- <= 0 ){ last; }
print "wait...\n";
sleep($sleep_time);
}
if( $sleep_time <= 0 )
{
#待っても、ディレクトリが作成できない。
#エラーとして処理を行う。
print "error!\n";
exit(0);
}
#なにかの処理の代わりにsleepを読んでいます。
#ここに、処理を記述します。
sleep(15);
print "ok!\n";
#処理が終わったので、ディレクトリを削除する。
rmdir($directory_name);
|
CGIにアクセスすると、Locationで指定されたページに移動します。
サンプルではCGIのファイルからの相対パスで一つ上のディレクトリのindex.htmlファイルに移動させています。
#!D:/tmp/f_program/activeperl/bin/perl print "Location:../index.html\n\n"; |
textareaタグなどから入力された改行文字を、すべて、<br>に変換する処理です。
use strict; my $str1 = "aaaaa\naaaaaa"; my $str2 = "aaaaa\r\naaaaaa"; my $str3 = "aaaaa\raaaaaa"; $str1 =~ s/\x0d\x0a|\x0d|\x0a/<br>/g; $str2 =~ s/\x0d\x0a|\x0d|\x0a/<br>/g; $str3 =~ s/\x0d\x0a|\x0d|\x0a/<br>/g; print "str1:",$str1,"\n\nstr2:",$str2,"\n\nstr3:",$str3; 実行結果: str1:aaaaa<br>aaaaaa str2:aaaaa<br>aaaaaa str3:aaaaa<br>aaaaaa |
エディットボックス二つと、hiddenのデータを一つを送信するフォームから、呼び出されるCGIです。
#!D:/tmp/f_program/activeperl/bin/perl
#受けたデータを、とりあえず、単純にすべて出力
#するためのサンプル。
#文法に制限を持たせる。
use strict;
#このスクリプトのpath
my $myself_name = '/~admin/cgi-bin/test.cgi';
#POSTでデータが送信される場合の最大サイズ
my $post_data_limit = 32*1024;
#送信されたデータを保持するバッファ
my $sent_data = '';
#postかgetかどちらでデータを受け取ったのかを表す文字列。
my $request_method = '';
#エディットボックス(text_box1)にいれる文字列
my $text_box1_str = 'あ';
#エディットボックス(text_box2)にいれる文字列
my $text_box2_str = 'ア';
#入力がPOSTがGETどうか調べ、それに応じた処理をする。
if( $ENV{ 'REQUEST_METHOD' } eq 'POST' )
{
$request_method = 'post';
$sent_data = &SentDataTypePOST();
}
elsif( $ENV{ 'REQUEST_METHOD' } eq 'GET' )
{
$request_method = 'get';
$sent_data = &SentDataTypeGET();
}
else
{
&ProgramExit();
}
&OutputHTMLFromHeaderToBody();
&OutputInputForm();
print "\n\n",'Your sent data : ',$sent_data,"\n\n";
print '<br>';
print "request method : $request_method\n";
&OutPutHTMLFromEndBodyToEndHTML();
&ProgramExit();
#
#HTMLの最初から、bodyまでのHTMLソースコードを出力。
#
sub OutputHTMLFromHeaderToBody
{
print "Content-type: text/html\n\n"; #ヘッダの出力。
print <<HTML_START_TEXT;
<html>
<header>
<title>CGIテスト用のページだよんw</title>
</header>
<body>
HTML_START_TEXT
return 0;
}
#
#/bodyから/htmlまでのHTMLソースコードを出力。
#
sub OutPutHTMLFromEndBodyToEndHTML
{
print <<HTML_END_TEXT;
</body>
</html>
HTML_END_TEXT
return 0;
}
#
#入力用のformを出力。
#
sub OutputInputForm
{
print '<form action="',$myself_name,'"',' method="POST"><br>',"\n";
print '<input type="text" name="text_box1" maxlength=12 size=50 value="';
print $text_box1_str;
print '"><br>',"\n";
print '<input type="text" name="text_box2" maxlength=12 size=50 value="';
print $text_box2_str;
print '"><br>',"\n";
print <<INPUT_FORM_TEXT;
<input type="hidden" name="post_data1" value="data_send"><br>
<input type="submit" value="送信。">
</form>
INPUT_FORM_TEXT
return 0;
}
#
#終了処理を行う。
#
sub ProgramExit
{
exit(0);
}
#
#Getでデータが送られてきたときの処理。
#
sub SentDataTypeGET
{
my $str = $ENV{'QUERY_STRING'};
return $str;
}
#
#POSTでデータが送られてきたときの処理。
#
sub SentDataTypePOST
{
my $post_data = '';
my $len = $ENV{'CONTENT_LENGTH'};
if( $len <= $post_data_limit )
{
read( STDIN,$post_data,$len );
}
return $post_data;
}
実行結果:
<html>
<header>
<title>CGIテスト用のページだよんw</title>
</header>
<body>
<form action="/~admin/cgi-bin/test.cgi" method="POST"><br>
<input type="text" name="text_box1" maxlength=12 size=50 value="あ"><br>
<input type="text" name="text_box2" maxlength=12 size=50 value="ア"><br>
<input type="hidden" name="post_data1" value="data_send"><br>
<input type="submit" value="送信。">
</form>
Your sent data : text_box1=%82%A0&text_box2=%83A&post_data1=data_send
<br>request method : post
</body>
</html>
|
このスクリプトを実行し、そのまま送信ボタンを押すと、こんな結果が出力されるはずです。
「 text_box1=%82%A0&text_box2=%83A&post_data1=data_send 」というデータがブラウザから送信されたことを示します。
このままでは、解釈不能なので、データをデコードしたりsplitしたりして、使えるようにしなければなりません。
デコード方法として「 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg 」とやり、データをデコードします。
しかし、ここではわかりやすくするため「 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg 」を使い考えます。
サンプルはわざと「あ」と「ア」を入力しました。両者の値は「あ」は「 %82%A0 」で「ア」は「 %83A 」です。%xxで1バイトを表しているハズなのに、カタカナはなにかおかしい!と思うはずです。
しかし、これでちゃんと処理できます。シフトJISの「あ」の文字コードは「 0x82a0 」です。そして「ア」の文字コードは「 0x8341 」です。
例のとおり「あ」は「 0x82a0 」と%記号をぬけは、そのまま「あ」の文字コードと一致します。
「 s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg 」の処理で「 %83A 」は、まず、 %83 の部分がマッチします。最初にマッチした値(正規表現では$1で最初にマッチした値を指す)はpack関数に渡されます(eオプションがついているため、式の評価が行われるため)。
そして、pack関数により"C"テンプレートを使うという設定なのでunsigned charの型のバイナリの構造体に0x83の値を入れます。それでまずは、一回目のマッチは終了します。
そして、次に、Aという文字から探索処理を行います。%が最初にきて・・・という探索なので、あまった「 A 」は処理されず、次の文字から再び探索が開始されます。
置換処理を行う処理により、0x83はバイナリデータとなったのですが「 A 」はそのままです。この「 A 」を数値として評価すると 0x41 です。そしてシフトJISの「ア」の文字コードは 0x8341 です。
なんと、「ア」になってしまいました!
・・・・・・・・・・という処理を行っているんだろうと、私は今のところ思ってます。違かったら、ごめんなさいtt。
エディットボックス二つのデータを送信するフォームから、呼び出されるCGIです。エンコードされたデータをデコードして、それをまたエンコードして、またそれをデコードし、それを表示します。
#!D:/tmp/f_program/activeperl/bin/perl
#文法に制限を持たせる。
use strict;
#このスクリプトのpath
our $myself_name = '/~admin/cgi-bin/test.cgi';
#POSTでデータが送信される場合の最大サイズ
our $post_data_limit = 32*1024;
#送信されたデータを保持するバッファ
our $sent_data = '';
#postかgetかどちらでデータを受け取ったのかを表す文字列。
our $request_method = '';
#エディットボックス(text_box1)にいれる文字列
our $text_box1_str = 'あ';
#エディットボックス(text_box2)にいれる文字列
our $text_box2_str = 'ア';
#エディットボックス(text_box1)から入力された文字列をデコードした結果。
our $text_box1_decode_result = '';
#エディットボックス(text_box2)から入力された文字列をデコードした結果。
our $text_box2_decode_result = '';
#エディットボックス(text_box1)から入力された文字列を
#デコードした結果を再び、エンコードしてみた結果。
our $text_box1_encode_result = '';
#エディットボックス(text_box1)から入力された文字列を
#デコードした結果を再び、エンコードしてみた結果。
our $text_box2_encode_result = '';
#エディットボックス(text_box1)から入力された文字列を
#デコードした結果を再び、エンコードして、もう一回デコードした結果。
our $text_box1_decode2_result ='';
#エディットボックス(text_box1)から入力された文字列を
#デコードした結果を再び、エンコードして、もう一回デコードした結果。
our $text_box2_decode2_result ='';
#入力がPOSTがGETどうか調べ、それに応じた処理をする。
if( $ENV{ 'REQUEST_METHOD' } eq 'POST' )
{
$request_method = 'post';
&SentDataTypePOST();
}
elsif( $ENV{ 'REQUEST_METHOD' } eq 'GET' )
{
$request_method = 'get';
&SentDataTypeGET();
}
else
{
&ProgramExit();
}
&OutputHTMLFromHeaderToBody();
&OutputInputForm();
print "\n\n",'Your sent data : ',$sent_data,"\n\n";
print '<br>';
print "request method : $request_method\n",'<br>';
print 'decode text_box1 : ',$text_box1_decode_result,"<br>\n";
print 'decode text_box2 : ',$text_box2_decode_result,"<br>\n";
print 'encode text_box1 : ',$text_box1_encode_result,"<br>\n";
print 'encode text_box2 : ',$text_box2_encode_result,"<br>\n";
print 'decode2 text_box1 : ',$text_box1_decode2_result,"<br>\n";
print 'decode2 text_box2 : ',$text_box2_decode2_result,"<br>\n";
&OutPutHTMLFromEndBodyToEndHTML();
&ProgramExit();
#
#HTMLの最初から、bodyまでのHTMLソースコードを出力。
#
sub OutputHTMLFromHeaderToBody
{
print "Content-type: text/html\n\n"; #ヘッダの出力。
print <<HTML_START_TEXT;
<html>
<header>
<title>CGIテスト用のページだよんw</title>
</header>
<body>
HTML_START_TEXT
return 0;
}
#
#/bodyから/htmlまでのHTMLソースコードを出力。
#
sub OutPutHTMLFromEndBodyToEndHTML
{
print <<HTML_END_TEXT;
</body>
</html>
HTML_END_TEXT
return 0;
}
#
#入力用のformを出力。
#
sub OutputInputForm
{
print '<form action="',$myself_name,'"',' method="POST"><br>',"\n";
print '<input type="text" name="text_box1" maxlength=12 size=50 value="';
print $text_box1_str;
print '"><br>',"\n";
print '<input type="text" name="text_box2" maxlength=12 size=50 value="';
print $text_box2_str;
print '"><br>',"\n";
print <<INPUT_FORM_TEXT;
<br>
<input type="submit" value="送信。">
</form>
INPUT_FORM_TEXT
return 0;
}
#
#終了処理を行う。
#
sub ProgramExit
{
exit(0);
}
#
#Getでデータが送られてきたときの処理。
#
sub SentDataTypeGET
{
$sent_data = $ENV{'QUERY_STRING'};
&DecodeEncode($sent_data);
}
#
#POSTでデータが送られてきたときの処理。
#
sub SentDataTypePOST
{
my $len = $ENV{'CONTENT_LENGTH'};
if( $len <= $post_data_limit )
{
read( STDIN,$sent_data,$len );
&DecodeEncode($sent_data);
}
}
#
#引数の値をデコードしグローバル変数にセットする。
#また、ためしにデコードされたものを、再びエンコードしてみる。
#それも、また別のグローバル変数にいれる。
#
#引数:
# 第一引数に、text_box1の値、第二引数にtext_box2の値を取る。
sub DecodeEncode
{
#name=valueの形に区切る。
my( $edit1,$edit2 ) = split( /&/,$_[0] );
my $tmp;
#データのみを取得する。(name=valueをvalueの値のみにする。)
( $tmp,$edit1 ) = split( /=/,$edit1 );
( $tmp,$edit2 ) = split( /=/,$edit2 );
#デコードを行う。
$text_box1_decode_result = $edit1;
$text_box2_decode_result = $edit2;
$text_box1_decode_result =~ tr/ /+/;
$text_box1_decode_result =~ s/%([0-9A-Fa-f][0-9A-Za-f])/pack('H2',$1)/eg;
$text_box2_decode_result =~ tr/ /+/;
$text_box2_decode_result =~ s/%([0-9A-Fa-f][0-9A-Za-f])/pack('H2',$1)/eg;
#デコードしたものをエンコードしてみる。
$text_box1_encode_result = $text_box1_decode_result;
$text_box2_encode_result = $text_box2_decode_result;
#英数字などの1バイト文字以外がいきたら、%をつけてunpackした値に変換。
$text_box1_encode_result =~ s/([^\w])/'%'.unpack('H2',$1)/eg;
$text_box2_encode_result =~ s/([^\w])/'%'.unpack('H2',$1)/eg;
#半角スペースは'+'に変換されているので、それを直す。
$text_box1_encode_result =~ tr/+/ /;
$text_box2_encode_result =~ tr/+/ /;
#さらにそれを、デコードしてみる。
$text_box1_decode2_result = $text_box1_encode_result;
$text_box2_decode2_result = $text_box2_encode_result;
$text_box1_decode2_result =~ tr/ /+/;
$text_box1_decode2_result =~ s/%([0-9A-Fa-f][0-9A-Za-f])/pack('H2',$1)/eg;
$text_box2_decode2_result =~ tr/ /+/;
$text_box2_decode2_result =~ s/%([0-9A-Fa-f][0-9A-Za-f])/pack('H2',$1)/eg;
}
実行結果:
<html>
<header>
<title>CGIテスト用のページだよんw</title>
</header>
<body>
<form action="/~admin/cgi-bin/test.cgi" method="POST"><br>
<input type="text" name="text_box1" maxlength=12 size=50 value="あ"><br>
<input type="text" name="text_box2" maxlength=12 size=50 value="ア"><br>
<br>
<input type="submit" value="送信。">
</form>
Your sent data : text_box1=%82%A0&text_box2=%83A
<br>request method : post
<br>decode text_box1 : あ<br>
decode text_box2 : ア<br>
encode text_box1 : %82%a0<br>
encode text_box2 : %83A<br>
decode2 text_box1 : あ<br>
decode2 text_box2 : ア<br>
</body>
</html>
|
perlからDBにアクセスするにはDBIというものを使うらしい。
それの導入手順。
環境は、windows7 + ActivePerl。
ActivePerlをインストールすると、ppmというツールもインストールされる。コマンドプロンプトからppmと打つと以下のようなプログラムが立ち上がる。

ここでインストールするべきは2点。
・DBI → DB操作を行うインターフェイスを提供する
・DBD → DB毎のDBIの実装
DBDについては、使用しているDB毎に必要なものが違ってくる。今回、使用しているのはMySQLなので、DBD名前は「DBD-mysql」というものだ。
ActivePerlインストール時には、DBIはインストールされてるっぽい。なので、今回はDBD-mysqlのみインストールを行った。
虫眼鏡みたいなアイコンのあるエディットボックスで、一覧をフィルターできます。
こんな感じで、DBD-mysqlを右クリックして、そのメニューからインストールをうんたら・・っていうのを選択。

すると、「⇒」みたいな、緑のアイコンが押下できるようになるので、そこからインストール可能です。
HTMLを自動で生成してくれたり、送信されたデータの受け渡しをやりやすくしてくれるライブラリです。
タグを出力してくれたりする機能については、使いやすいんだか、使いづらいんだかよくわからんwwwwww
(1)簡単なサンプル
とりあえず雰囲気を感じ取るために、サンプルを。タイトルタグが「サンプルです」、bodyタグ内に「にゃんにゃん」という文言が表示されるページを生成するサンプルです。
sample.cgi #!/usr/bin/perl my $encoding = 'Shift_JIS'; my $lang = 'ja-JP'; use CGI; my $q = CGI->new; print $q->header(-charset=>$encoding), $q->start_html(-title=>'サンプルです', -lang=>$lang, -encoding=>$encoding), $q->h1('にゃんにゃん'), $q->end_html;
実行結果
(2)送信画面と受信したデータを書きだす画面のサンプル
データをPOSTする画面と、POSTされたデータを受け取り、それを画面に表示するプログラムをCGI.pmを使って書きます。
以下のような2画面を作成しました。
実行結果のキャプチャーと、ソースです。
CSSを読み込ませています。おまけとして、そのCSSもつけておきました。
データ入力画面(index.cgi)
データ入力結果画面(show.cgi)
index.cgi (データ入力画面) #!"/usr/bin/perl"
use CGI;
my $encoding = 'Shift_JIS';
my $lang = 'ja-JP';
my $style_sheet_path = '../contents/css/common.css';
my $q = CGI->new;
# ヘッダーを出力(スタイルシートも出力させる)
print $q->header(-charset=>$encoding),
$q->start_html(-title=>'データ入力画面',
-lang=>$lang,
-encoding=>$encoding,
-style=>{-src=>$style_sheet_path});
# フォームタグを出力する(submitを押下されたら、show.cgiを呼び出す)
print $q->start_form(-method=>'POST', -action=>'show.cgi');
# 文言を表示
print $q->h4('すきなのを入力してね');
print $q->center($q->strong('以下のところへ好きなことを入力してください'));
print '注意事項';
print $q->ol(
$q->li('以下はほんの一例です').
$q->li('いろいろあるので、リファレンスは見ておいた方がいいです^^;')
);
# エディットボックスを表示
print 'エディットボックス : ';
print $q->textfield(-name=>'textInput', -default=>'にゃん', -size=>'20');
print $q->br, $q->br, "\n\n";
# パスワード入力エディットボックス
print 'パスワード : ';
print $q->password_field(-name=>'passwordInput', -size=>'20');
print $q->br, $q->br, "\n\n";
# テキストエリアを表示
print 'テキストエリア : ';
print $q->textarea(-name=>'message', -default=>'わんわん', -cols=>'40', -rows=>'5');
print $q->br, $q->br, "\n\n";
# コンボボックスを表示
print 'コンボボックス : ';
my @index_combo = (1, 2, 3);
my %label_combo = (1=>'ゆがみねぇな', 2=>'だらしねぇ', 3=>'仕方ないね');
print $q->popup_menu(-name=>'combo_box', -values=>[@index_combo], -default=>'100', -labels=>\%label_combo);
print $q->br, $q->br, "\n\n";
# リストボックスを表示
print 'リストボックス : ';
my @index_list = (1, 2, 3, 4 ,5);
my %label_list = (1=>'超スピード', 2=>'あん?焼き芋のパン?サンドウィッチ?', 3=>'いやぁ、スイマセーン', 4=>'見えるってのは辛いな、サム', 5=>'hey! come on!');
print $q->scrolling_list(-name=>'listbox', -size=>3, -values=>[@index_list], -default=>'1', -labels=>\%label_list, -multiple=>'false');
print $q->br, $q->br, "\n\n";
# チェックボックス(group)の表示
print 'チェックボックス(group) : ';
my @index_checkbox = (1, 2, 3, 4);
my %label_checkbox = (1=>'芋が無いと失礼だ', 2=>'それはそれでいいんか?', 3=>'じょっぱりだお〜', 4=>'承知');
print $q->checkbox_group(-name=>'checkbox_group', -values=>[@index_checkbox], -default=>['1', '2'], -labels=>\%label_checkbox);
print $q->br, $q->br, "\n\n";
# ラジオボタンの表示
print 'ラジオボタン : ';
my @index_radiobutton = (1, 2);
my %label_radiobutton = (1=>'森の妖精', 2=>'陸のクリオネ');
print $q->radio_group(-name=>'radiobutton', -values=>[@index_radiobutton], -default=>'1', -labels=>\%label_radiobutton);
print $q->br, $q->br, "\n\n";
# チェックボックス(単独)の表示
print 'チェックボックス(単独) : ';
print $q->checkbox(-name=>'checkbox_single', -value=>'imono_pan', -checked=>'1', -label=>'芋のパン');
print $q->br, $q->br, "\n\n";
# hiddenフィールド
print 'hiddenフィールド : (画面上には何も表示されません)';
print $q->hidden(-name=>'hidden_field_list', -default=>['saikyou', 'are you ok']);
print $q->hidden(-name=>'hidden_field', -default=>['saikyou']);
print $q->br, $q->br, "\n\n";
# 送信ボタン
print 'submitボタン : ';
print $q->submit(-value=>'送信');
print $q->br, $q->br, "\n\n";
# リセットボタン
print 'resetボタン : ';
print $q->reset(-value=>'リセット');
print $q->br, $q->br, "\n\n";
# フォームの終了タグを出力する
print $q->endform;
print $q->hr;
# リンクを張る
print 'リンク : ';
print $q->a({href=>'http://alctail.sakura.ne.jp'}, 'ホームページに戻る');
print $q->br, $q->br, "\n\n";
print $q->end_html;
show.cgi (入力データ表示画面) #!"/usr/bin/perl"
use CGI;
my $q = CGI->new;
my $encoding = 'Shift_JIS';
my $lang = 'ja-JP';
my $style_sheet_path = '../contents/css/common.css';
# エディットボックスの値を受け取る
my $text_input = $q->param('textInput');
# パスワードの値を受け取る
my $password_input = $q->param('passwordInput');
# テキストエリアの値を受け取る
my $message = $q->param('message');
# コンボボックスの値を受け取る
my $combo_box = $q->param('combo_box');
# リストボックスの値を受け取る
my @list_box = $q->param('listbox');
# チェックボックスの値を受け取る
my @checkbox_group = $q->param('checkbox_group');
# ラジオボタンの値を受け取る
my $radiobutton = $q->param('radiobutton');
# チェックボックスの値を受け取る
my $checkbox_single = $q->param('checkbox_single');
# hiddenフィールドの値を受け取る
my @hiddenfield_list = $q->param('hidden_field_list');
my $hiddenfield = $q->param('hidden_field');
# 取得した値を画面へ表示する
# ヘッダーを出力(スタイルシートも出力させる)
print $q->header(-charset=>$encoding),
$q->start_html(-title=>'データ入力結果画面',
-lang=>$lang,
-encoding=>$encoding,
-style=>{-src=>$style_sheet_path});
print 'エディットボックス : '.$text_input;
print '<br>'."\n";
print 'パスワード : '.$password_input;
print '<br>'."\n";
print 'テキストエリア : '.$message;
print '<br>'."\n";
print 'コンボボックス : '.$combo_box;
print '<br>'."\n";
print 'リストボックス : '; foreach(@list_box){ print $_," "; };
print '<br>'."\n";
print 'チェックボックス(group) : '; foreach(@checkbox_group){ print $_," "; };
print '<br>'."\n";
print 'ラジオボタン : '.$radiobutton;
print '<br>'."\n";
print 'チェックボックス(単独) : '.$checkbox_single;
print '<br>'."\n";
print 'hiddenフィールド : '; foreach(@hiddenfield_list){ print $_," "; };
print '<br>'."\n";
print 'hiddenフィールド : '.$hiddenfield;
print '<br>'."\n";
# 送信したパラメータを取得することも可能です。
print '<br><br>パラメータの一覧を取得し、表示します<br>', "\n";
my @key_list = $q->param;
foreach(@key_list) {
print 'param name : ', $_;
print '<br>', "\n";
}
print $q->end_html;
common.css body
{
background-image: url("../img/back.png");
background-repeat: repeat-x repeat-y;
}
a:hover
{
background-color: #E0D0F0;
}
h4
{
border-bottom: solid 2px #bbccff;
border-left: solid 1em #bbccff;
}
説明書としては、このあたりを見ればよろしいかと(さくらインターネットにインストールされているCGI-Sessionが、4.40らしいので、そのバージョンのページを張っておく)
http://search.cpan.org/~markstos/CGI-Session-4.40/
セッションのデータ保管先として、ファイルか、MySQLが選べる。
具体的な使い方を以下に示す。
セッションデータのストレージとしてファイルを選択した場合