WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:入力データを保存したまま前の入力ページに戻る方法

natu [WriteDate : Tue Jun 12 12:07:15 2001]


入力画面でデータを入力後、送信したとき、入力内容のチェックをCGIでかけています。
入力に不備があればもとのページにもどして再入力させたいのですが、
CGIではどのような表記をしたらできますか?
<a href=\"$ENV{'HTTP_REFERER'}\">戻る</a>
これだと前のページには戻りますが、入力内容が残っていなく初期画面での表示になります。
何かいい方法あったら教えてください
      


natu [WriteDate : Tue Jun 12 12:21:09 2001]

<A HREF="javaScript:history.back();">前のページへ</A>
で解決しました。


YK [WriteDate : Tue Jun 12 12:37:51 2001]

<a href=\"$ENV{'HTTP_REFERER'}\" onClick=\"history.back(); return false\">戻る</a>
とか!


andi [WriteDate : Tue Jun 12 13:38:08 2001]

onClickを使用する場合は同時にonKeypressも使用した方が良いですね。


チャチャ入れ [WriteDate : Tue Jun 12 14:19:23 2001]

関連ネタです。
http://www.microsoft.com/JAPAN/support/kb/articles/J056/6/38.htm?LN=JA&SD=SO&FR=0


natu [WriteDate : Tue Jun 12 15:46:45 2001]

引き続きnatuです。
みなさん、いろいろありがとうございます。
私はいま、パソコン用と携帯用、どちらも同内容のものを作っています。
よーく考えたら(というかパソコンで作成している為すっかり忘れていた)携帯って、javaScript使えませんよね?
ってことは、
<A HREF="javaScript:history.back();">前のページへ</A>
では戻れないのかな?

YKさんが教えてくれた
<a href=\"$ENV{'HTTP_REFERER'}\" onClick=\"history.back(); return false\">戻る</a>
だと、携帯でも使えますか?


andi [WriteDate : Tue Jun 12 16:24:02 2001]

携帯"電話"では今の所JavaScriptに対応している物は知りませんが、
今後登場する可能性はあると思います。

携帯電話でも対応させたい場合は戻り先のリンクに前ページで
入力された値を含める方法が考えられます(例:hoge.cgi?name=natu)。

但しパケット通信料が多少余分に掛かります。


qz [WriteDate : Tue Jun 12 17:58:08 2001]

入力画面の生成も、CGIが行っているなら、素直に、
入力内容を、各フォームの値として、入れて表示して
あげれば良いのでは?
で、先頭のほうに、エラーメッセージを埋め込んでおけば、
いちいち、戻らなくて良いと思うんですが^^;

入力画面がHTMLというのなら、この方法はとれませんけど。


natu [WriteDate : Wed Jun 13 13:36:33 2001]

なるほど〜!
入力画面もCGIで作ってます。

ただ、やり方が少しわからないので教えてください。
今は入力画面CGI内のHTMLでFORMのACTIONで送信して
チェック用CGIに飛ばし、最終的にメールに送信してます。
これを一つのCGIですべて作成すればよいのですよね?

入力が終了したら、次は入力チェックをするわけですが、
このつながりがよくわかりません。
それぞれSUBルーチンを使用しているのですが、
流れとしては、
&print_browser();←入力画面
&check();←エラーチェック
&mail();
exit;
こうなります?
それとも&print_browser()の中で&check()を使用するのでしょうか?
入力画面で入力を(認識)した後に次のSUBルーチンへ移行する方法がわかりません。
現状ではHTML内の送信ボタンを押すことで入力データを
次のCGIに飛ばしていますがこれに代わる指示をどのように
表記したらいいのですか?


Qz [WriteDate : Wed Jun 13 15:27:39 2001]

どのあたりから説明すればよいのか、わからないので、基本的なところから、
かきますね。(長くなってしまった)

入力画面は、
<form ...>
入力項目
;
</form>
こんな感じになってるとします。
これに、hidden属性のinput項目を追加してあげます。
たとえば、こんな感じ。
<form ...>
<input type="hidden" name="action" value="send">
入力項目
;
</form>
で、submitされたら、CGI側でフォームの内容をデコードしてあげた時に、
このhidden属性の内容もとることができます。
このデコードの処理は自前なのか、CGI.pmをつかってるのか、cgi-lib.plをつかってるのか、別のものをつかってるのか、わかりませんが・・・
たとえば自前でつくってるとして、以下のような感じでデコードしてるとします。

sub query{
   my($que);
   $ENV{'REQUEST_METHOD'} eq 'POST' and read(STDIN, $que, $ENV{'CONTENT_LENGTH'});
   foreach(split(/[&;]/, $ENV{'QUERY_STRING'}), split(/&/, $que)){
       my($n, $v) = url_decoding(split /=/);
       $in{$n} = $v;
   }
}
sub url_decoding{
   my(@s) = @_;
   foreach(@s){
       tr/+/ /;
       s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("H2", $1)/eg;
   }
   wantarray ? @s : $s[0];
}

んで、最初に、query();を呼びます。
そうすると、連想配列の %in に入力内容および、先ほどのhiddenの内容が入ってきます。

$in{nameに指定した名前}という具合になります。
hiddenにつけた名前は、actionでしたから、

$in{action}

で、内容がとれます。
次に、if文でこの値を比較して、処理を分岐させます。

if($in{action} eq 'send'){
 check();
 mail();
}
print_browser();

んで、各サブルーチンは・・・

sub print_browser{
 my($err_msg) = @_;
 #いろいろ必要なもんを書いて・・
 #<html> - <body>とか
 if(defined $err_msg){
    #エラーがあったら・・・
    print $err_msg;
 }
 #いろいろ必要なもんを書いて・・
 #たとえば、
 print <<"___EndOfHtml";
<form ....>
<input type="hidden" name="action" value="send">
入力項目1:<input type="text" name="aaa" value="$in{aaa}">
入力項目2:<input type="text" name="bbb" value="$in{bbb}">
入力項目3:<input type="text" name="ccc" value="$in{ccc}">
;
;
</form>
___EndOfHtml
 #いろいろ必要なもんを書いて・・
 print "</body></html>";#とか
 exit; #サブルーチンでexitするのは好きじゃないけど・・・
}

sub check(){
 if(入力項目1のチェック){
    #NGだったら、
    print_browser('入力エラーその1')
 }
 if(入力項目2のチェック){
    #NGだったら、
    print_browser('入力エラーその2')
 }
 ;
 ;
}

sub mail{
 #メールの送信をして
 #ありがとうメッセージ(?)を表示して、
 exit; #サブルーチンでexitするのは好きじゃないけど・・・
}

という具合に書いてあげればいいです。
あまりきれいなコードじゃないですけど・・・


natu [WriteDate : Wed Jun 13 17:14:39 2001]

Qzさん、丁寧な説明どうもありがとうございます。
大変参考になります。今から一つずつ試してみたいと思います。
ただ、まだわからないところがありまして・・・
(すごく基本的なことで申し訳ありません)

<form>
<input type="submit" name="send" value="送信">
<input type="hidden" name="action" value="send">
</form>
この2つを入れておけばよいのですよね?

で、今<form>タグの中は
<FORM method="POST" action="check.cgi">
のような記述をしているのですが、この場合はaction="check.cgi"
の部分は不要になるのですか?
<input type="submit" name="send" value="送信">
この送信ボタンを押すだけで、データの受け取りできるのでしょうか?


natu [WriteDate : Thu Jun 14 11:48:27 2001]

再びnatuです。
私、少し勘違いしていたようです。
今朝改めて考えてみてわかりました。(Qzさん、すいません)
必要なものは
『入力画面CGI』
『入力データを受け取ってチェック&再入力表示するCGI』
の2つですよね?

『入力データを受け取ってチェック&再入力表示するCGI』
について、教えてください。

複数項目の入力チェックをかけて'全てOK'だったらメール送信したいので、
たとえば 入力項目1のチェックでNGだったら
print_browser('入力エラーその1')を表示して再入力してもらい、
今度は入力項目2のチェックをする。
NGだったら print_browser('入力エラーその2')で再入力・・・・・・
といったかんじ。

------質問その1--------
この場合、print_browser()からまたcheck()に戻すことは可能ですか?

------質問その2--------
入力項目1で再入力したデータはvalue="$in{aaa}"とは別ものになるからそれように変更した内容のprint_browser()を個別に用意しないといけない?

------質問その3--------
最初の『入力画面CGI』ですでにあるデータを
value="$in{zzz}"をつかって
『入力データを受け取ってチェック&再入力表示するCGI』に飛ばしています。
例えば、<input type="text" name="zzz" value="$in{zzz}">
としたら、
『入力データを受け取ってチェック&再入力表示するCGI』
では
<input type="text" name="zzz" value="$in{zzz}">
で値は反映されますか?

ややこしい話になってしまって(私だけが頭混乱しちゃってるのかなぁ?)ごめんなさい。
以上3点、教えてください。


qz [WriteDate : Thu Jun 14 22:13:26 2001]

><FORM method="POST" action="check.cgi">
><input type="submit" name="send" value="送信">

このふたつは、必要です。かくのが面倒なので省略しました^^

>『入力画面CGI』
>『入力データを受け取ってチェック&再入力表示するCGI』

ふたつにわけた場合、エラーをだして、さらに、前の入力内容を
表示させるのは、かなり難しいと思います(やってやれないことはないでしょうが・・・)

基本的に、入力画面と、再入力画面は、おなじもですね?
ちがうのは、エラーメッセージがあるかどうかということだけで。

>質問その1
すいません、よく意味がつかめないです。

>質問その2
ぬぬぬ?べつのものになる・・・って、どうしてなんでしょう?

>質問その3
反映されるとおもいますよ。

とりあえず、サンプルをつくってみました。

http://ca.sakura.ne.jp/~qz/samples/natu/sample1_cgi.txt
http://ca.sakura.ne.jp/~qz/samples/natu/sample2_cgi.txt

書き捨てスクリプトなので、かなりきたないコードですが・・・
参考にしてみてください。


natu [WriteDate : Fri Jun 15 12:17:39 2001]

Qzさん、こんにちは。
サンプルまで作って頂いて、すごく感激です。
質問の仕方がまずくてすいませんでした、が、
サンプルを見させてもらったら聞きたかったこと全て理解できました。
今度こそ、うまくいくかな?
ちなみに今日は私の誕生日なんです。
素敵なプレゼントありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]
ChaichanPAPA's World