''[[FrontPage]]''
* 自作CGI掲示板のHTML出力部 [#lb698849]
実際に作成したソースコードを公開します。~
私の掲示板では、分かりやすさのため、機能の観点でソースを2つに分けています。~
それぞれ、表(HTML出力部: guestbook.cgi)と裏(ログファイル作成部: write.cgi)といったかたちで。~
ここではログの読込みとHTML出力に特化したguestbook.cgiを、コメント中にて解説しています。~
~
近いうちに簡単なフローなど作ってみようかと。~
~
ファイル名: guestbook_r4.cgi
#!/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;
** 関連ページ [#q0d76fa7]
[[Perl・CGI入門/パッケージを使う/ID Roll]]~
[[Perl・CGI入門/自作掲示板/ログファイル作成]]
** 修正履歴 [#hd1fdd18]
-guestbook_r2.cgi~
--strictとwarnings~
--合わせて変数の初期化を実施。~
--ログファイルに使う区切り文字を変更~
~
-guestbook_r3.cgi~
--もろもろ改良~
~
-guestbook_r4.cgi~
--ログ切戻し機能実装~
--クッキー作成部の修正に対応~
#attach( [nolist] ,[noform])
*** 参考ページ [#h9a09981]
http://www.perl-labo.org/~
http://perl.misty.ne.jp/