CGIで得た内容をHTMlページに代入

このQ&Aのポイント
  • HTMLページにラジオボタンを設置し、これを選んだらこの答え、これを選んだらこの答え、と、ページを移動させるようCGIを記述しました。
  • いくつもの質問に回答した結果、最終ページにひとことコメントを入れたいです。たとえばQ2でA、Q5でCを選んだ場合は最終ページで”よくできました”などです。
  • CGIで変数を設定してHTMLに埋め込むようなコードを記述していますが、うまくいきません。他のサイトを参考にしてみたもののうまく代入できません。どのようにすればいいでしょうか?
回答を見る
  • ベストアンサー

CGIで得た内容をHTMlページに代入

たびたびの質問で恐縮です。 HTMLページにラジオボタンを設置し、 これを選んだらこの答え、これを選んだらこの答え、 と、ページを移動させるようCGIを記述しました。 いくつもの質問に回答した結果、 最終ページにひとことコメントを入れたいです。 たとえば Q2でA、Q5でCを選んだ場合は 最終ページで”よくできました”などです。 それを、CGIで表示するのではなく、 HTMLページに代入して表示させたいです。 私のイメージでは、 if ($q1 eq "A" && $q5 eq "C") $ans eq "よくできました"; などと、CGIなどで変数を設定して それをHTMLに埋め込むようなコードを記述すればいいのではないかとか考えて 色々やってみたのですがうまくいきません。 ほかのサイト等色々見ていると、以下のような感じで代入できそうな気がしています。 <p>!ans!</p> どのようにしたらいいのでしょうか? 参考サイト等ありましたら教えてください!

  • CGI
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

