• ベストアンサー

フォーム入力後の確認画面表示について

こんにちは。tyabudaiと申します。 よろしくお願いします。 現在、私のサイトでCGIを使って投稿するフォームを作成しています。 流れは以下のようなものです。 1.フォームに内容を入力、送信ボタンでCGI起動。 (以下CGI) 2.入力内容をサーバのファイルに書込む。 3.送信完了のメッセージを表示 そして今、1と2の間に確認画面を表示する処理を 追加したいのですが、どのような処理にするのでしょうか? ソースについては勉強しますので、大まかな流れを教えて いただけないでしょうか?

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

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

  • ベストアンサー
  • ron3
  • ベストアンサー率35% (7/20)
回答No.4

CGIの基本の考えの問題を勘違いされているのではないかと思うのですが。 CGIは、ブラウザで一度表示するとそれで、プログラムとしては、終わります。 (説明下手ですね。) つまり、もう一度、同じURLを指定して、実行したとしても、 最初から実行し直しとなります。 値を保持するわけではありません。 解答としては、yuizuianのおっしゃる通りです。 下のサンプルを修正すると、 #!C:\Perl\bin\perl ~ここ省略~ if ($form{'mode'}='kakunin'){ # 連想配列から値だけを取り出し、区切り文字を追加 $data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n"; &kakunin; exit; } elseif($form{'mode'}='touroku'){&write;} else{&error_print;} # 確認画面の表示サブルーチン sub kakunin { print "Content-type:text/html\n\n"; print << "END_OF_KAKUNIN"; <HTML> <HEAD> <TITLE>投稿内容確認</TITLE> </HEAD> <BODY> 以下の内容で投稿します <BR> <BR> 名前は $form{'name'}<BR> メールアドレスは $form{'mail'}<BR> アドレスの掲載は $form{'mail_up'}<BR> 映画のタイトルは $form{'title'}<BR> 投稿記事の内容は $form{'topic'}<BR> <form method="POST" action="test.cgi"> <INPUT TYPE="hidden" VALUE=$data name='data'> 名前が無くちゃダメ  (><)」 ~~~~~~~~~~~~ <INPUT TYPE="hidden" VALUE="touroku" name="mode"> <INPUT TYPE="submit" VALUE="この内容で投稿する"> <INPUT TYPE=button VALUE='戻 る' onClick=' history.go(-1)'> </FONT> </BODY> </HTML> END_OF_KAKUNIN } ~~~以下省略~~~ といった感じでしょうか。 もちろん、登録確認前の入力画面のHTMLのFORMタグの中に、 <INPUT TYPE="hidden" VALUE="kakunin" name="mode"> といった感じの物を書く必要がありますが。 ちなみに、ファイルロック、まともに考えると難しいですよね~。 いろいろ方法があるんですけど、考えるの面倒なんで、DB使ってます。 でも、イントラでしか使えませ~ん。

tyabudai
質問者

お礼

ありがとうございました。 皆様のアドバイスのおかげで、ようやく完成しました。 まだまだ機能的に追加していくものもありますが、 とりあえずは一段落つきました。 全く理解不足でしたが、大変勉強になりました。 本当にありがとうございました。 ながくなりますが、私みたいな人のために(いないか??) ソースを掲載します。 また、さらにソースに問題点があった場合のことを考え、 しばらくは締め切らないままにします。 -----------test.cgi-------------------------- #!C:Perl\bin\perl # ライブラリの読み込み require 'cgi-lib.pl'; # デコードサブルーチンの呼び出し &ReadParse(*form); # ライブラリ require 'jcode.pl'; # 文字コード変換サブルーチン &jcode'convert(*form,'sjis'); # 連想配列から値だけを取り出し、区切り文字を追加 $data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n"; if ($form{'mode'} eq 'kakunin') {&kakunin;} elsif ($form{'mode'} eq 'touroku') {&write;} else {&error_print;} # ----確認画面の表示サブルーチン----------- sub kakunin { print "Content-type:text/html\n\n"; print << "END_OF_KAKUNIN"; <HTML> <HEAD> <TITLE>投稿内容確認</TITLE> </HEAD> <BODY> 以下の内容で投稿します <BR><BR> 名前は $form{'name'} <BR> メールアドレスは $form{'mail'} <BR> 映画のタイトルは $form{'title'} <BR> 投稿記事の内容は <BR> $form{'topic'} <BR> <form method="POST" action="test.cgi"> <input type="hidden" name="name" Value="$form{'name'}"> <input type="hidden" name="mail" Value="$form{'mail'}"> <input type="hidden" name="title" Value="$form{'title'}"> <input type="hidden" name="topic" Value="$form{'topic'}"> <INPUT TYPE="hidden" VALUE="touroku" name="mode"> <INPUT TYPE="submit" VALUE="この内容で投稿する"> <INPUT TYPE="button" VALUE="戻 る" OnClick=" history.go(-1)"> </FONT> </BODY> </HTML> END_OF_KAKUNIN } # ---------書込みサブルーチン---------- sub write { # 追加書き込みモード open(ENQ, ">>test.log") || die "File が開けません。"; #flock(ENQ, 2); print ENQ $data; #flock(ENQ, 8); close(ENQ); &write_ok; #書込み完了メッセージ } # --------- 書込み完了時のサブルーチン---- sub write_ok { print "Content-type:text/html\n\n"; print << "END_OF_OK"; (略) END_OF_OK } # ----------- エラー表示サブルーチン --------- sub error_print { print "Content-type:text/html\n\n"; print << "END_OF_ERROR_PRINT"; (略) END_OF_ERROR_PRINT } -----------------ここまで--------------------

その他の回答 (3)

noname#32059
noname#32059
回答No.3

書き込みサブルーチンのデータを書き込んだあとに ----見本---- Print "Content-type:text/html\n\n"; Print<<EndOfSubRou; <html> てきと~にめっせーじ </html> EndOfSubRou ---見本終わり--- ってなかんじでHTMLを出力するスクリプトを追加するとかはどうでしょう。

tyabudai
質問者

補足

アドバイスありがとうございます。 上記の内容は 'sub write' の最後にある '&write_ok' のサブルーチンのこととはまた違う処理でしょうか? 記述は省略してしましましたが、'sub write_ok' では 書込み完了メッセージを表示しています。

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.2

こんにちは。 ソースを拝見させていただきましたが、 その方法では何度ボタンを押しても確認画面に飛んでしまうと思います。 test.cgiの中で、「区切り文字の追加」をした後に Kakuninサブルーチンに飛んで、その後exitしているからです。 私はこういった場合、フォームの中にmode、act等という名前を付けたデータを hiddenで隠し持たせています。 例:)<INPUT TYPE=hidden NAME=mode VALUE=kakunin> こうするとその値によってジャンプするサブルーチンを変えることができますよね? 確認画面の表示の仕方は、今のままで問題ないと思いますよ。 頑張ってください。

tyabudai
質問者

お礼

ありがとうございました。 皆様のアドバイスのおかげで、ようやく完成しました。 全く理解不足でしたが、大変勉強になりました。 本当にありがとうございました。 これからもよろしくお願いいたします。

  • ron3
  • ベストアンサー率35% (7/20)
回答No.1

CGIと、FORMタグの考え方がわかっていますか? わかっているものとして書きます。 そんなに難しいことではありません。 1.で入力した物を表示する。 そして、その確認画面の FORMタグの中身として、 inputタグのtypeをhiddenにして持たせてやる。 hiddenは、 inputタグの入力フォームの値を 隠してセットしてやるものと考えるといいでしょう。 あまりにも入力項目が多いとき、 2画面に分けたりするのに使ってもいいかも知れません。 そして、登録する場合は、 1.の登録のボタンと同じ方法で、 ボタンを使ってやるだけでOKです。 もうひとつの方法としては、 1.で、登録したものを仮データとして、 サーバがわの仮登録ファイルに書きこむ。 確認画面を表示し、 確認後、ファイルを書きこむ。 その後仮登録ファイルは削除。 また、確認画面までいった後、 ほったらかしにされたファイルを古い物は削除する という処理が必要です。 質問が、簡略すぎるので、 ・どれぐらいわかるか(作ったことがある。設定をいじったことがある) ・言語は何か(CGIだからperlでしょうけど。) ぐらい書くと、質問の解答がしてくれやすいです。 これだけだと、サンプル作成が結構つらいような気もします。 ということで。 勉強には、 http://tohoho.wakusei.ne.jp/www.htm が一番です。 がんばってください。

参考URL:
http://tohoho.wakusei.ne.jp/www.htm
tyabudai
質問者

お礼

アドバイスありがとうございます。 CGIはPerlで作成してます。 学び始めたばかりですが、参考書片手に簡単なものは 自作できました。 掲示板、カウンタなどです。 ファイルロックやセキュリティに関して理解が足りないので、自分のサイトでは借り物を使用してます。

tyabudai
質問者

補足

ながくなりますが、ソースを掲載します。 投稿フォームの確認ボタンが押されると起動するCGIです。 test.cgi ------------------------------------------- #!C:\Perl\bin\perl # ライブラリの読み込み require 'cgi-lib.pl'; # デコードサブルーチンの呼び出し &ReadParse(*form); # 投稿記事を保存するファイル名 $file = "test.log"; # ライブラリ require 'jcode.pl'; # 文字コード変換サブルーチン &jcode'convert(*form,'sjis'); # 連想配列から値だけを取り出し、区切り文字を追加 $data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n"; &kakunin; exit; # 確認画面の表示サブルーチン sub kakunin { print "Content-type:text/html\n\n"; print << "END_OF_KAKUNIN"; <HTML> <HEAD> <TITLE>投稿内容確認</TITLE> </HEAD> <BODY> 以下の内容で投稿します <BR> <BR> 名前は $form{'name'}<BR> メールアドレスは $form{'mail'}<BR> アドレスの掲載は $form{'mail_up'}<BR> 映画のタイトルは $form{'title'}<BR> 投稿記事の内容は $form{'topic'}<BR> <form method="POST" action="test.cgi"> <INPUT TYPE="hidden" VALUE=$data> <INPUT TYPE="submit" VALUE="この内容で投稿する"> <INPUT TYPE=button VALUE='戻 る' onClick=' history.go(-1)'> </FONT> </BODY> </HTML> END_OF_KAKUNIN } # ---------書込みサブルーチン---------- sub write { # 追加書き込みモード open(ENQ, ">>$file") || die "File '$file' が開けません。"; #flock(ENQ, 2); print ENQ $data; #flock(ENQ, 8); close(ENQ); &write_ok; } # その他のサブルーチンは省略。 -------------------------------------------- 私の想像では sub KAKUNIN で送信ボタンが 押されたときに sub write に処理が飛ぶようにしようと 思ったのですが、方法がわかりません。 もともとは &kakunin; exit; のところが &write; でした。 そもそも、確認画面の表示の仕方がおかしいのでしょうか? お手数かけますがよろしくお願いいたします。

