中井技術工房 CGI アプローチ トップ > CGIアプローチ > ここ

フォームからのデータ入力処理
●仕様

[ 入力画面 ]


[ 出力画面 ]

 
●元情報

次の情報を利用させていただきました。
ただし、かなりいじくっています。
 

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;

[ 機能説明 ]

ソース中のコメントでわかると思うが?


トップ > CGIアプローチ トップ > 頁トップ