前にも説明しましたが・・ CGIであることと、それがHTMLであることは、全く無関係です。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  頭がWindowsに汚染されていると、よく間違われます。CGIはHTMLを出力します。拡張子は.cgiであろうが.plであろうが、.htmlであろうが、.jpgであろうが一切関係なく、サーバーの応答ヘッダにcontent-type="text/html"とあれば、HTMLとしてブラウザは受け取ります。  単純にテンプレートとなるHTMLを用意して、該当する部分だけ書き換えては次に進めば簡単です。HTMLがたとえいくつあろうと・・ 極簡単な例です。 1) 一行目のPerlへのパスは適当に書き換えてください。 2) 質問や回答の文字列を直接記述していますが、変更部分だけのHTMLを記述したテキストファイルをopenしてprintで出力すれば良いでしょう。  テキストファイルのファイル名を、送信された回答から算出できる文字列にしておくと分かりやすいでしょう。 ★文字コードはutf-8です。 ★タブは_に置換してあるので戻すこと。 ★エラー処理も何もしていない本体だけです。このままでは実用にはなりません。 #!/usr/local/bin/perl my $ANS = ""; my $Que = "<form action=\"$ENV{'SCRIPT_NAME'}\">"; my $HIDDEN = ""; my @pairs = split(/&/,$ENV{'QUERY_STRING'}); foreach $pair (@pairs) { _my ($name, $value) = split(/=/, $pair); _$value =~ tr/+/ /; _$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; _$name =~ tr/+/ /; _$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; _if ($value =~ /\r\n/) { $value =~ s/\r//g; } _elsif ($value =~ /\r/) { $value =~ s/\r/\n/g; } _$FORM{$name}=$value; } my @keylist = keys(%FORM); my $keycount = keys(%FORM); my $inData = "<dl><dt>要素数は $keycount です。</dt>"; for (my $i = 0; $i < $keycount; $i++){ $inData .="<dd>$keylist[$i]:$FORM{$keylist[$i]}</dd>"; } $inData .="</dt>"; if($FORM{'Q3'} ne ""){ _$MESSAGE="質問です。"; } elsif($FORM{'Q2'} ne ""){ _$MESSAGE="質問です。"; } elsif($FORM{'Q1'} ne ""){ _$MESSAGE="質問です。"; } else{ _$MESSAGE="回答です"; } if($FORM{'Q3'} eq "W"){ _if($FORM{'Q2'} eq "M"){$ANS =qq^<p>あなたは西日本生まれの既婚男性です。</p>^;} _else{$ANS =qq^<p>あなたは西日本生まれの未婚男性です。</p>^;} } elsif($FORM{'Q3'} eq "E"){ _if($FORM{'Q2'} eq "M"){$ANS =qq^<p>あなたは東日本生まれの既婚男性です。</p>^;} _else{$ANS =qq^<p>あなたは東日本生まれの未婚男性です。</p>^;} } elsif($FORM{'Q3'} eq "F"){ _if($FORM{'Q2'} eq "M"){$ANS =qq^<p>あなたは太った既婚女性です。</p>^;} _else{$ANS =qq^<p>あなたは太った未婚女性です。</p>^;} } elsif($FORM{'Q3'} eq "S"){ _if($FORM{'Q2'} eq "M"){$ANS =qq^<p>あなたは痩せた既婚女性です。</p>^;} _else{$ANS =qq^<p>あなたは痩せた未婚女性です。</p>^;} } else{ _if($FORM{'Q2'} eq "M"){ __$Que .= qq~\t\t\t<p>あなたは西日本出身?それとも東日本出身?</p>\n\t\t\t<p>西日本:<input type="radio" name="Q3" value="W"></p>\n\t\t\t<p>東日本:<input type="radio" name="Q3" value="E">\n\t\t\t</p>~; __$HIDDEN .="<input type=\"hidden\" name=\"Q2\" value=\"$FORM{'Q2'}\"><input type=\"hidden\" name=\"Q1\" value=\"$FORM{'Q1'}\">"; _} _elsif($FORM{'Q2'} eq "N"){ __$Que .= qq~\t\t\t<p>あなたは太っている?それとも痩せてる?</p>\n\t\t\t<p>太っている:<input type="radio" name="Q3" value="F"></p>\n\t\t\t<p>痩せている:<input type="radio" name="Q3" value="S">\n\t\t\t</p>~; __$HIDDEN .="<input type=\"hidden\" name=\"Q2\" value=\"$FORM{'Q2'}\"><input type=\"hidden\" name=\"Q1\" value=\"$FORM{'Q1'}\">"; _} _else{ __if($FORM{'Q1'} eq "M" || $FORM{'Q1'} eq "F"){ ___$Que .= qq~\t\t\t<p>あなたは未婚?それとも既婚?</p>\n\t\t\t<p>未婚:<input type="radio" name="Q2" value="M"></p>\n\t\t\t<p>未婚:<input type="radio" name="Q2" value="N">\n\t\t\t</p>~; ___$HIDDEN .="<input type=\"hidden\" name=\"Q1\" value=\"$FORM{'Q1'}\">"; __} __else{ ___$Que .= qq~\t\t\t<p>あなたは男?それとも女?</p>\n\t\t\t<p>男:<input type="radio" name="Q1" value="M"></p>\n\t\t\t<p>女:<input type="radio" name="Q1" value="F">\n\t\t\t</p>~; __} _} } $Que .= "$HIDDEN <input type=\"submit\" value=\"送信\">"; $COMMENT = qq~<div class="section">$ANS</div>~; print "content-type:text/html\n\n"; while(<DATA>){ _s/<!--Message-->/$MESSAGE/; _s/<!--inData!-->/$inData/; _if($ANS ne ""){ __s/<!--Comment-->/$COMMENT/; _} _else{ __s/<!--Question-->/$Que/; _} _print; } __END__ <!doctype html> <html> <head> <meta charset="utf-8"> <title>サンプル</title> <style media="screen"> <!-- --> </style> </head> <body> _<header> __<h1 id="title">Your title</h1> __<p><!--Message--></p> _</header> _<section> <!--inData!--> <!--Question--> __</form> _</section> <!--Comment--> _<footer> __<h3>A nice footer</h3> _</footer> </body> </html>

