ReadWords.cgi

出典: YKAwiki

概要

MySQL サーバーにアクセスし、テーブルからタイピングゲーム用の単語情報を読み込むプログラム。使用する言語は Ruby。

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

この CGI は Flash からは何も変数を受け取らない。(注:たぶん Flash のメソッドは勝手にプロパティを送るけど、この CGI では利用しない。) 呼び出されたらデータベースにアクセスし、登録されている単語名、説明文、画像へのパスを Flash に渡す。


(stub) ActionScript のメソッド LoadVars.sendAndLoad() がちゃんと値を受け取ってくれるかな・・

今の CGI では while 文の中で配列に代入して一項目ずつブラウザに表示させてるけど、 Flash に( GET の応答として)送る時は一行の文字列に直さないといけない予感。

puts word1:'hoge'\nnote1:'piyo'\nimage1:....

みたいな風に直さないとダメだろうな。

Ruby ソース

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

データベースに登録されてる単語の数だけ while 文で繰り返し単語情報を読み取って配列に代入、出力。

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

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

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

ブラウザでの表示のための行。Flash に単語情報を渡す場合は不要だが、デバッグ用に記述。

require "mysql"

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

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

MySQLサーバー にログインID、パスワードを使ってログインし、データベースに接続する。Mysql クラスオブジェクトが返される(http://tmtm.org/mysql/ruby/を参照)

res_word = msql.query("SELECT * FROM words")

クエリを実行。Result クラスオブジェクトが返される。

puts '<html><head><title>readWords</title></head><body bgcolor="#FFFFFF">'
puts 'データベースには現在、'
puts res_word.num_rows()
puts ' 個の項目が登録されています。</br>'
puts '</br>'

res_word.num_rows()は、データベースの行数を返す。この場合登録されている単語の数。

word = Array.new(res_word.num_rows())
note = Array.new(res_word.num_rows())
image = Array.new(res_word.num_rows())

データベースから取得した文字列を保存するための配列を定義。

i = 0
while i < res_word.num_rows()

このループの中で、データベースから一行ずつ登録されている値(単語名、説明文、画像へのパス)を保存する。

	puts i
	puts ' 番目 : '
	res =  res_word.fetch_row()

res_word.fetch_row() は検索結果の1行を返し、次に呼ばれた時は次の行を返す。戻り値は項目値の配列。

	word[i] = res[0]
	note[i] = res[1]
	image[i] = res[2]

res_word.fetch_row()の返り値の配列を代入。

	puts ' </br>'
	puts ' 単語名 : '
	puts word[i]
	puts ' </br>'
	puts ' 説明 : '
	puts note[i]
	puts ' </br>'
	puts ' 参照画像へのパス : '
	puts image[i]
	puts ' </br>'

	puts '</br>'
	i += 1
end

puts '</body></html>'

この辺はブラウザでの確認用。 Flash に渡す時は GET メソッドへの応答っぽく書き換えなければならない。

(stub)ブラウザでデータベースの一覧が取得、表示できることは確認。最後の方の puts は Flash 側も少し作ってから書き換える。 それにしても puts の羅列がマヌケだ。

以下ソース

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

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

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

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

# クエリを実行。
# Result クラスオブジェクトが返される。
res_word = msql.query("SELECT * FROM words")

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

puts 'データベースには現在、'
puts res_word.num_rows()
puts ' 個の項目が登録されています。</br>'
puts '</br>'

i = 0
word = Array.new(res_word.num_rows())
note = Array.new(res_word.num_rows())
image = Array.new(res_word.num_rows())

while i < res_word.num_rows()
	puts i
	puts ' 番目 : '
	
	# res_word.fetch_row()
	# 検索結果の1行を返し、次に呼ばれた時は次の行を返す。
	# 戻り値は項目値の配列。
	res =  res_word.fetch_row()

	word[i] = res[0]
	note[i] = res[1]
	image[i] = res[2]
	
	puts ' </br>'
	puts ' 単語名 : '
	puts word[i]
	puts ' </br>'
	puts ' 説明 : '
	puts note[i]
	puts ' </br>'
	puts ' 参照画像へのパス : '
	puts image[i]
	puts ' </br>'

	puts '</br>'
	i += 1
end
 
puts '</body></html>'