« 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:
https://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1862