

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で質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGIでテキストボックスの内容に...
-
掲示板(kentさんの所のsunbbs...
-
サーバー上のPDFにCGIでパスワ...
-
POST送信
-
sendmail 送信先を複数設定す...
-
sendmailで送信すると、迷惑メ...
-
CGI によるファイルのアップロード
-
SUN BBSの改造方法
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
WEBページを強制的に横画面で見...
-
perlを難読化、暗号化させたい
-
ラジオボタンを選択済みにする...
-
select値をhiddenのvalueに渡し...
-
FORMのselectの選択肢を最初か...
-
ブックマークからのアクセスを...
-
onMouseoverで下線表示したい(...
-
CGIでラジオボタンの選択結果を...
-
プログラミングについての質問...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
掲示板(kentさんの所のsunbbs...
-
htmlからパラメータで、cgiに渡...
-
CGI内でけいたいスマホの振り分け
-
4年に1回+6,62以上は1の位を...
-
CGIプログラム内でのHTML表記
-
ログファイルの編集についてお...
-
ひとつのCGIファイルに複数のペ...
-
(CGI)お気に入り登録やアドレス...
-
CGI によるファイルのアップロード
-
TOK2で基礎的なCGIをUPしたが動...
-
【perl/cgi】文字列を検索して...
-
変わるアドレスにリンクする方法
-
サーバー上のPDFにCGIでパスワ...
-
クオートの多重入れ子をするには?
-
CGIでテキストボックスの内容に...
-
sendmail 送信先を複数設定す...
-
cgiについて教えて下さい。
-
掲示板 imgboard のcgi改造方法
-
CGI経由でのPDFファイルをダウ...
-
cgi(perl) sendmailの使い方
おすすめ情報