masunona
質問者

お礼

ありがとうございます! 頭がかたくて申し訳ないです。 >単純にテンプレートとなるHTMLを用意して、該当する部分だけ書き換えて このやり方を、CGIを使ってHTMLのなかに言葉を書き込んでいると 勘違いしていました。 皆さんが前々から教えてくださってるのに申し訳ない気持ちです。 コード有難うございます!大変助かります! 利用させていただきます! ありがとうございました!

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

スクリプトのソースコードが無いので、正確なことはわかりませんが。 10年前ということ、CGIを使っているということ、htmlのソース中のコメント等から考えるに ・雛形(テンプレート)をCGiで加工して、文字列を埋め込んだものを出力している と考えるのが妥当だと思います。

masunona
質問者

お礼

何度もありがとうございます! いただいたお返事を参考にさせていただき勉強してみます。 ありがとうございました!

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

外部CSSファイルを用意して、それを使うように指定するか、HTML中にstyleタグで組込みます。 このあたりは、CGIだろうと、HTMLファイルだろうと同じです。 繰り返しますが、ブラウザが見るのは、最終的なデータだけです。元がファイルだとかCGIだとかは関係ありません。 前の回答では省略して書いただけで、実際に使用するなら、END_OF_HTMLまでの間には、HTMLとして完全な物を記述します。 CSSが使いたければ、その様に記述します。 $html=<< 'END_OF_HTML'; <html> <head> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="answer"> <p>!ans!</p> </div> </body> END_OF_HTML # これでも不完全ですが、あくまで例として。 > 私が参考に見たのは、メールフォームの確認画面です。 > 確認画面がhtmlファイルで作成されていて、 > そこに、入力された情報を表示させるようになっていました。 これは、上記のヒアドキュメントの代わりに、ファイルから読み込むだけです。

masunona
質問者

お礼

たびたびありがとうございます! しつこく質問してすみません。 イメージとしては以下のような感じです。 http://www.octalserve.gr.jp/html/gyoumu/hp/cgi/sample_1/index.html 一言コメント欄の表示文字だけを変えたい場合でも、 最終ページのすべてのソースをCGIに書き込んでいるということでしょうか? 私が作成しているものの場合、 回答パターンが10通り以上あり、 最終ページも12ページあり、それぞれのページのソースが50行以上あります。 javascriptを使用していたりボタンも多数配置していたりして、 これをすべてCGIに書き込むとなるとかなり膨大な量になります。 ページの全てのソースをCGIに書き込むのでなく、 htmlファイルは12個作成しておいて、 その一部に言葉を代入するようなことはできないでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> CGIで表示するのではなく、HTMLページに代入して表示させたいです。 この意味がわかりません。 ブラウザにとって、相手がHTMLファイルか、CGIからの出力かは関係ありません。 受け取ったものがどんなデータ形式か、だけです。 おそらく、テンプレートと呼ばれるものを想定しているのだと思います。 ですが、これも、「テンプレートを加工してHTMlに変換するCGI」での表示となります。 テンプレートをCGIに内蔵してしまえば、テンプレートファイルを別途用意する必要はありません。 原理は単純で、「テンプレート中の文字列を置換する」ものです。 $html=<< 'END_OF_HTML'; # ヒアドキュメントを使えば、htmlファイルに書くような感じでスクリプト中に記述できる <html> ... <p>!ans!</p> ... END_OF_HTML $html =~ s/!ans!/${ans}/g ; #置換 「テンプレートエンジン」と呼ばれるものを使うと、簡単に記述できたり、高度な機能が使えたりします。 例) http://perldoc.jp/docs/modules/HTML-Template-2.6/HTML/Template.pod また、ヒアドキュメントを使った、こんな書き方もできます。 $html=<< "END_OF_HTML"; # "でくくったときは、ダブルクォートで括った文字と同じように、変数等が展開されます <html> ... <p>${ans}</p> # ダブルクォートと同じに$ansの内容が展開されます ... END_OF_HTML

