« Perl で埋め込み SQL を使って楽をする話 | メイン | C++ テンプレートで(いまさら)FizzBuzz »

2008年04月17日

Filter::SQL を使って掲示板を書いてみました

必要最小限、見た目無視です。動作確認は Filter::SQL 0.05 で行いました。

#! /usr/bin/perl

use strict;
use warnings;
use CGI qw/escapeHTML/;
use DBI;
use Filter::SQL;
use POSIX qw/strftime/;

# SQLite に接続
Filter::SQL->dbh(DBI->connect(
    'dbi:SQLite:dbname=/tmp/bbs.db',
)) or die DBI->errstr;

{ # テーブル作成 (既存の場合はエラーを無視して継続)
    local Filter::SQL->dbh->{PrintError};
    EXEC CREATE TABLE bbs (
        id INTEGER NOT NULL PRIMARY KEY,
        name NOT NULL,
        at NOT NULL,
        text NOT NULL
    );;
}

my $q = CGI->new;

# POST だったら入力を保存
if ($q->request_method eq 'POST') {
    print_html("エラー: 空文字列です\n")
        unless $q->param('name') && $q->param('text');
    unless (INSERT INTO bbs (name, at, text) VALUES
                ($q->param('name'), {time}, $q->param('text'));) {
        print_html("登録に失敗しました\n");
    }
}

# 一覧を出力
my $html = <<'EOT';
<form method="POST">
Name: <input name="name"><br>
Text: <textarea name="text" cols="40" rows="10"></textarea><br>
<input type="submit" value="送信">
</form>
EOT
foreach my $row (SELECT name,at,text FROM bbs ORDER BY id DESC;) {
    $html .= sprintf(
        "<hr>\n%s (%s)<br>%s\n",
        escapeHTML($row->[0]),
        escapeHTML(strftime '%Y/%m/%d %H:%M:%S', localtime($row->[1])),
        escapeHTML($row->[2]),
    );
}
print_html($html);

sub print_html {
    my $str = shift;
    print "Content-Type: text/html; charset=utf-8\n\n$str";
    exit 0;
}

投稿者 kazuho : 2008年04月17日 16:43 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1862