※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。

■ 投稿フォームの作成

さて、今回は「投稿フォームの作成」です。
この処理は一部文字変換に難しい部分がありますが、その解説はさらっと流しておきます。(笑)
それ以外は今までに習ったテクニックの積み重ねでしかありません。

この処理を理解するには当然ですが、「HTML」の知識が必要になります。
解からない方は「HTMLの解説」で勉強してくださいね。

【 解    説 】

まず、「HTML」で投稿フォームを作っておきます。
記述サンプルは次のような感じ。
<form method="post" action="inpfrm.cgi"> 名前:<input type="text" name="name"><br> コメント:<input type="text" name="comment"><br><br> <input type="submit" value="投稿"> </form>

このフォームから入力されたパラメータを取得するにはいくつかの特殊な処理が必要です。
まずパラメータを取得するには次のように記述します。
$len = read(STDIN, $param, 1024);

これは、与えられたパラメータ1024バイト以下で取得し、「$param」という変数にセットします。
と、同時に取得した文字数(バイト数)が「$len」にセットされます。

次に、この取得した文字列に全角文字が含まれているとURLエンコードされてますので、これを元に戻します。
※元に戻す作業のことを「デコード」と言います。
これは、次のような記述で処理します。
$param =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;

これは正規表現(文字列のパターンマッチ)を使って、「$param」にセットされたURLエンコード文字列を元に戻す方法です。
※正規表現については別の機会に解説します。

取得された「$param」の中は「name=(nameの文字列)&comment=(commentの文字列)」という形式になっていますので、まずは「split()」関数を使い、「&」で区切りながら配列変数「@plist」にセットする場合は次のように記述します。
@plist = split(/&/, $param);

この「@plist」にセットされた文字列をひとつずつ取り出しながら「=」で区切り、それぞれを「$key」、「$val」にセットするにはリスト形式を使って次のように記述します。
foreach $strdat (@plist){ ($key, $val) = split(/=/, $strdat); $prm{$key} = $val; }

「$prm{$key} = $val;」は、後で使いやすいように、取得した値を名前をキーとしたハッシュにセットしています。

次に、取得した文字列を「,(カンマ)」区切りでファイルに記録しましょう。
ファイル名は「inpfrmf.cgi」としました。
$filnam = "inpfrmf.cgi"; open(FP,">>$filnam"); print FP "$prm{name},$prm{comment}\n"; close(FP);

と同時に、記録結果も表示しておきましょう。
print "記録完了!<br><br>\n"; print "名前:$prm{name}<br>\n"; print "コメント:$prm{comment}<br>\n";

今回、アクセスログのファイル名は「inpfrmf.cgi」としました。
このファイル名は何でもいいのですが、セキュリティの意味で拡張子は「.cgi」にしておくことをお勧めします。

このようにしておくと、訪問者がこのファイルを覗こうとした時、自動的にCGIとして実行しようとしますが、中身がCGIではないのでエラーが発生します。
したがって、覗こうとしてもエラーが発生して覗けなくなるからです。

では、まず入力用の投稿フォームを「HTML形式」で作成します。
ファイル名は「inpfrm.html」とするといいでしょう。

【記述サンプル】
<HTML> <HEAD> <title>投稿フォーム</title> </HEAD> <BODY> <div align="center"> <h4>【投稿フォーム】</h4> </div> <table cellpadding="8" border="1" align="center"> <tr> <td bgcolor="#eeeeff"> <form method="post" action="inpfrm.cgi"> 名前:<input type="text" name="name"><br> コメント:<input type="text" name="comment"><br><br> <input type="submit" value="投稿"> </form> </td></tr></table> <br> </BODY> </HTML>

次に、投稿フォームのデータを取得してファイルに記録するCGIを作成します。
ファイル名は「inpfrm.cgi」にしてください。

【記述サンプル】
#!/usr/bin/perl $len = read(STDIN, $param, 1024); $param =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; @plist = split(/&/, $param); foreach $strdat (@plist){   ($key, $val) = split(/=/, $strdat);   $prm{$key} = $val; } $filnam = "inpfrmf.cgi"; open(FP,">>$filnam"); print FP "$prm{name},$prm{comment}\n"; close(FP); print "記録完了!<br><br>\n"; print "名前:$prm{name}<br>\n"; print "コメント:$prm{comment}<br>\n";
◆実行結果について

上記のサンプルをそれぞれ「inpfrm.html」「inpfrm.cgi」という名前で保存して実行してみてください。
(注意)
サーバーでテストする場合は、前もってアクセスログを記録するための、何もデータの入っていない「inpfrmf.cgi」という名前のファイルをパーミッション「666」で必ず作成しておいて下さい。

実行結果はこちらをクリックしてください。
このサンプルは実行結果を表示するだけで実際に記録されるわけではありません。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。


page update:2019/01/09 19:55

Copyright (c) 2000-2009, all Rights Reserved & Produced by atom