[ 入力画面 ]
[ 出力画面 ]
●元情報
次の情報を利用させていただきました。
ただし、かなりいじくっています。
Web Liberty フォームからの入力を受け取る(http://www.web-liberty.net/improve/perl/input.html)
●ファイル格納状態
----+- www (publc_html)
|
+- ????? -+- FormPost.htm
|
+- PostTest.cgi (パーミッション 755 に設定のこと)
|
+- Rslt.dat(パーミッション 666 に設定のこと)
●データ入力フォーム html
[ ソース ]
<HTML lang=ja>
<!------------------------------------------------------------------->
<!- データ入力テスト -->
<!------------------------------------------------------------------->
<HEAD>
<TITLE>中井技術工房/データ入力テスト </TITLE>
</HEAD>
<BODY>
<FORM ACTION="PostTest.cgi" METHOD="POST">
<p>
ハンドルネーム<br>
<INPUT TYPE="TEXT" NAME="handle"><br>
メッセージ<br>
<INPUT TYPE="TEXT" NAME="message">
<p>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>
[ 機能説明 ]
2つの入力セルを設けた、FORM です。
データは PostTest.cgi で処理するよう宣言(ACTION="〜"で)しています。
●入力データ処理 CGI
[ ソース ]
#!/usr/bin/perl
#==========================================================================
# FORM によるデータ入力テスト CGI Jan.5,2015
#==========================================================================
# 入力データを取り出す html から 'POST' か 'GET' を指定して本 CGI が呼び出される
# 受け取った生データは下段に PRINT で画面に表示すればチェックできる
# (例)受信メッセージは[handle=nakai99%40+nakai&message=nakai2%92%86%88%E4nakai]です。
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
$rawdata = $ENV{'QUERY_STRING'};
}
# 入力データを分解する
# & セパレータで分割し、分割メッセージごとに処理する
foreach $data (split(/&/, $rawdata)) {
# = で分割し、$key= キー名 $value= '=' 以後の文字列として取り出す
($key, $value) = split(/=/, $data);
# スペースが'+' に変換されているので全部スペースにもどす
$value =~ s/\+/ /g;
# % + 2バイトを16進数字(unsigned char)に変換
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
# tab(0x09) を全部空文字に置換
$value =~ s/\t//g;
# 連想配列にキー名を指定して格納
$in{"$key"} = $value;
}
#--------------------------------------------------------------------------
# 入力データを出力する
# Shift_JIS 宣言はいらんと思うが?動作がおかしいと下の文と入れ替えてね!
#print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "Content-type:text/html\n\n";
print "<html>\n";
print "<head><title>フォームサンプル</title></head>\n";
print "<body>\n";
# 受け取ったデータをファイルに書き込む
# まずデータを配列に格納
# 'handle' 'message' は html の FORM 内入力セルの name
# 各行のデータは [ ] でくくってみた
@file[0]="handle [$in{'handle'}] \n";
@file[1]="message [$in{'message'}] \n";
# ファイルに一括で書き出す
if (open(FH, ">Rslt.dat")) {
print FH @file;
close(FH);
} else {
print "<p>ファイルに書き込めません。</p>";
}
# 受け取ったデータを表示する
print "<p>入力されたハンドルネームは$in{'handle'}です。</p>\n";
print "<p>入力されたメッセージは$in{'message'}です。</p>\n";
# 受信データ丸ごとも表示、変数の最後の次文字が ascii 文字になると変数名が混乱するので
# 文字列連結演算子を使って連結する
print "<p>受信メッセージは[" . $rawdata . "]です。</p>\n";
print "</body>\n";
print "</html>\n";
exit;
[ 機能説明 ]
ソース中のコメントでわかると思うが?