CGI スクリプトによる結果表示

前回の cgi_ticket.rb において CGI スクリプトの結果表示をした結果は、 このようなものであった。


<html>
<head>
<title>オンライン券売機</title>
</head>
<body>
<h1>
到着駅: 鶴岡駅
</h1>
<p> 
マイレージカード会員募集中
</p>
</body>
</html>

firefox で Ctrl-u すると、 HTML 文書の構造を見ることができた。

選択した文字列の部分に注目しよう。 このとってきた文字列を判断する部分をプログラム部分で作り、 Ruby 変数に CGI 変数で代入した値を if 文判断し、表示させる文章を変更できる。

結果を分岐させるには

cgi_ticket.html を cgi_tour.html にコピーし、 ツアー情報を知らせるホームページに 変更 する。 起動するプログラム名を cgi_tour.rb と変更する。 次に起動するプログラムをもとのプログラム cgi_tour.rb から少し変える。 cgi_tour.rbcgi_tour.rb にコピーしたあと cgi_tour.rb を開く。

結果を変更する。正規表現で、文字列を発見させる。 文字列に応じて結果を変更する。


 
  :
<form method="POST" action="./cgi_tour.rb">
  :
printf("<h1>%s駅ツアー情報</h1>\n", arv)

printf("<p>\n")
if /酒田/e =~ arv
  print("飛島めぐりご案内中\n")
elsif /鶴岡/e =~ arv
  print("藤沢周平ツアー開催中\n")
else print("日帰りツアーの予定はありません\n")
end
printf("</p>\n")
  :

実行してみよう。ファイルのソースは ここ

エラーの分析

自分のプログラムがうまく起動しないとき、roy に入って、 エラーログを調べなければならなかった。roy に入るには、ssh を使う。


% ssh roy
c101XXX@roy's password: 

と表示されるので、user ID のパスワードを入力。

% less /usr/local/apache/logs/error_log

とする。less コマンドは q で終了であった。


      :
[Fri Jan 17 17:08:05 2003] [error] (17)File exists: proxy: error linking cache f
ile /usr/local/apache_1.3.27/proxy/tmp26994b to /usr/local/apache_1.3.27/proxy/7
/_/8/ZWWFymDDPsIkBMR0txA
[Fri Jan 17 17:08:08 2003] [error] (17)File exists: proxy: error linking cache f
/ユーザ ID

自分のユーザ ID を探すため、/ を押して、ユーザ ID を入力。

/ を押し続け、もっとも最近のエラーメッセージの英語を読むことにより 自分のプログラムの間違いを知ることができる。終了は q。

ラジオボタンの作り方

ラジオボタンとは、1 つだけ選ぶ方法である。 自由席、指定席またはスーパーシートを選ぼう。 cgi_seat.html を作ろう。動いたあとのプログラムは、 cgi_seat.rb としよう。

cgi_seat.rb, cgi_seat.html を cgi_ticket.rb, cgi_ticket.html からそれぞれ複製し、適当に書き変えよう。rb プログラムは実行可能であるか 調べること。


 :
<p>座席の種類別</p>
<form method="POST" action="./cgi_seat.rb">
<p>
<input type="radio" name="seat" value="自由席">自由席
<input type="radio" name="seat" value="指定席" checked>指定席
<input type="radio" name="seat" value="スーパーシート">スーパーシート
</p>
<p>
<input type="submit" value="OK">
<input type="reset" value="reset">
</p>
</form>
 :
##   type="radio"              # ラジオボタン
##   name="ラジオボタンの名前" # 使うラジオボタンを区別するため
##   value="CGI 変数の値"      # ユーザが選ぶとこの値がプログラムに送られる

input tag に checked と入れると、自動的に既定値に設定できる。

見えかたは下のようになる。

radio button

動作は、 このようになるはずである。

チェックボックスの作り方

check box とは、いくつか選べる方法である。 旅行のオプションを選んでみよう。 cgi_opt.html を作ろう。動いたあとのプログラムは、 cgi_opt.rb としよう。


 :
