重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【6/2終了】教えて!gooアプリ版

CGI超初心者です。

HTMLファイルにいくつかラジオボタンを設置し、
これとこれを選んだらこのページを開く、
次のページで、
これとこれを選んだらこのページを開く・・・
というような構成でサイトを作っています。
CGIで条件分岐させていますが
書き方が良く分からないので教えてください。

第一ページ用の条件分岐CGIの下に、第二ページ用の条件分岐CGIを書きましたが
うまく動いてくれません。
どちらかを削除するとうまく動きます。
ひとつのCGIファイルに、
複数のページの条件分岐をまとめて書くことは出来ないのでしょうか?
ページごとに別々のCGIファイルを作成しなければならないですか?

以下具体例です。

---第一ページ.html---
<form name="q1" action="test.cgi" method="POST" >
・・・
<input type="submit" value="送信する" />
</form>

---第二ページ.html---
<form name="q2" action="test.cgi" method="POST" >
・・・
<input type="submit" value="送信する" />
</form>

---CGI---
#====================下準備======================

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
} else {
$str = $ENV{'QUERY_STRING'};
}

foreach $i (split('&', $str)) {
$i =~ tr/+/ /;
$i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
($t1, $t2) = split('=', $i);
$FORM{"$t1"} = $t2;
}


#===================変数の設定===================

$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";
}


#===================変数の設定===================

$q21 = $FORM{'q21'};
$q22 = $FORM{'q22'};

#=================条件分岐_質問2==================

if ($q21 eq "q21_a") {
print "Location: ./co3.html\n\n";
}

elsif ($q22 eq "q22_a") {
print "Location: ./ba4.html\n\n";
}



else {
print "Location: ./go3.html\n\n";
}

A 回答 (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}のような感じで) とか、テンプレートエンジン使ったらとか思うところはありますが。
まあ、そういうのは別途いろんな人のプログラムを読んで勉強してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました!
いただいたコードをもとに作り直したらうまく動きました!

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

ありがとうございました!

お礼日時:2013/08/05 10:42

ひとつの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共通部分
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/08/05 09:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!