FrontPage

自作CGI掲示板のHTML出力部

実際に作成したソースコードを公開します。
私の掲示板では、分かりやすさのため、機能の観点でソースを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) &quot;$subject&quot; $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 &copy; 2005-2008 baje, All rights reserved.</strong> <!-- コピーライト出力         -->
            </font>
        </td>
    </tr>
</body>                                                         <!-- HTML出力の終了                              -->
</html>                                                         <!-- HTML出力の終了                              -->
END
#/HTML Log ****************************************************##                                                  #
exit;

関連ページ

Perl・CGI入門/パッケージを使う/ID Roll
Perl・CGI入門/自作掲示板/ログファイル作成

修正履歴

  • guestbook_r2.cgi
    • strictとwarnings
    • 合わせて変数の初期化を実施。
    • ログファイルに使う区切り文字を変更

  • guestbook_r3.cgi
    • もろもろ改良

  • guestbook_r4.cgi
    • ログ切戻し機能実装
    • クッキー作成部の修正に対応
[添付ファイル一覧] [全ページの添付ファイル一覧]
アップロード可能最大ファイルサイズは 1,024KB です。

管理者パスワード:

参考ページ

http://www.perl-labo.org/
http://perl.misty.ne.jp/


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:15 (5185d)