情報アプリケーション1 2006 年 10 月 12 日 第四回資料 担当 重定 如彦
目次 データの送信とフォーム クイズ CGI 複数のパーツのデータの分割方法 配列変数
データの送信とフォーム 掲示板のように、ユーザの入力した内容を使って処理 を行うような CGI を作成するためには、フォームを使用 する フォームは HTML 文章内に、以下のような方法で記述す る この中にフォームのパーツを記述する 上記のフォームで表示された送信ボタンをクリックす ると、 FORM タグの action 属性で記述された cgi に、 フォームに 入力された内容が伝えられ、 cgi が実行される CGI の場合、一般に method の部分は POST と記述する
フォームの HTML 送信メッセー ジ フォームを POST メソッドで送った場合、以下のような データがウェブサーバに送られる。また、送られるデータは フォームのパーツの名前=パーツのデータ という形式で送られる POST ・・・・・・ ・・・・・ ・・・・ 送られるデータ ・・・・・ 通常の HTML 送信メッセージ この部分はヘッダと呼ばれる なお、 1 行目は POST となる フォームの内容が記されたデータ この部分はボディと呼ばれる ヘッダとボディの境界を表す空白行
フォームのパーツの種類(1) テキストボックス 文字を入力するためのテキストボックス。 CGI 用のフォームの場合、 name 属性で名前を設定する必要がある。フォームが送られると、 CGI に 名前 = テキストボックスの中身 というデータが送られる。また、 value 属性を 記述することで、初期値を設定可能。なお、テキストボックスに日本語を入 力 した場合の処理方法については次回解説予定 実行ボタン 実行ボタンをクリックすると FORM タグの action 属性に記述された URL が 呼び出される。 value 属性でボタンに表示する文字を設定可能 取り消しボタン これによって表示されるボタンをクリックするとそのフォームの内容が すべてリセットされる。 value 属性でボタンに表示する文字を設定可能
フォームのパーツの種類(2) チェックボックス チェックボックスがチェックされている状態で実行ボタンがクリッ クされて フォームが送られると、 CGI に 名前 =on というデータが送られる また、チェックされていないボタンについてのデータは送られない ラジオボタン チェックボックスと似ているが、複数のラジオボタンを記述し、 name 属性の値を同じものに設定しておくと、それらのラジオボタン の 中で同時に一つのボタンしか ON にならないようになる フォームが送られると、 CGI に 名前 = データ というデータが送ら れる テキストエリア 初期文章 複数行入力可能なフォームが作成される テキストエリアタグの開始タグと終了の間に文章を記述することで、 最初にテキストエリア内に表示する文章を設定可能 CGI へのデータの送られ方はテキストボックスとほぼ同じ
フォームへのデータの転送例 (1) フォームが記述された HTML 文章の作成 まず、メモ帳に以下の HTML をデスクトップに form.html という名前で ファイルに保存し、ffftpを使ってウェブサーバにアップロード すること。 フォーム
フォームへのデータの転送例 (2) フォームが転送したデータを表示する CGI の作 成 メモ帳を新しく開き、以下の CGI をデスクトップに form.cgi という名前 で 保存し、 ffftp を使ってウェブサーバにアップロードし、属性を変更する こと。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print " 送られたデータは、「 $qstring 」です \n"; 解説: ① $ENV{‘CONTENT_LENGTH’} という変数の中にフォームの データのサイズが格納されているので、それを $clength という変数に代入 する ② read という関数を使ってフォームのデータを必要なサイズ( $clength バイ ト)だけ 読み込んで、 $qstring という変数に代入する ① ②
フォームへのデータの転送例 (3) 複数の種類のフォームパーツがある場合 G:\www の form.html をメモ帳で開き、以下の赤い部分を追加し保存 せよ チェックボックス1 チェックボックス2 ラジオボタン1 ラジオボタン2 複数のフォームのパーツがある場合、それぞれのパーツのデータは 例えば以下のように & 記号で区切って送られる textbox=test&cbox1=on&rbox=2
クイズ CGI (1) フォームが記述された HTML 文章の作成 まず、メモ帳に以下の HTML をデスクトップに quiz.html という名前で ファイルに保存し、ffftpを使ってウェブサーバにアップロードすること クイズ ボアソナードタワーの最上階は何階? 25階 26階 27階
クイズ CGI (2) 答えあわせを行う CGI の作成 メモ帳を新しく開き、以下の CGI をデスクトップに quiz.cgi という名前で 保存し、 ffftp を使ってウェブサーバにアップロードし、属性を変更すること。 #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $clength = $ENV{'CONTENT_LENGTH'}; read(STDIN, $qstring, $clength); print "$qstring \n"; if ($qstring eq "answer=27") { print " 正解です。 \n"; } else { print " 不正解です。 \n"; } 解説: 送られたデータを調べることで、 正解かどうかをチェックしている 余裕があれば HTML で答えを表示 するようにプログラムを改造すること
複数のパーツのデータの分割方法 form.cgi のように複数のパーツがある場合、 textbox=abc&cbox1=on&rbox=2 フォームのパーツのデータは上記のように 1 行にまとめて送られる それぞれのパーツのデータは & 記号で区切られている Perl では、 split という関数を使うことで文字列を特定の文字で 分割することができる。 split は以下のように記述する split ( / 分割する文字 /, 分割する文字列) ; 例えば split ( /&/, “textbox=abc&cbox1=on&rbox=2” ) ; 上記のプログラムが実行されると、 2 つ目の引数の文字列が 「 textbox=abc 」、「 cbox1=on 」、「 rbox=2 」の3つに分割される
配列変数(1) Perl では split によって分割された文字列データを配列変数 と 呼ばれる種類の変数に格納することができる 配列変数の特徴は以下の通り 変数名の前に $ ではなく @ 記号を付ける 配列変数の中には複数のデータを格納することができる split によって分割されたデータを配列変数に格納するには、 以下のように = = split ( /&/, “textbox=abc&cbox1=on&rbox=2” ) ;
= split ( /&/, “textbox=abc&cbox1=on&rbox=2” ) ; と記述することで、という配列変数に「 textbox=abc 」、 「 cbox1=on 」、「 rbox=2 」の3つの文字列が保存される。 cbox1=on rbox=2