<p>
<input type="checkbox" name="fish" value="魚">新鮮魚介カルパッチョ
<input type="checkbox" name="pork" value="豚"checked>高級ソーセージ盛り合わせ
<input type="checkbox" name="beef" value="牛">最高級牛肉ステーキサラダ
</p>
 :

##   type="checkbox"                  # チェックボックス
##   name="チェックボックスの名前"    # 使うチェックボックスを区別するため
##   value="CGI 変数の値"             # ユーザが選ぶとこの値がプログラムに送られる

プログラムの中身 はこのようになる。

checkbox

結果画面このように なる。

短い記入欄の作り方

テキストフィールドとは、名前など、 比較的短い情報を入力する部分のことである。cgi_tel.rb, cgi_tel.html で動作を確認しよう。


 :
氏: <input type="text" name="surname" maxlength="20" > 
名: <input type="text" name="givenname" maxlength="20" >
<br>
電話番号: <input type="text" name="area" maxlength="10" >
- <input type="text" name="former" maxlength="10" >
- <input type="text" name="latter" maxlength="10" >
 :

maxlength は半角文字で指定する。 その分だけ入力を可能とする。

textfield

動作の確かめプログラムソース

テキストエリアの作り方

自由記述欄を作る。


<p>ご要望、質問等: </p>
<p><textarea name="comment" rows="5" cols="40">
</textarea></p>

rows は行数を cols は文字数を指定する。 textarea 内に文字を入れておくと、初期値となって CGI 変数に代入される。 この例では半角文字分 5 * 40 = 200 文字すなわち 100 文字入力可能である。 見かけは このようになる。 値を受け取って吐きだすプログラム cgi_req.rbこちら

このままでは記録しないので、 今回はまず File Open を使ってファイルの自動書き込みのしくみを学ぼう。

File Open を使ってみよう

cgi_req.rb を少し変更して、感想をファイルにしまうことにしよう。 書き込むのは作者ではなく、ユーザなので、ユーザがアクセスし、 書き込みできる directory を作る。

% cd ~/public_html/rubycgi
% mkdir mydb
% chmod o+w mydb
% cd mydb
% touch comment.txt
% chmod o+w comment.txt

cgi_req.html, cgi_req.rb から cgi_rec.html と cgi_rec.rb を作り、 mydb の下に移動しておく。(request から record へ)。 CGI 入力を促すプログラム (このテキストの例では書き込み許可を出さないので、 各自指示にしたがって作成する)。 入力を促すプログラムを cgi_rec.html とし、 cgi_rec.rb を動かすように指示しておく。 動かすプログラム cgi_rec.rb では comment.txt に書き込むようにしておく。 これら 3 つのファイルを全てmydb 以下に置くと簡易である。 入っているデータの例

comment.txtユーザが書き込む。 chmod o+w で、他者がアクセスすることがようになる。

ファイルの書き込みができるようにしたバージョン cgi_rec.rb

このプログラムでは氏名や感想が未入力でも表示されてしまうのが欠点である。 アンケートなどで記録を取るとき、 未入力データは処理をしないような仕組みが必要であるかもしれない。

未入力欄があっても 動いてしまわないよう処理するにはどうしたらよいだろうか。

名前ひとつにあたり連絡先番号が 1 つ

会員制の場合、電話番号の変更を行ったときに、 2 つ電話番号が表れるのを防ぎたい。このときには、 Hash を使っておくとよいだろう。

CGI 入力を促すプログラム cgi_ident.html とし、cgi_ident.rb を動かすように指示しておく。 名前と電話番号を関連づけさせたバージョ ン cgi_ident.rbデータ例

このプログラムで書き込みできないようにしてあるので、 各自指示に従って作成し、以下の動作を確かめること。

同じ名前で電話番号を 2 回登録させ、ファイルの中身と、 出力結果がどのようになっているか、調べよ。

生成するデータ(phone.txt) は機械が書き込むので、 chmod o+w ファイル名 を忘れないこと。

データの入出力

基本の部分が学んだことのみでできあがっていることがわかるだろうか。

ドロップダウンメニュー、ラジオボタン、自由記述欄はそのまま表示される。 チェックボックスメニューは、対応したそれぞれの変数を用意する必要がある。 ここでは、配列を使ったが、配列でなくてもよい。

ファイルの書き出し