Skip to content

Instantly share code, notes, and snippets.

@nichesan
Created February 7, 2013 15:32
Show Gist options
  • Save nichesan/4731662 to your computer and use it in GitHub Desktop.
Save nichesan/4731662 to your computer and use it in GitHub Desktop.
RubyとSQLiteを使った掲示板。 タイトルが bbs.rb と表示されていますが、実際は bbs.cgi という名前で動かしました。 メインの表示部分は114行目から。 テーブルの構成は以下の通り。 (id integer PRIMARY KEY AUTOINCREMENT, name text DEFAULT 'No Name', title text DEFAULT 'No Title', message text NOT NULL, date TIMESTAMP DEFAULT (DATETIME('now','localtime')));
require 'sqlite3'
require 'cgi'
cgi = CGI.new
#フォームから受け取った値を変数に入れる
vname = cgi["name"]
vtitle = cgi["title"]
vmessage = cgi["message"]
#URLクエリのページ値
pageQ = cgi["page"]
# 1ページあたりの最大表示数
$display_Rimit = 10
# 表示するページ番号のスタート
$num = 1
#===================================================
# 関数: 入力フォーム
#===================================================
def input_form()
print "<h2>入力フォーム</h2>\n"
print "<form action='bbs.cgi' method='POST'>\n"
print "<table>\n"
print "<tr>\n"
print "<th>名前:</th>\n"
print "<td><input type='text' name='name' /></td>\n"
print "</tr>\n"
print "<tr>\n"
print "<th>タイトル:</th>\n"
print "<td><input type='text' name='title' /></td>\n"
print "</tr>\n"
print "<tr>\n"
print "<th>メッセージ:</th>\n"
print "<td><textarea name='message'></textarea></td>\n"
print "</tr>\n"
print "</table>\n"
print "<input class='button' type='submit' name='submit' value='送信' />\n"
print "</form>\n"
end
#===================================================
# 関数: ページリンクの表示
#===================================================
def page_display(page_now, pageNum, num)
print "<div class='page'><p>表示ページ: "
# 1~最大ページまでループ
while num <= pageNum do
# 現在開いているページのページ番号を表示(リンクなし)
if num == page_now
print "[ #{num} ]\n"
# その他のページをリンク付きで表示
else
print "[<a href='./bbs.cgi?page=#{num}'> #{num} </a>]\n"
end
num += 1
end
print "</p></div>\n"
end
#===================================================
# 関数: メッセージの表示
#===================================================
def database_display(display_start, display_Rimit)
print "<h2>表示画面</h2>\n"
db = SQLite3::Database.new("~.db")
# DBから表示する行を取得(DESCにすることで最新の書き込みから表示)
db.execute("SELECT * FROM bbs_tb ORDER BY id DESC LIMIT ? OFFSET ?;", display_Rimit, display_start) do |row|
#DBの中身を以下の変数に代入
iddb = row[0].to_i
namedb = row[1]
titledb = row[2]
messagedb = row[3]
datedb = row[4]
print "<div>\n"
# 投稿内容の表示(info)
print "<h3>[ #{iddb} ] "
print "<em class='title'> #{titledb} </em> "
print "投稿者: <em class='name'> #{namedb} </em> "
print "投稿日: #{datedb} <br /></h3>\n"
#投稿内容の表示(message)
print "<p class = 'message'> #{messagedb} </p><hr>\n"
print "</div>\n"
end
end
#===================================================
# フォームが埋まってる場合(書き込み)
#===================================================
#messageが埋まっている場合の処理.フォームの記入具合で場合分け. DBに書き込み.
if vname != '' && vtitle != '' && vmessage != '' then
db = SQLite3::Database.new("~.db")
db.execute("INSERT INTO bbs_tb (name, title, message) VALUES (?, ?, ?);", vname, vtitle, vmessage)
print "Location: ~/bbs.cgi\n\n"
elsif vname == '' && vtitle != '' && vmessage != '' then
db = SQLite3::Database.new("~.db")
db.execute("INSERT INTO bbs_tb (title, message) VALUES (?, ?);", vtitle, vmessage)
print "Location: ~/bbs.cgi\n\n"
elsif vname != '' && vtitle == '' && vmessage != '' then
db = SQLite3::Database.new("~.db")
db.execute("INSERT INTO bbs_tb (name, message) VALUES (?, ?);", vname, vmessage)
print "Location: ~bbs.cgi\n\n"
elsif vname == '' && vtitle == '' && vmessage != '' then
db = SQLite3::Database.new("~.db")
db.execute("INSERT INTO bbs_tb (message) VALUES (?);",vmessage)
print "Location: ~/bbs.cgi\n\n"
#===================================================
# メッセージ埋まっていない場合(表示ここから)
#===================================================
else
print "Content-type: text/html\n\n"
print "<html>\n"
print "<head>\n"
print "<title>BBS</title>\n"
print "<link href = 'design.css' rel = 'stylesheet' type = 'text/css' />\n"
print "</head>\n"
print "<body>\n"
print "<h1>BBS</h1>\n"
#入力フォームを表示
input_form()
db = SQLite3::Database.new("~.db")
#DBに格納されている行数をカウントして,1ページあたりの最大表示件数(10)で割る
rawofDB = (db.execute("SELECT COUNT(*) FROM bbs_tb;"))[0][0].to_i
pageNum = rawofDB / $display_Rimit
#割り切れていなければ,余りのメッセージを表示するために1ページ追加
if rawofDB % $display_Rimit != 0 then
pageNum += 1
end
# URLクエリのページ数から,現在開いているページ数を把握
page_now = pageQ.to_i
# クエリがないor値が0の場合,現在開いているページを1ページ目とする.
if page_now == '' || page_now == 0 then
page_now = 1
end
# 各ページへのリンクを表示
page_display(page_now, pageNum, $num)
# 何番目の書き込みから表示し始めるか
display_start = (page_now - 1) * $display_Rimit
# 表示(display_start番目の書き込みから,$display_Rimit件表示する)
database_display(display_start, $display_Rimit)
print "</body>\n"
print "</html>\n"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment