• ベストアンサー

ヒアドキュメントでHTMLを書いて次へをクリックするとサブルーチンが表示される方法は?

こんにちわ。perlでCGI学んでます。初心者です。 CGIの中にヒアドキュメントでHTMLを書きました。 そのページの最後に「次のページへ」というフォームボタンをつけました。ボタンをクリックするとサブルーチンの次ページが表示されるようにしたいのですが、うまくいきません。ボタンはinputタグのボタンにしたいので、テキストリンクにはしません。 「次のページへ」をクリックするとサブルーチンのpage1の中が表示されるようにするにはどうしたらいいですか?hiddenタグをボタンの下に書けばいいといわれたのですが、どうもうまくいきません。ご存知のかた、ご教授願います。 以下のようにソースを書きましたがうまくできません。。。。 #!/usr/bin/perl $script="test.cgi" print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF }

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

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

  • ベストアンサー
回答No.5

送信された値の取得にはCGI.pmかcgi-lib.plを使いましょう。 こちらの記事がおすすめです。 「CGI.pmを使ってみよう」 http://www.futomi.com/lecture/form/cgi-pm.html 「cgi-lib.plを使ってみよう」 http://www.futomi.com/lecture/form/cgilib.html で、好きな変数に、 <input type="hidden" name="page" value="page1"> で指定したページ数を入れます。 CGI.pmなら use CGI; $q = new CGI; $page = $q->param('page'); cgi-libなら require "cgi-lib.pl"; &ReadParse(\%input); $page = $input{'page'} って感じですね。 これで、$pageに指定したページ数が入りました。 そしたら、if文で$pageに入った値をチェックして、 その値によって、使用するサブルーチンを振り分けたりするわけです。 #失礼かとは思いますが、回答に対する補足を読んでいると、質問者さんはまだここで具体的な処理方法の質問をできる段階ではないように思います。 #参考URLに初心者さん向けのperl/CGI解説サイトのアドレスをいくつか入れておきますので、訪問してみてください。

参考URL:
http://www.futomi.com/, http://www.aimix.jp/cgi/, http://www.site-cooler.com/kwl/perl/, http://perl.misty.ne.jp/
ayako0401
質問者

補足

ありがとうございます。失礼なんてとんでもございません。初心者のためにたいへん親切に答えていただきまして感謝です。ありがとうございます。とても勉強になりました。ほかのみなさんもどうもありがとうございました!

その他の回答 (4)

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.4

#2です。 my とか use とか CGI とか、これ全部普通のPerlの機能です。 use CGI; はまああれですけど、my は perl を普通に使っていれば必ず使うものです。 ちなみに my はローカル変数を宣言するときに使うもので、先ほどの場合ですと $cgi という変数をメインルーチンの中でだけ使いますよ、と宣言しています。 従って page 関数や page1 関数内では $cgi は使えません。 use CGI は CGI モジュールを使いますよ、という宣言ですね。 このモジュールを使わない方法はもちろんあります。 ですが、相当面倒です。 これはこういうものだ、と割り切って使ってしまった方が楽です。 強いて言えば#1さんがやっているようなデコード処理をするわけですが、あれを見て何をやっているのかわからないようであれば見る意味もないです。 また一から自分でデコード処理を作るよりも既に提供されているものを使ったほうが確実です。 今はこういう宣言をすると $cgi->param("xxx") でフォームの値が取得できるんだ、ということがわかっていればよろしいかと思います。 まずはフォームからの入力処理等一連の処理を作れるようになってから勉強しても遅くはないと思います。

回答No.3

モジュールなしバージョンです。 #!/usr/bin/perl $script="test.cgi" $buffer = &get_buffer(); %FORM = &get_value($buffer); $mode = $FORM{'page1'}; if ($mode eq 'page1') { &page1(); } else { &top(); } exit; sub top { print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF } ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF } #------------------------- # $buffer取得 #------------------------- sub get_buffer { # フォームデータ取得 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $tmp, $ENV{'CONTENT_LENGTH'}); } else { $tmp = $ENV{'QUERY_STRING'}; } return($tmp); } #------------------------- # $buffer分解 #------------------------- sub get_value { @pairs = split(/&/,$_[0]); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; $form{$name} = $value; } return(%form); }

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.2

プログラムの先頭でどのページを表示させるのかという処理をしなければいけません。 つまり hidden の page1 が page1 であれば page1 をコールし、違っていれば最初のページを表示させるということになります。 ではフォームの値を受け取るにはどうしたらいいか。 CGIモジュールを使うと便利です。 以下、修正したプログラムを載せます。 #!/usr/bin/perl use CGI; $script="test.cgi" my $cgi = CGI->new(); if( $cgi->param( "page1" ) eq "page1" ){ &page1; } else { &page; } sub page{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> <style>BODY {FONT-FAMILY: arial,sans-serif} TD {FONT-FAMILY: arial,sans-serif} A {color:black; text-decoration:none;} P {FONT-FAMILY: arial,sans-serif} </style></head> <body bgcolor="#FFFFFF" > あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ" style="background-color: #FFFFFF;border-color: #FFFFFF;border-style:solid;cursor:pointer;" > <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF } ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> <style>BODY {FONT-FAMILY: arial,sans-serif} TD {FONT-FAMILY: arial,sans-serif} A {color:black; text-decoration:none;} P {FONT-FAMILY: arial,sans-serif} </style></head> <body bgcolor="#FFFFFF" > お買い上げありがとうございました。 </body> </html> EOF } とこんな感じになります。 ただ hidden の ID が page1 というのはいただけません。 できれば page として value を 1 という風に、page に表示させたいページ番号を指定するという風にしたほうが汎用的です。 つまり hidden の箇所は、 <input type="hidden" name="page" value="1"> こうなり、冒頭の処理はこうなります。 if( $cgi->param( "page" ) == 1 ){ &page1; } else { &page; } こうしておけば、例えば表示するページが2ページ、3ページと増えてもわかりやすいと思います。 if( $cgi->param( "page" ) == 1 ){ &page1; } elsif( $cgi->param( "page" ) == 2 ) { &page2; } elsif( $cgi->param( "page" ) == 3 ) { &page3;  :  :  :

ayako0401
質問者

補足

下の方もそうですが、とても丁寧に答えてくださってありがとうございます。こぴぺしたらうまく動きました!ありがとうございます! ただ・・えー、わたしは初心者なので,useとかmyとか $cgi->とかがよくわかりません。これがCGIモジュールというやつですよねたしか。便利ということは聞いたことがありますので、将来的には勉強しようと思っていますが、今の時点のわたしの力では無理です^^普通のperlだけでいっぱいいっぱいですから^^ myとかuseとか使わないでやる方法でできる方法があったら教えてください。 わがままでごめんなさい。。。

  • kosa
  • ベストアンサー率25% (379/1464)
回答No.1

フォームから変数を受け取るには、デコード処理が必要です。 デコード処理のサブルーチンを追加しました。→decode はじめに表示する部分をサブルーチン化しました。→page (1)デコード処理をします。 (2)IF文で変数の中身によって表示するページを判定します。 #!/usr/bin/perl $script="test.cgi" &decode; if($in{'page1'}=="page1"){ &page1; }else{ &page; } ------------------------------------------------ sub page{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF } ------------------------------------------------ sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF } ------------------------------------------------ sub decode { local($key, $val, $buf); if ($ENV{'REQUEST_METHOD'} eq "POST") { $postflag=1; read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $postflag=0; $buf = $ENV{'QUERY_STRING'}; } $flag=0; @key=(); %in=(); foreach (split(/&/, $buf)) { ($key, $val) = split(/=/); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/^\_//; $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; push(@key,$key); } }

ayako0401
質問者

補足

さっそくのお返事ありがとうございます。 教えてくださったものをこぴペしてみたのですが、 エラーがでてしまいました・・・ どこでエラーをはいてるのかちょっとわたしにはわかりません。。

関連するQ&A

  • foreachでループした変数を他のサブルーチンに受け渡す方法を教えてください。

    ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、sub mainの中の$dataをsub htmlの中で表示させて、sub mainでループさせた値をすべてsub mailへわたしたいのです、hiddenタグで<input type=\"hidden\" name=\"all\" value=\"$all\">とやってもうまくいきませんでした。@inの中をループさせるので@inをそのままかけばいいのでしょうか?これもうまくいきませんでした。。ようはループさせた値をすべてメールで送信したいのです。どうしたらうまくできますでしょうか? sub main{ foreach(@in){ ($name1,$value1) = split(/=/,$_); $data="$name1 : $value1"; print "$data"; print "<br>"; } sub html{ print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> &main; <form action="" method=""> <input type=\"hidden\" name=\"all\" value=\"$all\"> <input type=\"submit\" value=\"送信する\"> </form> </body> </html> EOF } sub mail { ####省略しますが、ここはメールの送信の記述です。 }

    • ベストアンサー
    • Perl
  • HTML内の値を取得し、別の箇所にコピーする方法

    下記のソースで書き換え実行ボタンを押下すると、2行目の表示内容を1行目にコピーした上で、2行目の内容を削除したいと思いました。 2行目の内容の削除は下記の3行で出来ていると思います。 $("#text2_1").html(""); $("#text2_2").val(""); $("#text2_3").val(""); ただし、2行目の内容を1行目にコピーする所がわかりませんでした。 $("#text1_1").html("2行目"); $("#text1_2").val("2行目"); $("#text1_3").val("2行目"); 上記3行の「2行目」と固定で記述されている箇所の代わりに、下記3行の値を取得する記述をしないといけないのかと思ったのですが、どのように記述すればよいかわからなかったのでアドバイスいただける方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 <div id="text2_1">2行目</div> <input type="text" name="text2_2" id="text2_2" value="2行目" /> <input type="hidden" name="text2_3" id="text2_3" value="2行目" /> 【ソース】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="JavaScript" type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> <!-- $(function(){ $("#change").click(function(){ $("#text1_1").html("2行目"); $("#text1_2").val("2行目"); $("#text1_3").val("2行目"); $("#text2_1").html(""); $("#text2_2").val(""); $("#text2_3").val(""); }); }); // --> </script> <title>title</title> </head> <body> <form> <input id="change" type="button" value="書き換え実行" /> </form> <br /> <div id="text1_1">1行目</div> <input type="text" name="text1_2" id="text1_2" value="1行目" /> <input type="hidden" name="text1_3" id="text1_3" value="1行目" /> <div id="text2_1">2行目</div> <input type="text" name="text2_2" id="text2_2" value="2行目" /> <input type="hidden" name="text2_3" id="text2_3" value="2行目" /> </body> </html> 以上、宜しくお願いします。

    • ベストアンサー
    • AJAX
  • アンケートフォーム複数ページ間のテキストフォームデータのの受け渡し

    こんにちわ、1ページ目の名前のテキストフォームに入力した内容のデータと2ページ目のメールアドレスのテキストフォームに入力したデータをのデータを確認画面で表示させたいのですがうまくできません。わらをもすがる思いでここに書きました。 1ページ目 名前を入力 2ページ目 メールアドレスを入力 3ページ目 確認画面 4ページ目 サンクスページ わたしが書いたソースは以下のとおりです。。 どうしてもデータをうまく確認画面にもっていくことができませんよろしければ詳しい方、アドバイスをお願いいたします。よろしくお願いします! ※ここの文字数制限が800文字なのでかなり省略化しています。 if ($FORM{'action'} eq "page2") {&page2;} elsif ($FORM{'action'} eq "") {&page1;} elsif ($FORM{'action'} eq "kakunin") {&kakunin;} elsif ($FORM{'action'} eq "kanryou") {&kanryou;} #1ページ目 sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> </head> <body> <form method="post" action="$script"> □お名前(漢字)<br> <input type="text" size="12" name="name1" value="$FORM{'name1'}" > <input type="hidden" name="name1" value="$name1"> <input type="hidden" name="action" value="page2"> <input type="submit" value="次へ"> </form> </body> </html> EOF exit; } #2ページ目 sub page2{ 文字数制限のため省略 メールアドレス } #■フォームのデコード処理 sub decode{ 文字数制限のため省略 } #確認画面 sub kakunin{ 文字数制限のため省略 } #送信完了画面 sub kanryou{ 文字数制限のため省略 }

    • ベストアンサー
    • CGI
  • アンケートフォーム複数ページ間のテキストフォームデータのの受け渡し

    こんにちわ、1ページ目の名前のテキストフォームに入力した内容のデータと2ページ目のメールアドレスのテキストフォームに入力したデータをのデータを確認画面で表示させたいのですがうまくできません。わらをもすがる思いでここに書きました。 1ページ目 名前を入力 2ページ目 メールアドレスを入力 3ページ目 確認画面 4ページ目 サンクスページ わたしが書いたソースは以下のとおりです。。 どうしてもデータをうまく確認画面にもっていくことができませんよろしければ詳しい方、アドバイスをお願いいたします。よろしくお願いします! ※ここの文字数制限が800文字なのでかなり省略化しています。 if ($FORM{'action'} eq "page2") {&page2;} elsif ($FORM{'action'} eq "") {&page1;} elsif ($FORM{'action'} eq "kakunin") {&kakunin;} elsif ($FORM{'action'} eq "kanryou") {&kanryou;} #1ページ目 sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> </head> <body> <form method="post" action="$script"> □お名前(漢字)<br> <input type="text" size="12" name="name1" value="$FORM{'name1'}" > <input type="hidden" name="name1" value="$name1"> <input type="hidden" name="action" value="page2"> <input type="submit" value="次へ"> </form> </body> </html> EOF exit; } #2ページ目 sub page2{ 文字数制限のため省略 メールアドレス } #■フォームのデコード処理 sub decode{ 文字数制限のため省略 } #確認画面 sub kakunin{ 文字数制限のため省略 } #送信完了画面 sub kanryou{ 文字数制限のため省略 }

    • ベストアンサー
    • Perl
  • 携帯用アンケートページを作成したけど、携帯によってエラーがでてしまう。

    携帯用ページを作成したのですが、機種によりエラー(「ページが表示できません」か「Forriden」)がでてしまいます。全キャリア共通で使いたいのでおかしい部分がありましたら教えてください。よろしくお願いします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"><meta http-equiv="Content-Style-Type" content="text/css"><TITLE>xxx</TITLE></HEAD> <BODY><form method="post" action="/cgi-bin/xxx.cgi"> <br>性別<br><input type="radio" name="rc_seibetu" value="男" checked>男<br><input type="radio" name="rc_seibetu" value="女">女<input name="cc_seibetu" type="hidden" value="性別"> <br>キャリア<br><input type="radio" name="rc_com" value="ドコモ" checked>ドコモ<br><input type="radio" name="rc_com" value="voda">voda<br><input type="radio" name="rc_com" value="au">au<br><input type="radio" name="rc_com" value="Tu-Ka">Tu-Ka<input name="cc_com" type="hidden" value="キャリア"> <br>機種<br><input name="oa_kisyu" type="text" value="例)xxx" size="14"><input name="cc_kisyu" type="hidden" value="機種"> <textarea name="oa_body">ご要望</textarea><input name="cc_body" type="hidden" value="ご要望"> <br><INPUT NAME="oa_mailtitle" TYPE="hidden" VALUE="xxx"><INPUT NAME="om_mailto" TYPE="hidden" VALUE="xxx@xxx.co.jp"><INPUT NAME="oh_page_confirm" TYPE="hidden" VALUE="cm_confirm"><INPUT NAME="oh_errpage_nodata" TYPE="hidden" VALUE="cm_nodata"><input type="submit" value="送信"><br></form></BODY>

    • 締切済み
    • CGI
  • HTMLにて表示非表示後の行詰め方法

    フィールドのクリックによってText文を非表示/表示 切りかえることを考えています。 その際(非表示)前後の文書(入力域、ボタン)などの 行詰めの方法がわかりません。 皆さんに教えていただきたく投稿しました。 よろしくお願いします。 尚サンプルを付けました。 <HTML> <HEAD> <TITLE>サンプル</TITLE> </HEAD> <script type="text/javascript"> <!-- var flag = 0; function A() { if (flag==0) { document.all.T2.style.visibility = 'hidden'; document.all.text1.style.visibility = 'hidden'; flag = 1; } else { document.all.T2.style.visibility = 'visible'; document.all.text1.style.visibility = 'visible'; flag = 0; } } --> </script> <BODY> <DIV ID="text1" STYLE="font-size=10pt;font-family=Times New Roman">教えてください</DIV> 下記入力フィールド1でクリックすると表示切替します。<br> <input type="text" size="30" name ="a" value="入力フィールド1" id="T1" onclick="A()"> <p> <button >文字列変更1</button><p> <button >文字列変更2</button><p> <input type="text" size="30" name ="b" value="入力フィールド2" id="T2"> <p> このページはテストです。 </BODY> </HTML>

  • Input type と枠線並びに改行の扱い

    現在、ABCDEを2行で表示することが出来ています。これに枠線を付けたいのですが、方法が分かりません。input type="Hidden"では枠線がつけられないようなので、input type="text"並びにTextareaにすると今度は枠線は出るものの改行が反映されません。 <html> <head> <title>sample001</title> </head> <body> <input class="abcde" readonly="readonly" type="hidden" name="content" value="abc de">abc<br>de</td> </body> </html> 当方全くの初心者です。何卒宜しくお願い致します。

    • ベストアンサー
    • HTML
  • ニフティのメールデコードについて教えてください

    webアンケートを作るためにhttp://homepage.nifty.com/mail/sample.htm#enqueteを参考にしてみたのですが(送信ボタンを押すと)「メールアドレスが記入されていないか形式が不正です」とエラーメッセージが出てしまいます。以下の書き方で間違っている所があるでしょうか。 <HTML> <HEAD> <TITLE>質問紙のサンプル</TITLE> </HEAD> <BODY> <FORM METHOD="post" ACTION="http://mdec.nifty.com/cgi-bin/ahpmdec.cgi"> <INPUT TYPE="hidden" NAME="ok_page" VALUE="http://homepage?.nifty.com/***/***.htm"> <INPUT TYPE="hidden" NAME="to_mail" VALUE="***@nifty.com"> <INPUT TYPE="hidden" NAME="sub" VALUE="質問紙調査の結果"> 名前: <br> <INPUT TYPE="text" NAME="name" SIZE="30" MAXLENGTH="40"> <br> メールアドレス: <br> <INPUT TYPE="text" NAME="from" SIZE="25" MAXLENGTH="60"> <br> コメント: <br> <TEXTAREA NAME="body" ROWS="20" COLS="30"> </TEXTAREA> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> </BODY> </HTML>

    • ベストアンサー
    • HTML
  • 1つのsubmitボタンで2つのCGIを呼び出すことは可能ですか?

    今は、htmlで <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form action="abc.cgi" method="get"> 以下省略 <input type="submit" value="送信"> </form> <form action="xyz.cgi" method="get"> 以下省略 <input type="submit" value="受信"> </form> </body> </html> という感じで書き、2つのボタンで個々に2つのCGIを呼び出していますが、 これをメールの送受信のように、1つのボタンで2つのCGIを呼び出すことは可能なのでしょうか。 教えてください。お願いいたします。

    • ベストアンサー
    • CGI
  • メールフォーム設定について

    HP初心者です。メールフォーム作成について質問させていただきます。 現在 http://sitemix.jp/ の提供している無料CGIサービスを利用しており、パスは/usr/lib/sendmail とのことなのですが、下記のようなソースを書いてもうまく送信できず、エラーになってしまいます。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>無題ドキュメント</title> </head> <body> <form name="form1" method="post" action="/usr/lib/sendmail"> <p> 名前 <input type="text" name="textfield"> <INPUT TYPE="hidden" NAME="endmail" VALUE="thanks.htm"> <input type="hidden" name="tomail" value="メールアドレス"> <input type="hidden" name="submail" value="mailform"> </p> <p><br> <input type="submit" name="Submit" value="送信"> </p> </form> </body> </html> どこか間違っている場所などあればお教えください。どうぞよろしくお願いいたします。

    • 締切済み
    • CGI

専門家に質問してみよう