WriteWord.cgi

出典: YKAwiki

概要

Flash で入力された単語情報が渡された後、MySQL サーバにアクセスし、単語を登録するためのプログラム。使用する言語は Ruby。

MySQL の Ruby 用 API を提供する拡張ライブラリ MySQL/Ruby を利用する。

この CGI は Flash から単語名、説明文、アップロードされた画像へのパスを変数として受け取り、データベースに登録する。

変数が適当な値を持つかどうかの判断は、サーバへのアクセスによるオーバヘッドを避けるため、 Flash 側で行う。

Flash が変数が適当かどうかを判断する項目は writeWord_mc について に記述した。説明のため、以下にもう一度書いておくと

  1. 単語は適切な長さか(1文字以上21文字以下)、既に登録されていないか(登録されている全ての単語名をクライアントに送る必要がある。)
  2. 説明文は適切な長さか(1文字以下または画面上に表示できない文章は受け付けず、説明文の再入力を促す)
  3. 画像を添付するか(任意)添付する場合はパスを示す文字列が適切か

である。

Ruby ソース

ソースを説明する。説明無しは一番最後に。

渡された値のチェックは行わない。

この項ではコメントを省いたので10数行しかない・・。

#!/usr/local/bin/ruby -Ku

コマンドラインオプション -K で文字コード UTF-8 を指定。

print "Content-type: text/html\n\n"

ブラウザでの表示のための行。デバッグ用。

require "cgi"

CGI プログラムの支援ライブラリの使用

require "mysql"

MySQL データベースの利用のための拡張ライブラリ(MySQL-Ruby)の使用

form = CGI.new

CGI クラスのインスタンス化

f_word = form['word']
f_note = form['note']
f_image = form['image']

フォームフィールドの値 (word, note, image) を得る image は NULL が渡される場合もある

msql = Mysql.new('MySQL_SERVER','LOGIN_ID','PASSWORD','DATABASE')

Mysql クラスのインスタンス化。Mysql は MySQL を操作するためのクラス。 MySQL サーバ MySQL_SERVER に LOGIN_ID と PASSWORD を使ってログインし、DATABASE に接続する。 Mysql クラスオブジェクトを返す。

is_add_word = msql.query(
"INSERT INTO words(word, note,image)
 VALUES ('#{msql.quote(f_word)}', '#{msql.quote(f_note)}', '#{msql.quote (f_image)}')")
(実際は1行であることに注意)

クエリを実行。入力された文字列(word, note, image)をクオートし、データベースに追加。

Ruby では文字列中で変数を展開したい場合 #{hoge} のように行う。

既に登録されている単語名をデータベースに渡した場合、上書きはされないがエラーも返らないので、 登録されているかどうかは Flash 側でチェックする。

返り値は{ 成功:nil 失敗:返らない }

以降はブラウザでのデバッグ用のコード。Flash に渡すのは成功したことを示すフラグ変数だけで十分。

if is_add_word == nil then
	res_word = "成功:" + f_word + " をデータベース YKAwords_db に追加しました。"
else
	res_word = "失敗:" + f_word + " をデータベース YKAwords_db に追加できませんでした。"
end
puts '<html><head><title>add</title></head><body bgcolor="#FFFFFF">'
puts res_word
puts '</body></html>'

(stub)ブラウザでデータベースに書き込めることは確認。最後の方の puts は Flash 側も少し作ってから書き換える。

以下ソース

#!/usr/local/bin/ruby -Ku

##############################################################
# add.cgi 2006/03/06                                         #
# Takeuchi Takaaki ( taka@ja2yka.homeip.net )                #
# 渡された変数 word, note, image をデータベースに追加する。  #
##############################################################

print "Content-type: text/html\n\n"

require "cgi"		# CGI プログラムの支援ライブラリの使用
require "mysql"		# MySQL データベースの利用のための拡張ライブラリ(MySQL-Ruby)の使用

form = CGI.new

# フォームフィールドの値 (word, note, image) を得る
f_word = form['word']
f_note = form['note']
f_image = form['image'] # image は NULL が渡される場合もある

# YKAwords_db に接続し、Mysql クラスオブジェクトを返す
msql = Mysql.new('MySQL_SERVER','LOGIN_ID','PASSWORD','DATABASE')

# クエリを実行。入力された文字列(word, note, image)をデータベースに追加
# 既に登録されている単語名を渡した場合、上書きはされないがエラーも返らないので、
# 登録されているかどうかは Flash 側でチェックする。
# 返り値は{ 成功:nil 失敗:返らない } 

is_add_word = msql.query("INSERT INTO words(word, note,image) VALUES ('#{msql.quote(f_word)}', '#{msql.quote (f_note)}', '#{msql.quote(f_image)}')")

if is_add_word == nil then
	res_word = "成功:" + f_word + " をデータベース YKAwords_db に追加しました。"
else
	res_word = "失敗:" + f_word + " をデータベース YKAwords_db に追加できませんでした。"
end

puts '<html><head><title>add</title></head><body bgcolor="#FFFFFF">'
puts res_word
puts '</body></html>'