• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ひとつのCGIファイルに複数のページの動作を管理)

複数ページの動作を管理する方法

このQ&Aのポイント
  • HTMLファイルにラジオボタンを設置し、選択に応じたページを開くサイトを作成しています。CGIで条件分岐させる方法を教えてください。
  • 複数のページの条件分岐をまとめて書くことはできますか?ページごとに別々のCGIファイルを作成する必要がありますか?
  • CGIファイルには複数のページの条件分岐をまとめて書くことはできません。ページごとに別々のCGIファイルを作成する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> ひとつのCGIファイルに、 > 複数のページの条件分岐をまとめて書くことは出来ないのでしょうか? できますよ。 > ページごとに別々のCGIファイルを作成しなければならないですか? その必要はありません。 現状のプログラムをざっと見ましたが、これじゃずっとgo2.htmlにしか行かないですよね。 > ・ > else { > print "Location: ./go2.html\n\n"; > } 多かれ少なかれこのelseに引っかかると思うので。 この方式で行くとしたら、自分だったら今どの質問にいるかをフォームで送りますね。 <input type="hidden" name="stage" value="1" />のような感じで今どこの質問にいるのかを送ってもらい、それぞれの問いへ振り分けるための条件分岐を作るでしょうね。 if ($stage == 1) { # q1のための処理 #===================変数の設定=================== $q11 = $FORM{'q11'}; $q12 = $FORM{'q12'}; #=================条件分岐_質問1================= if ($q11 eq "q11_a") { print "Location: ./ba1.html\n\n"; } elsif ($q11 eq "q11_c") { print "Location: ./ba2.html\n\n"; } ・ ・ ・ else { print "Location: ./go2.html\n\n"; } } elsif ($stage == 2) { # q2のための処理 } elsif ($stage == 3) { ... } else { print "Location: ./unknown.html\n\n"; } 一応気になるところとしては、CGI.pmにパラメーターの解釈をさせたらどうかとか、いちいちq12などを手書きで取ってこずにfor文で回すなりすればどうかとか (例えば、$form{'q' . $stage . $idx}のような感じで) とか、テンプレートエンジン使ったらとか思うところはありますが。 まあ、そういうのは別途いろんな人のプログラムを読んで勉強してみてください。

masunona
質問者

お礼

ありがとうございました! いただいたコードをもとに作り直したらうまく動きました! 私もiとか使ってもっとスマートに作りたいと思っているのですが・・・ はじめてのCGIなことと 条件分岐が(私にとっては)けっこう複雑なことと 急ぎ依頼をされていることもあり とりあえず不細工ではありますが動くものを・・・ と思い作ってみます。 出来上がってから、もっと研究してもっとスリムなものに 順次作り替えていきたいと思っています。 ありがとうございました!

その他の回答 (1)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

ひとつのCGIで良いです。 ちゃんとフローチャートを書いてみましたか?  それなしで、いきなりなんて非効率です。 環境変数ENV{'HTTP_REFERER'} が、呼び出したページです。 >これとこれを選んだらこのページを開く、  なら、ラジオボタンではなくチェックボックスです。  コントロール名を同じにした場合は複数のデータが送られてくるので配列に格納する。  コントロール名を変えればスカラー変数でよい。 >これとこれを選んだらこのページを開く、  loactionではなく、直接そのファイルを読んで書き出すほうが良いでしょう。 open (IN,abc.txt) or &error(); &HTML_HEADER;# HTTP応答ヘッダなど &HTML_START; #HTML共通部分 while(<IN>){ print; } close IN; &HTML_END;#HTML共通部分

masunona
質問者

お礼

ありがとうございます! 色々と不勉強で申し訳ありません。 いただいたコードを参考に作り直します。 ありがとうございました!