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>'
