• ベストアンサー
※ 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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CGIでhtmlページを表示する

    連日質問させていただいています。 CGI超初心者です。 htmlファイルにラジオボタンを設置し、 Aを選んだらhttp://www.a.html、 それ以外を選んだらhttp://www.b.html というサイトを開くような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; } $q1 = $FORM{'radio'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ 上記のようにすると、以下のように、ただ文字が表示されてしまいます。 Location: http://www.a.html #============================================ 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; } $q1 = $FORM{'radio'}; print "charset=Shift_JIS\n\n";←★ print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ ★部分が悪いのかなぁと思い、上記のように修正してみたり、 (Content-Type: text/html; を削除してみました) ★部分を全部削除してみると Internal Server Error となってしまいます。 よろしくお願いいたします!

    • ベストアンサー
    • CGI
  • 次のcgiファイルを開くには? もう一度

    http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • cgiログデータ入力

    下記のようなものを作成しました。 if ($FORM{'WORD'} eq 'フォーム'){ &form; } elsif($FORM{'WORD'} eq '確認'){ &kakunin; } elsif($FORM{'WORD'} eq '入力'){ &nyuuryoku; } sub kakunin{ print "<FORM METHOD=POST ACTION=top_nyuuryoku1.cgi>\n"; print "<TABLE CLASS=TABLE2 CELLSPACING=0 CELLPADDING=2>\n"; print "<TR><TD WIDTH=80 CLASS=TD1>社員番号</TD><TD CLASS=TD2>$FORM{'BANGOU'}<INPUT TYPE=HIDDEN NAME=BANGOU VALUE=$FORM{'BANGOU'}></TD></TR>\n"; print "<TR><TD WIDTH=80 VALIGN=TOP CLASS=TD1>本文</TD><TD CLASS=TD2>$FORM{'NAKAMI'}</TD><INPUT TYPE=HIDDEN NAME=NAKAMI VALUE=$FORM{'NAKAMI'}></TR>\n"; print "</TABLE>\n"; print "<BR>と入力されました。これでよければボタンを押してください。<BR><BR>\n"; print "<INPUT TYPE=HIDDEN NAME=WORD VALUE=入力>\n"; print "  <INPUT TYPE=SUBMIT CLASS=BUTTON VALUE=入力>\n"; print "</FORM>\n"; } sub nyuuryoku{ print "入力しました。<BR>\n"; print "<A HREF='top.cgi'>戻る</A>\n"; open (FILE,">>top.log"); flock(FILE,2); @FILES = "$buffer\n"; print FILE @FILES; flock(FILE,8); close(FILE); } ※多少省略あり。 ※$bufferはこれの前のページから受け取ったもの。 kakuninのところの$FORM{'NAKAMI'}ではちゃんと半角スペースや改行が認識されていますが、nyuuryokuになるとだめです。 一体何が原因なのでしょうか?

    • ベストアンサー
    • CGI
  • LWPによるページ取得の問題

    すいません、アホです。いろいろ調べましたが、まったくみつかりませんでした。この質問をすることは初歩すぎて失礼かとおもいますが、堪忍してくださいませ。 LWPで相互リンクをされているかどうかをCGIファイルの登録ページ後に判断したいプログラムですが、同じCGIファイル内に登録ページがありまして、<INPUT size=30 name=url>のように相手リンクを登録した自分のHTMLを書いてsubmitさせて、 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } で、取り出し、$FORM{'url'}まできます。URLがちゃんと$FORM{'url'}に入っているのは画面で確認できるのですが、下記のように指定した場合、相手HTMLを取得できません。エラーメッセージはでないで、真っ白い画面がでます。 $url = $FORM{'url'}; use LWP::Simple; $content = get("$url"); print "Content-type: text/html\n\n$content"; 下記はちゃんとうつります。 $url = 'http://www.yahoo.co.jp'; use LWP::Simple; $content = get("$url"); print "Content-type: text/html\n\n$content"; これは$FORM{'url'}のエンコードの問題なのでしょうか? まことに申し訳ありませんが、その方法をできれば具体的にお教えくださいませ。 何卒、宜しく御願いいたします。m_ _ m

  • CGIでリンクさせたページを同一のページ内の iframe に表示させるには

    CGIでリンクさせたページを同一のページ内の iframe に表示させるにはどうしたらいいでしょうか? ちなみにCGIは -------------------- #!/usr/bin/perl $querybuffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$querybuffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); if( $name eq "jumpto" ) { $jumpto = $value; # 移動先 } } if( $jumpto ne "-" ) { print "Location: $jumpto\n\n"; } else { print "Content-type: text/html\n\n"; print qq|<HTML>\n<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html ; charset=Shift_JIS">\n<TITLE>移動先が未指定です</TITLE></HEAD>\n|; print qq|<BODY><H1>移動先が選択されていません。</H1><P>移動先を選択してからボタンをクリックして下さい。</P></BODY>\n|; } exit; ------------------ です。 iframe部分は以下のようにしています。 <iframe src="index.html" height=200 width=460> この部分は iframe 対応のブラウザで見てください。 </iframe>

    • ベストアンサー
    • CGI
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • CGIのforeach文

    CGIを作成していてforeach文のところを通ってくれません。原因が不明なのですが下記でおかしいことなどがあったらおしえてください。 お願いします。 $entrycgi = "./touhyou.cgi"; $Location = '../images'; $imgVote = $Location."/click.gif"; $votefile = "./database/vtbl.dat"; sub vote_form{ print "<FORM ACTION=\"$entrycgi\" METHOD=\"post\" NAME=\"Form\">\n"; print "<INPUT TYPE=\"hidden\" NAME=\"proc\" VALUE='entry'>\n"; print "<INPUT TYPE=\"hidden\" NAME=\"Action\">\n"; print "<TABLE><TR><TD><IMG SRC=\"$Location."/top.gif\"></TD></TR></TABLE>\n"; open(FILE, "+<$votefile"); @output = <FILE>; close(FILE); print "<TABLE><TR>\n"; $i = 1; @output_sort = sort { $b <=> $a } @output; foreach $output_sort(@output_sort){ ($COUNT, $NM, $FILENM, $NO) = split(/\,/, $output_sort); $filename = $Location.$FILENM; print "<IMG SRC='$filename' HEIGHT=100 WIDTH=100></TD>\n"; if ($i == 5) { last; } else { print "<TD width=\"50\"></TD>\n"; $i++; } } print "</TR></TABLE>\n"; }

    • ベストアンサー
    • CGI
このQ&Aのポイント
  • 初めのパソコンはヒューレットパッカードで10年ぐらい使っていましたが、その後NEC LAVIEに買い替えました。皆さんのパソコンは何台目ですか。
  • 初めのパソコンはヒューレットパッカードで10年ぐらい使っていましたが、その後NEC LAVIEに買い替えました。現在のパソコンは私の2台目ですが、皆さんのパソコンは何台目ですか。
  • 初めのパソコンはヒューレットパッカードで10年ぐらい使い、その後NEC LAVIEに買い替えました。現在は私の2台目のパソコンですが、皆さんはどのくらいの台数のパソコンをお持ちですか。
回答を見る

専門家に質問してみよう