• ベストアンサー

次の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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>どこに >print "Location:1266.cgi\n\n"; >を書けばよいのでしょうか? よろしく、お願いいたします。 print "Location:ほげほげ.cgi\n\n"; が実行出来るのは print header(-charset => 'Shift_JIS'); を実行する前です。 念の為に書いておきますが「実行する順番」が大事であって「どこに書いてあるか」は関係ありません。前にあろうが後ろにあろうが1つあろうが複数あろうが関係なく「実行する順序だけ」が大事です。 CGIは、WEBサーバープログラムにデータを送る場合、今から送る物が何なのかを示す為、一行目にヘッダーを出力しなければなりません。ヘッダーを送ったら、1行の空行を空け、その後にデータ本体を出力します。 「送られる内容がhtml文書だった時」は、ヘッダーに Content-type:text/html と出力し、1行の空行を空けた後、本文を出力する決まりになっています。 「送られる内容が画像データだった時」は、ヘッダーに Content-type:image/jpeg とか Content-type:image/gif とか Content-type: image/png と出力し、1行の空行を空けた後、画像そのものを出力する決まりになっています。 「送られる内容がリダイレクション(転送指令)だった時」は、ヘッダーに Location:「http://で始まるURL」 と出力し、1行の空行を出力する決まりになっています。 と言う訳で「CGIはヘッダーが命」と言うのが判ったと思います。 さて、ここで print header(-charset => 'Shift_JIS'); は Content-type:text/html と出力し、1行の空行を空けた後、Shift_JISのフラグを付けた文字セット指示タグを出力する意味になります。 つまり、 print header(-charset => 'Shift_JIS'); を実行してしまった後では print "Location:1266.cgi\n\n"; は実行しても意味がないのです。ヘッダー出力処理はもう実行済みですから。 簡単に言えば print header(-charset => 'Shift_JIS'); の代わりに print "Location:1266.cgi\n\n"; を実行すれば、1266.cgiに飛ぶ、と言う事です。

ttaa100kkaa
質問者

お礼

ヘッダーに関するお教え、本当にありがとうございました。 大変勉強になりました。

その他の回答 (2)

回答No.3

else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { ↑else を閉じれていません。} として下さい。

ttaa100kkaa
質問者

お礼

