SAK 図書館
CGI-Perl 応用実地編 - 簡易伝言板作成3 (投稿内容ファイル書き込み)
■伝言内容ファイル書き込み ・投稿ボタンを押した後の、ファイル書き込み処理を作ります。 ・伝言ファイルの定義を「#// 準備」と「#// パラメタ取得」の間に次のよう に追加します。 「$msdnm = './';」は、この cgi プログラムと同じ場所と言う定義です。 「$msmax = 10;」は、メッセージを 10 個まで保持すると言うです。 この値を 20 にすれば、21 個目前のメッセージは自動的に整理されます。 #// 伝言ファイル $msdnm = './'; $msfnm = 'dengon.txt'; $msmax = 10; ・投稿内容のファイル書き込みでは、表示用に全件データを読んでおいて、 日付と投稿内容を 1 レコードにして、配列の先頭に挿入しています。 これは、ソートを使わずに降順に表示するためです。 続いて、$msmax 以上の余分なメッセージを整理して、ファイルに書き込み します。 ・データの区切りには、通常入力されないであろう「_~|~_」を使用していま す。表示時にはこの記号で分割して処理します。 ・「#// HTML ボディ表示」部分は、ファイル内容から表示するように 「#// 伝言ファイル表示」として作り替えました。 後ほど綺麗なテーブル表示にします。 ・エラーメッセージなどの表示用に「#// メッセージ表示」DspMsg() 関数を sub GetPara の前に追加します。 以上を test3.cgi として修正すると、次のようになります。 #!/usr/local/bin/perl #//===================================================================== #// test3.cgi 簡易伝言板 #//===================================================================== #// 準備 $title = '簡易伝言板'; $callcgi = 'test3.cgi'; #// 伝言ファイル $msdnm = './'; $msfnm = 'dengon.txt'; $msmax = 10; #// パラメタ取得 *data = GetPara(); $md = $data{'md'}; $hd = $data{'hd'}; $ms = $data{'ms'}; #// 伝言ファイル読み込み $err = 0; open(FIL, "$msdnm$msfnm") or $err = 1; if ($err) { DspMsg("ファイル読み込みオープンエラー ($msdnm$msfnm)"); exit(0); } @rec = <FIL>; close(FIL); #// 投稿処理開始 if ($md eq '1') { #// 伝言編集 ($ss, $mn, $hh, $dd, $mm, $yy, $yb) = localtime(time); $yy += 1900; $mm++; $dt = sprintf("%04d.%02d.%02d %02d:%02d:%02d", $yy, $mm, $dd, $hh, $mn, $ss); $rec = $dt . '_~|~_' . $hd . '_~|~_' . $ms . "\n"; #// 伝言ファイル書き込み $err = 0; open(FIL, ">$msdnm$msfnm") or $err = 1; if ($err) { DspMsg("ファイル書き込みオープンエラー ($msdnm$msfnm)"); exit(0); } unshift @rec, $rec; for ($i = $#rec; $i >= $msmax; $i--) { pop @rec; } print FIL @rec; close(FIL); #// 投稿処理終了 } #// HTML ヘッド表示 print << "END_OF_HTML"; Content-type: text/html <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>$title</TITLE> </HEAD> <BODY> <CENTER> <P><B>◆ 簡易伝言板 ◆</B></P> <FORM action="$callcgi" id=FORM1 method=post name=FORM1> <INPUT TYPE="hidden" NAME="md" VALUE="1"> <TABLE bgcolor=#b0b0b0 border=0 cellPadding=3 cellSpacing=2> <TBODY> <TR bgcolor=#f0f0f0> <TD nowrap><FONT size=-1>ハンドル</FONT></TD> <TD nowrap><INPUT id=hd name=hd size="22" maxlength="40"></TD> </TR> <TR bgcolor=#f0f0f0> <TD nowrap><FONT size=-1>メッセージ</FONT></TD> <TD nowrap><INPUT id=ms name=ms size="62" maxlength="200"></TD> </TR> </TBODY> </TABLE> <BR> <TABLE bgcolor=#b0b0b0 border=0 cellPadding=3 cellSpacing=2> <TBODY> <TR bgcolor=#f0f0f0> <TD nowrap><INPUT id=submit1 name=submit1 type=submit value=" 投稿 "></TD> <TD nowrap><INPUT id=reset1 name=reset1 type=reset value="リセット"></TD> </TR> </TBODY> </TABLE> </FORM> END_OF_HTML #// 伝言ファイル表示 print '日付 | ハンドル | メッセージ<BR>'; foreach (@rec) { @w = split(/\_\~\|\~\_/, $_); $dt = @w[0]; $hd = @w[1]; $ms = @w[2]; print $dt, ' | ', $hd, ' | ', $ms, '<BR>'; } #// HTML テイル表示 print << "END_OF_HTML"; </CENTER> </BODY> </HTML> END_OF_HTML #// 終了 exit(0); #//===================================================================== #// メッセージ表示 #//===================================================================== sub DspMsg { my($msg) = @_[0]; #// メッセージ表示 print << "END_OF_HTML"; Content-type: text/html <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>$title</TITLE> </HEAD> <BODY> <P>$msg</P> </BODY> </HTML> END_OF_HTML #// リターン return; } #//===================================================================== #// パラメタ取得 #//===================================================================== sub GetPara { my($encode) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($qu, @in, $key, $val); #// 日本語コード変換 jcode.pl 読み込み require 'jcode.pl' if $encode; #// パラメタ取得 if ($method eq 'GET') { $qu = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $qu, $ENV{'CONTENT_LENGTH'}); } local(@qu) = split(/&/, $qu); foreach (@qu) { tr/+/ /; ($key, $val) = split(/=/); $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encode) if ($encode); jcode'convert(*val, $encode) if ($encode); $in{$key} = $val; } #// 戻り値セット return *in; } ■CGI-Perl 応用実地編資料
■CGI-Perl 基礎編資料
■CGI-Perl 基礎実地編資料
■PHP 基礎編資料
■PHP + MySQL 編資料