自作CGI掲示板のHTML出力部 †実際に作成したソースコードを公開します。 #!/usr/bin/perl use warnings; # 警告表示 # use strict; # 構文チェック # # # require './jcode.pl'; # for Shift-Jis # # # # Read Cookie *************************************************## Cookieの内容を読込む # my $cv = ""; # クッキーのデータ行を格納する # my $cname = ""; # クッキーに保存された名前 # my $curl = ""; # クッキーに保存されたURL # my $cmssid = ""; # クッキーに保存されたID # my $nouse = ""; # ゴミデータの処理 # # # $cv = $ENV{'HTTP_COOKIE'}; # (あなたの)環境変数, クッキーの内容を変数に読込む # # # ($cname, $curl, $cmssid, $nouse) = split( /#@#/, $cv ); # クッキーの内容を各変数に格納 # # # unless( defined( $cmssid ) || $cmssid ne "" ) # 入力IDが未定義または空白かどうか # { # 入力IDが未定義または空白の場合 # $cmssid = 1; # デフォルトで"1" # } # # #/Read Cookie *************************************************## # # Read Log ****************************************************## ログファイルを読込む # my @reada = (""); # ログファイルの内容を格納する # my @readb = (""); # 確定済みログ件数を測定する(!性能改善余地!) # my $face = 0; # 未確定ログ件数 # # # open( LOGR, "<./guestlog.txt" ) # ログファイルをオープン # or print "Location: http://bj006.com/cgi/error0.htm"."\n\n"; # 失敗したら、エラーページ0へジャンプ # flock( LOGR, 1 ) # 共有ロック # or print "Location: http://bj006.com/cgi/error0.htm"."\n\n"; # 失敗したら、エラーページ0へジャンプ # @reada = <LOGR>; # ログファイルの内容を行ごとに配列に格納 # close LOGR; # ファイルクローズ # # # open( INFO, "<./LOG_MAS.txt" ) # 確定済みログファイルをオープン(!性能改善余地!) # or print "Location: http://bj006.com/cgi/error0.htm"."\n\n"; # 失敗したら、エラーページ0へジャンプ # flock( INFO, 1 ) # 共有ロック # or print "Location: http://bj006.com/cgi/error0.htm"."\n\n"; # 失敗したら、エラーページ0へジャンプ # @readb = <INFO>; # ログファイルの内容を行ごとに配列に格納 # close INFO; # ファイルクローズ # # # $face = @reada - @readb; # 未確定ログ件数を計算する(!性能改善余地!) # #/Read Log ****************************************************## # # HTML Front **************************************************## HTML前半部出力 # print 'Content-type: text/html'."\n\n"; # HTML出力 # # # print <<HF; # HTML出力 複数行 # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>guestbook</title> </head> <body bgcolor="#B8A470" link="#0099FF" vlink="#999999" alink="#FFFF99"> <p align="left"> <font size="+7" face="Times New Roman, Times, serif"> <strong>bj006.com Guestbook - 掲示板</strong> </font> <font size="3"><br></font> </p> <form action="./write.cgi" method="POST"> <!-- 入力フォーム(POST)の開始 write.cgiで処理 --> <div align="left"> <table width="98%" border=" " bordercolor="#B8A470"> <tr> <td width="6%">Name:</td> <!-- 入力フォーム: 名前 --> <td colspan="2"> <input name="name" type="text" size="25" maxlength="20" value="$cname"> <!-- cookieから なければ空白 --> </td> </tr> <tr> <td>Subject:</td> <!-- 入力フォーム: タイトル --> <td colspan="2"><input name="subject" type="text" maxlength="20" size="25"></td> </tr> <tr> <td>Message:</td> <!-- 入力フォーム: 本文 --> <td colspan="2" rowspan="2"> <textarea name="message" cols="40" rows="4"></textarea> </td> </tr> <tr> <td height="15"></td> </tr> <tr> <td height="2">URL:</td> <!-- 入力フォーム: URL --> <td height="2" colspan="2"> <input name="url" type="text" value="$curl" size="25"> <!-- cookieに保存されたURL なければ空白 --> </td> </tr> <tr> <td height="2">ID: </td> <!-- 入力フォーム: ID --> <td width="3%" height="2"> <input name="mssid" type="text" size="4" maxlength="4" value="$cmssid"> <!-- cookieのID or 1 --> </td> <td width="5%" height="2">(input 1-1024)</td> <td width="12%"></td> <td width="74%">未確定ログ数 : $face 件</td> <!-- 未確定ログ数の表示 --> </tr> <tr> <td height="7"></td> <td height="7" colspan="3"> <input type="submit" name="Submit" value="submit"> <!-- 入力フォーム: 送信ボタン --> <INPUT TYPE="reset" VALUE="reset"> </td> <td width="74%"> 未確定ログの確定 : <input type="submit" name="confirm" value="confirm"> <!-- 入力フォーム: ログの確定 --> 確定ログ状態へ戻す : <input type="submit" name="rollback" value="rollback"> <!-- 入力フォーム: ロールバック --> </td> </tr> </table> </div> </form> <!-- 入力フォーム ここまで --> <p align="left"> <!-- リンク --> <a href="http://bj006.com"> <font size="2"> <span style="background-color: #000000">-HOME-</span> </a> <a href="http://bj006.com/cgi/aboutguestbook"> <span style="background-color: #000000"> この掲示板についての説明 </span> </font> </a> </p> <table width="75%" border="" bordercolor="#B8A470"> <!-- HTML前半部出力終了 ログ部テーブルタグ前 --> HF #/HTML Front **************************************************## # # Query *******************************************************## クエリ判定部 # my $qkey = ""; # クエリのキー値 # my $page = 0; # クエリのページ指定値 # # # unless( defined $ENV{'QUERY_STRING'} ) # クエリがないかどうか # { # クエリがない場合 # $page = 0; # 最新ページを表示 # } # # else # クエリがある場合 # { # # ($qkey, $page) = split( /=/, $ENV{'QUERY_STRING'} ); # クエリを取得 # } # # #/Query *******************************************************## # # HTML Log ****************************************************## HTML出力 ログ部 # my $cnt = @reada; # 書込み件数取得 # my $n = 0; # ページ毎出力件数カウント用 # my $no = ($cnt - 10 * $page); # ログ件端数 最終ページに対応 # # # my $name = ""; # 名前 # my $subject = ""; # タイトル # my $message = ""; # 本文 # my $url = ""; # URL # my $mssid = 0; # ID # my $time = ""; # 書込み時刻 # my $ipaddr = ""; # IPアドレス # my $host = ""; # ホスト名 # # # while( $no > 0 && $n < 10 ) # ログ出力は1ページ10件まで, ログがなくなれば終了 # { # # ($name, $subject, $message, $url, $mssid, $time, $ipaddr, $host, $nouse) # ログの内容を各変数に格納 # = split( /#@#/, $reada[$no - 1] ); # # $n++; # 出力件数カウントアップ # # # print <<HL; # HTML出力 複数行 # <tr> <td> <table width="720" height="54" border="0" align="left" cellpadding="6" bordercolor="#B8A470" bgcolor="#000000" id="submittion"> </td> <tr> <td height="11" valign="top" bgcolor="#000000"> <strong> <font color="#CC0000"> No.$no $name ($mssid) "$subject" $url $time <!-- 各変数の値を出力 --> </font> </strong> </td> </tr> <tr> <td height="11" valign="top"> <font color="#FFFFFF">$message</font> <!-- 本文を出力 --> </td> </tr> </table> <!-- HTMLログ部出力終了 ログ部テーブルタグ後 --> HL $no--; # ログ件端数カウントダウン # } # # # Log Process *************************************************## 過去ログページへのリンク出力 # print <<LOG; # HTML出力 複数行 # <tr> <td> <a href="http://bj006.com/cgi/guestbook.cgi"> <font size="3"> <strong> <span style="background-color: #000000">[NEWEST]</span> </a> Log → LOG # # $page = 1; # 全ログ表示に必要なページ数 == ページ番号 # while( ($cnt - $page * 10) > 0 ) # より古いログが存在する # { # # print '<a href="http://bj006.com/cgi/guestbook.cgi?page='. # HTML出力 過去ログへのリンク部 # "$page". # ページ番号をクエリに # '"><span style="background-color: #000000">['. # # "$page". # ぺージ番号を表示に # ']</span></a> '; # HTML出力終了 過去ログへのリンク部 # $page++; # ページ番号カウントアップ # } # # print '</strong></font></td></tr>'."\n"; # HTML出力 # #/Log Process *************************************************## # print <<END; # HTML出力 複数行 # <tr> <td> <font size="-1"> <strong>Copyright © 2005-2008 baje, All rights reserved.</strong> <!-- コピーライト出力 --> </font> </td> </tr> </body> <!-- HTML出力の終了 --> </html> <!-- HTML出力の終了 --> END #/HTML Log ****************************************************## # exit; 関連ページ †Perl・CGI入門/パッケージを使う/ID Roll 修正履歴 †
参考ページ † |