ありがとうございました。うまくいきました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>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; >{ > >としたのですが、だめでした。 この「##省略##」と書いている部分に「 print start_html("001.cgi");」が書かれているということでよろしいのですか?また「だめでした。」というのは次の画面に遷移しなかったということでしょうか? >print ('Location:002.cgi\n\n'); 単引用符で括ると「\n」が改行になりませんから、二重引用符で括ってください。   print ("Location: 002.cgi\n\n");

ttaa100kkaa
質問者

お礼

ありがとうございました。いろいろ、やってみたら、うまくいきました。大変勉強になりました。

ttaa100kkaa
質問者

補足

回答、まことに、ありがとうございます。 はい、 >この「##省略##」と書いている部分に >「 print start_html("001.cgi");」が書かれて います。 >「だめでした。」というのは Internal Server Error になってしまった、ということです。すみません。 print ("Location: 002.cgi\n\n"); としても Internal Server Error でした。 else の } をどこに書くのかも、関係があるでしょうか? それから、 この質問とは関係ないかも知れませんが、私は WindowsXP に Apache を入れて LAN の中だけで Web サーバ をやっている者です。  よろしく、お願いいたします。

関連するQ&A

  • 次のcgiファイルを開くには?

    すみません。初心者です。 001.cgi というファイルで フォーム に 正解を入力して Enterキー を 押したら 次の 002.cgi を 開く(実行する)ようにするには どうしたらよいでしょうか? 今は↓このようにして 「次のファイルへ」をクリックしてもらっています。 Enterキーを押すだけで 次の002.cgi (=$num2.cgi)へ行きたいのです。よろしく、お願いいたします。 #-------- if (param('answer') eq $ans){ print ('正解'); print ("<a href=$num2.cgi accesskey=]>次のcgiファイルへ (Alt+])</a> "); #--------

    • ベストアンサー
    • Perl
  • 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
  • ランダムに1行読込み フォーム文字との同異を 判定するには?

    txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • CGI.pmのhtmlhへの表示について教えて下さい。

    こんにちわ。CGI.pmをhtmlで表示させたいと思っているのですが、うまくいきません。どこか足りないのでしょうか。お解りの方どうか教え下さい、よろしくお願いします。 use CGI; $q=newCGI; print $q->header(-type=>'text/html',-charset=>'Shift_JIS'), $q->start_html(-lang=>'japanease'), $q->h1('こんにちわ'), $q->end_html;

    • ベストアンサー
    • Perl
  • テキストファイルを読んで次のcgiファイルを動かすには?

    お願いします。初心者です。 0001.cgi で 正解 Einstein を Send すると  file.txt に -1 と書き込むようにしました。 さらに  0002.cgi へのリンクが出て、これをクリックすると 0002.cgi が動くようにしました。  そして、 file.txt に -1 が ない場合に 0002.cgi が動き始めないようにしようとしています。 0001.cgi の問題に正解しないと、0002.cgi へ行けない ようにしようとしています。どうしたらよいのでしょうか? どうか、お教えください。 よろしく、お願いいたします。 0001.cgi は、こんなふうになっています。 ↓ ---------------------------------------- print header; # -------------------------------------- print start_html('0001'); #ここに問題を入れました 答は Einstein です。 print startform( -method => 'POST', -action => '0001.cgi' ); print blockquote( textarea( -name => 'die Antwort', -rows => '3', -columns => '40' ) ); print br; print submit(-value => 'Send'); print reset; print endform; # -------------------------------------- if (param('die Antwort') eq 'Einstein'){ print h2('Einstein'); print h2('<a href="0002.cgi">next page</a>'); open(FILE, '>>file.txt') or die "$!"; print FILE ("-1"); close(FILE) } else{ print h3('false'); } # -------------------------------------- print end_html; # --------------------------------------

    • ベストアンサー
    • CGI
  • "Content-type:text/html;charset=shift_JIS\n\n" がテキスト表示されてしまう。

    CGIで print "Content-type:text/html;charset=shift_JIS\n\n"; を出力すると その文字列がそのままブラウザにテキスト表示され、その後ろの操作、 例えば、 print "Status: 301 Move Permanent\n"; print "Location: http://localhost/file/data-1.lzh\n\n"; も、単純に文字列として表示されてしまいます。 ところが、print "Content-type:text/html;charset=shift_JIS\n\n"; の行を削除すると、 もともとの目的の動作(上記の例ではファイルのダウンロード画面ポップアップ)になります。 このように、print "Content-type:text/html;charset=shift_JIS\n\n";を書かなくて済む (あるいは書かない方が良い場合)というのは、なぜでしょうか。 サーバによっては動作が変わるのでしょうか。 ※そのCGI内で、print "Content-type:text/html;charset=shift_JIS\n\n"; を2行書いてあるというようなことはありません。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • ひとつのCGIファイルに複数のページの動作を管理

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

    • ベストアンサー
    • CGI
  • メールフォームの作成(sendmail)

    現在cgiでメールフォームを作成しています。 sendmail使用、ファイルのエンコーディングはShift_JIS、改行コードLF htmlのフォームから情報を入力し、 perlで入力内容の確認、 cgiでメール送信までは実行できました。 他の項目(件名やメールアドレスなど)はメール内容に反映されているのですが、 本文のみ空白となってしまいます。 本文に関わるコードは下記になります。 use CGI; $cgi = new CGI(); $maintxt = $cgi->param('maintxt'); $cgi->charset('Shift_JIS'); $maintxt = $cgi->escapeHTML($maintxt); &jcode::convert(\$maintxt,'jis'); print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "$maintxt\n"; cgiは勉強中なもので、解決方法がお分かりの方がいらっしゃいましたら、 教えていただければ幸いです。

    • ベストアンサー
    • CGI
  • バイナリファイルの扱いについて

    お世話になります。MYSQLのカテゴリーにするか迷いましたが、こちらで質問させていただきます。 アップロードしたバイナリファイルをデータベースに格納したいのですが、データベースの中は空になってしまいます。 ファイルの中身を変数にバイナリとして取り込み、その変数をINSERT文で挿入するというのは、どう書いたらいいのでしょうか? #!C:\Perl\bin\perl use CGI; use DBI; $PCMOJPATH='C:パス名; my $form = CGI->new; print $form->header(-type => "text/html"); $form->charset('Shift_JIS'); my($filename) = $form->param('uploadFile'); $time = time . $$; $newfile = "upload_$time";  :  : という感じで書いているのですが、変数にバイナリとして取り込むのができません。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう