

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";
}
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}のような感じで) とか、テンプレートエンジン使ったらとか思うところはありますが。
まあ、そういうのは別途いろんな人のプログラムを読んで勉強してみてください。
ありがとうございました!
いただいたコードをもとに作り直したらうまく動きました!
私もiとか使ってもっとスマートに作りたいと思っているのですが・・・
はじめてのCGIなことと
条件分岐が(私にとっては)けっこう複雑なことと
急ぎ依頼をされていることもあり
とりあえず不細工ではありますが動くものを・・・
と思い作ってみます。
出来上がってから、もっと研究してもっとスリムなものに
順次作り替えていきたいと思っています。
ありがとうございました!
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共通部分
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで集計したい。
-
ChatGPTの性能は昔に比べて上が...
-
ChatGPT
-
chatGPTみたいに画像生成出来る...
-
フォームを再送信しますか?
-
cgiファイルで構成された検索結...
-
iDeCo
-
皆さんはGUCCIはハイブランドだ...
-
cgi-binのエラー?
-
Trees掲示板CGI(CGI-Resque氏...
-
めちゃきれい
-
number 改行が追加できない
-
生成AI画像について
-
3DCG
-
ホームページにメールフォーム...
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
-
ホームページにCGIを設置したの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
掲示板(kentさんの所のsunbbs...
-
ダブルクオテーションは使うべ...
-
CGIがうまく作動せず困っていま...
-
Perlでメール送信機能
-
ezwebにおける POSTメソッドで...
-
htmlからパラメータで、cgiに渡...
-
希望した番号に更新マークを表...
-
CGIでテキストボックスの内容に...
-
cgi+htmlテンプレート使用
-
テキストファイルを読んで次のc...
-
sendmailで送信すると、迷惑メ...
-
レンタルサーバーでperlのcgiフ...
-
PC・携帯等のアクセス時の自動...
-
substrで数値を抽出してのマッ...
-
sendmail 送信先を複数設定す...
-
パスワード認証のCGI
-
【perl/cgi】文字列を検索して...
-
Spreadsheet::WriteExcelについ...
-
CSVを読み込んでメニューを作成...
-
サーバー上のPDFにCGIでパスワ...
おすすめ情報