かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】

掲示板

#! /usr/local/bin/perl

# 設定
$FILE        = './dat/board.dat';    # 書き込み保存ファイル
$MAX        = 100;            # 保存件数
$VIEW        = 10;            # 1ページの表示件数
$TEXTMAX    = 1000;            # 本文文字数制限(全角)
$NAMEMAX    = 10;            # 名前文字数制限(全角)
$TITLEMAX    = 20;            # 題名文字数制限(全角)
$PASSWORD    = '1234';        # 削除用パスワード

# フォームデータ取り込み
if($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
    $query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)) {
    my    ($key, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
    $value =~ s/&/&/g;
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/\x0D\x0A\s*/<br>/g;
    $value =~ s/\s+/ /;
    $FORM{$key} = $value;
}

# データ読み込み
open(FILE, "<$FILE");                        # データ読み込み
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
if($FORM{'mode'}) {
    if($FORM{'mode'} eq 'write') {                # データ追加 
        if($FORM{'text'} and length($FORM{'text'}) <= $TEXTMAX * 2
                 and length($FORM{'name'}) <= $NAMEMAX * 2
                 and length($FORM{'title'}) <= $TITLEMAX * 2    ) {
            my    $tm = time;
            unshift @DATA, "$tm\t$FORM{'name'}\t$FORM{'title'}\t$FORM{'text'}\t\n";
            while(@DATA > $MAX) {
                pop @DATA;
            }
        }
    }
    elsif($FORM{'mode'} eq 'delete') {            # データ削除 
        if($FORM{'no'} ne "") {
            if($FORM{'pass'} eq $PASSWORD) {
                splice @DATA, $FORM{'no'}, 1;
            }
        }
    }
    #サンプルにつき書き込み停止
    #open(FILE, ">$FILE");                    # データ書き込み
    #eval{ flock(FILE, 2) };
    #print FILE @DATA;
    #close FILE;
}

# HTML出力
print qq(Content-type: text/html; charset=Shift_JIS\n\n);
print <<END;
    <html>
    <head>
    <title>掲示板</title>
    </head>
    <body bgcolor="#eeffee">
    <center><h1 style="margin:2px;font-size:17px">掲   示   板</h1></center>
    <hr>
    <form action="$ENV{'SCRIPT_NAME'}" method="POST">
    名前:<input type="text" name="name" size="50" maxlength="$NAMEMAX" value="$FORM{'name'}"><br>
    <br>
    題名:<input type="text" name="title" size="50" maxlength="$TITLEMAX"><br>
    <br>
    本文: <small>※全角$TEXTMAX文字以内</small><br>
    <textarea name="text" rows="10" cols="70"></textarea><br>
    <br>
    <input type="hidden" name="mode" value="write">
    <input type="submit" value=" 書き込み "><br>
    </form>
    <form action="$ENV{'SCRIPT_NAME'}" method="POST">
    <hr>
END

# データの出力
$begin = $FORM{'next'};
$end   = $begin + $VIEW;
if($end > @DATA) {
    $end = @DATA;
}
for($i = $begin ; $i < $end ; ++$i) {
    my    ($tm, $name, $title, $text) = split(/\t/, $DATA[$i]);
    my    ($sec, $min, $hour, $date, $mon, $year, $day) = localtime($tm);
    if($name eq "") {
        $name = "名無し";
    }
    if($title eq "") {
        $title = "無題";
    }
    printf qq(<input type="radio" name="no" value="%d">), $i;
    print qq(<b>【$title】$name</b><br>);
    print qq($text<br>);
    printf qq(<div align="right">[%02d/%02d %02d:%02d]</div>), ++$mon, $date, $hour, $min;
    print qq(<hr>\n);
}

# 前ページ・次ページへのリンク
print qq(<center>\n);
if($FORM{'next'}) {
    printf qq(<a href="$ENV{'SCRIPT_NAME'}?next=%d">≪前ページ</a>\n), $FORM{'next'} - $VIEW;
}
if($end < @DATA) {
    print qq(<a href="$ENV{'SCRIPT_NAME'}?next=$end">次ページ≫</a><br>\n);
}
print qq(</center>\n);

# HTML出力    
print <<END;
    <div align="right">
    <input type="password" name="pass" value="$FORM{'pass'}" size="4">
    <input type="hidden" name="mode" value="delete">
    <input type="hidden" name="next" value="$FORM{'next'}">
    <input type="submit" value="削除">
    </div>
    </form>
    </body>
    </html>
END

exit;
CGI(Perl)
Hello world ! ユーザーエージェント取得・表示($ENV{'HTTP_USER_AGENT'})
IPアドレス取得・表示($ENV{'REMOTE_ADDR'}) リンク元取得・表示($ENV{'HTTP_REFERER'})
URL取得・表示($ENV{'HTTP_HOST'}, $ENV{'REQUEST_URI'}) 環境変数を全て表示(%ENV)
ホスト名取得・表示(gethostbyaddr) 訪問者のプロバイダーを表示
訪問者の都道府県を取得・表示 日付を表示(localtime time)
日付を画像表示(localtime time, substr) アクセス日時を表示(localtime time)
指定の日までの日数を表示 曜日によって背景色を変える
日によって背景色を変える 月によって背景色を変える
見るたびに背景色を変える 見るたびに背景画像を変える
おみくじ(rand, int) カラーチャート
Shift_JIS文字コード表 UTF-8文字コード表
グラフ(横棒グラフ) アクセスカウンター
アクセスカウンター(画像) アクセスカウンター(今日・昨日)
訪問回数(クッキー, $ENV{'HTTP_COOKIE'}, Set-Cookie) アクセスログ保存
アクセスログ集計 パスワード認証
クッションページ($ENV{'QUERY_STRING'}) クッションページ($ENV{'PATH_INFO'})
フォーム入力内容をクッキーに保存 1つのCGIでフレームページを表示
IPアドレスからホスト名を取得(gethostbyaddr) ホスト名からIPアドレスを取得(gethostbyname)
IPアドレスからプロバイダーを取得 IPアドレスから都道府県を取得
文章中の文字列を別の文字列に一括変換 カレンダー
カレンダー(前月・次月へのリンク付) カレンダー(今年1月〜12月)
掲示板 掲示板(URL自動変換/連続改行・スペース削除)
掲示板(年齢・性別・都道府県選択) 画像アップロード掲示板
チャット Web日記
サイトマップ(ディレクトリ内のファイルを調べる) Webデータ取得(HTTPヘッダー, HTMLソース, use Socket)
Webデータ取得(HTTPヘッダー, HTMLソース, use HTTP::Request::Common) トラックバック受信
トラックバック送信 メール送信(メールフォーム, sendmail)
リバーシ(ボードゲーム) .htaccessユーザー認証用ユーザーファイル作成
リダイレクト 条件指定リダイレクト
言語振り分けリダイレクト 条件指定アクセス拒否(ステータスコードを返す)
HTMLファイル読み込み・表示 HTMLファイル読み込み・パスワード認証
HTMLファイル読み込み・条件指定アクセス拒否 HTMLファイル読み込み・条件指定リダイレクト
外部CGIファイル読み込み(require) 画像ファイル読み込み・表示
画像縮小・拡大・サイズ変更(Image::Magick, Resize) 画像切り出し(Image::Magick, Crop)
画像文字埋め込み(Image::Magick, Annotate) 画像合成(Image::Magick, Composite)
画像生成・保存(Image::Magick->new) 画像合成アクセスカウンター
かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】