Created
February 7, 2013 15:32
-
-
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')));
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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