関連するQ&A

  • メールフォームでの確認画面の表示方法

    お世話になっております。 htmlフォームで入力->cgi経由で確認->指定の宛先にフォーム送信と同時に.txtファイルに書込み というメールフォームを作成しているのですが、確認画面に関する以下の2点で困っています。 1)以下は省略していますが実際は確認項目が多いので、cgiにhtmlを書くのではなくconfirm.htmlという別のファイルを読み出して値だけを渡して確認を行いたいが上手く読み出せない。 2)確認画面から送信ボタンを押すと必須項目の入力がないとエラーが返ってくる。 1)に関して sub confirmを以下のように変えてみたのですが、なかなか読み込まれずそのままサーバエラーの表示が出てしまいました。 sub confirm{ my($code); $code = $form{'mode'}; open(CONF,"confirm.html"); while (CONF){ s/REPLACEKEY/$code/; print; } close(CONF); exit; }

    • 締切済み
    • CGI
  • 入力フォームでCGIを使用

    現在、HPを作成しているのですが、 不明な点があるので、教えてください。 入力フォームを作成しており、送信ボタンを押すと CGIサーバを経由し、データが送信され、受信できる はずなのですが、試しに適当に入力し、テストを行った のですが、うまくいきません。 送信を押すと「送信されました」という画面に変わるので 送信までは、うまく出来ていると思うのですが… (1)送信された内容をチェックするにはどうすればよいですか? (2)(1)においてCGIサーバを直接、見に行くとなった場合、  どのようにすれば、見に行くことができますか? CGIの仕組み自体あまり理解していないので、 できるだけわかりやすくお願いします。 長くなりましたが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • フォームの構築

    phpで以下のような流れのフォームをつくっています。 基盤となる流れで問合せでも会員登録でもフォームの流れは共通です。 1:入力ページ 2:確認ページ 3:送信完了ページ ※入力ページと確認ページでは、自分自身にPOSTしてます 入力ページで送信ボタンを押すとデータチェック(未入力や妥当性)を行います。 ここでエラーがあればエラーメッセージを各フォームの項目の下に表示しページ移管しません。 エラーがない場合にはPOST値をSESSIONに格納し確認ページへリダイレクトします。 ※確認ページの各項目の表示値はSESSION値を利用 確認ページのボタンは送信ボタンのみで戻るボタンは用意していません。必要であればブラウザの戻るで戻ります。 送信ボタンを押すと送信完了ページへリダイレクトしメール送信等の必要な処理を行います。 いちいちSESSIONを利用しないでPOSTで済ませるべきという意見もあるのですが一般的にどちらがいいのでしょうか? 確かにSESSIONを利用しない場合、処理は楽になる事もあるのですがPOSTした瞬間に ページ移管してしまうので各フォームの下にエラーメッセージの表示はできないですよね? また、hiddenを使う事によって目には見えないもののソース上では見れるので セキュリティ的にもあまりよくないという事もあるのでどちらがいいものか迷っております。 問題なく動作はしているので構築方法についてアドバイスやいい方法がありましたら教えてください!

    • ベストアンサー
    • PHP
  • 入力フォームについて

    CGIでメールフォームを作りましたが、 送信ボタンを押すと、以下のメッセージが表示されます。原因の検討はつきますでしょうか。 Not Found The requested URL /cgi-bin/xxxxxx.cgi was not found on this server. -------------------------------------------------------------------------------- Apache/1.3.27 Server at www.xxxxx Port 80 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 入力フォームの確認画面からの「戻る」について

    過去の質問とか参照して同じような件が出てくるのですが、今ひとつはっきりしないところがあるので質問させていただきました。 HTMLでアンケートなどの入力フォームを作り、送信ボタンのクリックでCGI(Perl)にて「確認画面」or「必須項目のエラーページ」を表示させているのですが、修正のために戻るボタンをクリックすると入力フォームで入力した情報がクリアされて、再度初めから入力しないといけません。これはブラウザの問題(?)によるところのようですが、その1台のマシンだけではなく、他のマシンとかで試してみると、入力情報がそのまま残って戻れる場合もあるようです。情報がクリアされる場合は再度そのページを読み込みに行っているからで初期化された状態になるそうです。 そこらへんを踏まえて以下4点回答を頂きたいのですが、 (1)戻るボタンで入力情報がクリアされてしまうのはプログラムで情報を保持したりしない限り防ぐことが出来ないのか? (2)入力情報がそのまま残って表示される場合とはどういう状態・設定の時なのか? (3)全てはブラウザの環境に起因しているものなのか? (4)Netscapeはどうなのか? 的確にお答え頂けると非常に助かります。 ※以上の動作を確認しているブラウザは全てIEで、バージョンは5.5もしくは6です。

    • ベストアンサー
    • CGI
  • フォームメール確認画面から戻るためには?

    perlを使って申込みフォームを作っています。ファイルとしてはa.htmlを使ってまずフォーム入力欄を作りました。 そこからa.cgiに飛ばして確認画面を作りました。そこからが問題です。もう一つamail.cgiを作りそこにいった時点で指定メールに送るように作ってあります。 しかしa.cgiで入力項目を確認してもらった時に入力項目が間違っていた場合に戻るボタンを設けなければいけませんが、戻るボタンでどのようにa.htmlにもどせばいよいのか解りません。 具体的にどのようなソースを使えば良いのか解らないのでどうか教えて頂けないでしょうか? お願します。

    • 締切済み
    • CGI
  • フォームメールでの通し番号

    CGIでフォームメールを作成しています。 フォームから入力された情報はサーバに残さずに、管理人のメールに送る仕組みです。サーバに情報は残さないのですが、管理人が受信したメールの件名に、通し番号を追加したいと思っています。 確認用のページの「送信する」ボタンをクリックして、カウントさせたらいいのかもしれませんが、書き方がよくわかりません。 カウントCGIを利用すればよい、というのはよく見かけるのですが、カウントだと、ページが表示されたときにカウントされていってしまうと思うのですが、送信のクリックボタンを押して、というようにするには、具体的にどのように記入すればいいのかがわかりません。 漠然とした内容で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGI+Sendmail:メールフォームについてです。

    前提:フォームがあるページのファイル名を「start.html」とします。 CGIとSendmailを用いてフォームを作り、送信ボタンを押すと、私のCGIだと「送信完了」というページが表示されるようにしてあります。そこで、その送信完了というメッセージ(表示)は、小さなウィンドウに表示して、start.htmlのページは変わらないようにしたいのです。 あるいは、小さいウィンドウを出さずに、送信完了というメッセージを表示したら、3秒後に自動でstart.htmlに戻るようにしたいのです。 いずれかの方法でCGIに記述したいと思っています。 追記すればいいソースを教えていただけないでしょうか? (CGI)送信完了のページ等は、 print" ・・・・・ \n"; という書式で書いています。

    • 締切済み
    • CGI
  • フォームの内容を確認画面で表示

    以前ご質問した内容で、改良したい部分があって、ご質問しました。 以前の質問は、 フォームで必要事項を入力してもらい(テキストやコンボなど)、「確認」みたいなボタンを押すと、入力した必要事項が確認できるものを作りたいのですが。 その値をメールで送信やDBに書き込むような作業はしない予定です。 単純に表示が出来ればOKです。 その画面を印刷して使用するものなので。 というものでした。 テキストボックスとコンボについては、出来ましたが、 チェックボックス、ラジオボタンの場合、どのように確認画面で表示すれば良いのかわからずご質問しました。 確認画面では、チェックボックスの値をテキストで表示するのではなく、 チェックボックスそのものを表示して、チェックの有無を確認できるようにしたいのですが(チェックをはずしたり出来る状態) 同じようにラジオボタンも選びなおせるようにしたいのです。 前回の投稿のURLはhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1014263 です。 使用したソースは、 michisanpoさんにお答え頂いたものを元にして使用しています。

    • ベストアンサー
    • Perl
  • 入力フォーム後の確認ページの作り方

    今、入力フォームを使ったWebページを作っています。 アンケートなどに回答すると、「これでよろしいですか?」と、 記入ミスが無いか確認できる画面が、送信ボタンを押すと表示 される場合がありますが、これってJavaScriptのみでつくるこ とは可能ですか?それともCGIを組み合わせないとダメですか?   入力フォームで入力された値をJavaScriptで作った変数に格納して、 その変数を別ページ(確認ページ)で読ませてこのようなページが できないものか考えているのですが、私の力量ではうまくいきませ んでした。   是非みなさんのお知恵をお借りしたいと思います。 よろしくお願いします。

    • 締切済み
    • CSS

専門家に質問してみよう