masunona
質問者

お礼

ありがとうございます! 以下私の考え違いだったらごめんなさい。 <html> ... <p>!ans!</p> ... END_OF_HTML 上記のようにCGIに記述すると、 まっしろいページに「よくできました」 とだけ表示される形ではないでしょうか? そうではなくて、 CSSを読み込んだりdivを使ったり ほかにもいろんな情報を書き込んだ込み入った?ページを作成していて、 そこにansを表示させたいです。 すべてのソースをCGIに書き込むことは出来ません。 また用意してある複数のhtmlページの一部に ansを表示させたいと思っているので ”HTMLファイルに代入する”という表現を使いました。 私が参考に見たのは、メールフォームの確認画面です。 確認画面がhtmlファイルで作成されていて、 そこに、入力された情報を表示させるようになっていました。 そのイメージで作りたいと思ったのですが・・・。 見当違いでしたらごめんなさい。 引き続きよろしくお願いいたします!

関連するQ&A

  • CGIでのページ指定

    間単に同一CGI内で、ページ毎に異なったhtmlを表示したいのですが、 例えば、 aaa.cgi?p=1で、print "1ページ目"; aaa.cgi?p=2で、print "2ページ目"; みたいな振り分け表示なのですが、 下記記述でうまく表示されません 記述を教えていただけますでしょうか? よろしくお願いします m(_ _)m if($in{'p'} eq '1'){&1page;} sub 1page{ print"1ページ目"; print"<a href=./aaa.cgi?p=2>2ページ目</a>"; }

    • ベストアンサー
    • CGI
  • CGIでのページ指定~その(2)

    以前教えていただいた下記の記述なのですが 新規のCGIで実行するとうまく表示されません; $inの関連記述をしていないからでしょうか? まったくの新規のCGIで実行できる記述方法を 教えてください よろしくお願いします m(_ _)m **************************** if($in{'p'} eq '1'){&page1;} sub page1{ print"1ページ目"; print"<a href=./aaa.cgi?p=2>2ページ目</a>"; } ****************************

    • ベストアンサー
    • 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
  • CGI(Perl)とHTMLについて

    CGI初心者です、Perlの知識は皆無です。 質問は2つあるのですが・・・ 1、CGIのページを例えば画像を呼び出すようにHTMLで指定できるのでしょうか? 画像であれば<img src=".../AAA.gif">ですが、こんな感じでCGIのページ自体をHTMLの指定した枠に呼び出すことはできるのでしょうか。 2、CGIページのカスタマイズ 現在、CGIレスキューさんからダウンロードしたファイルをカスタマイズしています。 条件指定ができる検索データベースです。 設置と動作確認はできたのですが、思うようにレイアウトできないでいます。 Perl記述中にテーブル(HTML)を挿入すると、プルダウンメニューから選択項目が飛び出してしまうのです。 (おおざっぱに記述すると) print <<"---HTML---"; あいうえお<select name="aiueo" size=1> ---HTML--- forseach $i (@AIUEOs) { print "<option value=\$i\"$pref_selected{$i}>$i</option>\n";} print <<"---HTML---"; </select> <p> (略) ---HTML--- こんな感じです、変数の部分は変えてます。 ずっと上の方で、 @AIUEOs = ("あああ", "いいい", "ううう", "えええ", "おおお"); と、変数が定義されてるようです。 名称かきく「プルダウンメニューA」 名称あいうえお「プルダウンメニューB」 要は、「 」の部分を揃えたい(縦に整列)のですが、うまくいきません。プルダウンメニューが飛び出してしまいます。 2段目のHTML記述部分がなぜ閉じタグから始まっているのかもよくわからないです。 端折ってますので、分かりにくいと思いますが、コメントいただける方、よろしくお願いします。

    • ベストアンサー
    • CGI
  • HTMLスキン型CGIを作るには?

    フォームメールの制作を行っているのですが、汎用性を高めるために、HTML部分はすべて外部に書き出して処理に関するところだけをCGIに記述しようと考えています。 まず、デザインテンプレート(HTMLスキン)に$html_contentsなどと挿入位置を記述しておき、 CGIへのアクセスがあった際に、スキンを読み込み、その挿入位置に結果を代入するというものです。 できるなら、エラーメッセージや完了メッセージの部分も外部(HTMLを記述した*.datかな?)ファイルとしたいです。 参考になるサイトもしくは、プログラムをご存知の方はご教授願います。

    • 締切済み
    • CGI
  • CGIで入力した内容をHTML内に表示

    いつもお世話になっています。 メールフォームで事前に「aaa.cgi」というページで入力した内容を「bbb.html」内に表示したいと思っています。 具体的には「aaa.cgi」の中に「name」というフォームがあり、この値をそのままbbb.html内に「●●さん」として表示したいです。 $in{'name'}などとして引き継げるのはCGI→CGIですよね? HTMLに$in{'name'}と記述しても空欄になってしまうためご質問させて頂きました。 bbb.htmlをcgiで書き直してaaa.cgiの値を受け取った後、Printなどで出力する方法しかないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • HTML
  • HTMLからCGIの呼び出しができません。

    既に作ってあるHTMLファイルをコピーして、CGIファイルの名前を変えて送信ボタンをクリックしました。CGIファイルはTITLEだけの記述にしましたが、TITLEは表示されず、http://~のようにアドレスが表示されます。HTMLファイルの方は、<form action="./A.cgi" method="post">のように修正し、CGIファイルの方には、以下のように記述してあります。何が原因でTITLEが表示されないのでしょうか? #!/usr/local/bin/perl use CGI qw(:standard); print<<END_OF_HTM; Content-type:text/html <HTML> <HEAD> <TITLE>XXXXXX</TITLE> </HEAD> </HTML> END_OF_HTM

    • ベストアンサー
    • Perl
  • CGIで書き出されるページにHTMLで記述したメニューを表示させたいのですが…

    現在、検索エンジン系のCGIを元にサイトを作成しています。 このCGIで書き出される全ページ(任意の)にサイトのメニューを表示したいのですがどうやってよいのか分かりません。。 メニューは変更があっても更新しやすいようにHTMLで作成したいので、CGIにHTMLを読み込むという形をとりたいと思っています。 いろいろ調べてみて「出来る」ということはわかったのですが、具体的にどうすればよいのかまでは分からなかったのでここに質問させて頂きました。 初歩的な質問だとは思うのですが、どなたかご回答よろしくお願い致します。

    • 締切済み
    • CGI
  • CGI.pmによるプルダウンメニューのvalue値取得方法について

    CGI.pmを使ってプルダウンメニューのvalue値を得たいのですが、ラジオボタンと同じ記述で取得できると聞きましたが上手くいきません。ちなみにラジオボタンはうまくいきました。HTMLの記述が良くないのでしょうか?教えてください。 【HTML】 <select size="1" name="q1"> <option>選択してください</option> <option value="A">A</option> <option value="B">B</option> <option value="C">C</option> </select> 【CGI】 use CGI; $q = new CGI; $p1 = $q->param('q1');

    • ベストアンサー
    • Perl
  • CGI 実行後に HTML でフォーム付のページを出力したいのですが・・・

    CGI 初心者ですが、質問です。商品の合計金額を出す CGI プログラムを実行後に HTML でフォーム及び送信ボタン付のページを出力したいのですが・・・色々とサイトを渡り歩いたのですが、初心者なものでどのサイトを見てもそれらしき事は書いてあるのですが何の事を書いてあるのかが全くわかりません。大変お手数で申し訳ないのですがプログラムの記述ヒントをこの場で頂ければ助かります。宜しくお願い致します。

専門家に質問してみよう