電子書籍の厳選無料作品が豊富!

Perlでプログラミングしています。
あるフォームがあって名前とか住所とかを入力し、登録ボタンを押すとPerlCGIに内容が送られて、それらをファイル保存するシステムなのですが、せっかちな人が登録ボタンを何回もクリックすると、ファイルに重複登録されます。
あるいは、登録完了という画面から、戻るボタンでフォームに戻って、再度登録ボタンをクリックしても重複登録されます。
これらの重複登録を阻止する方法はないでしょうか。

A 回答 (4件)

#! c:/perl/bin/perl


require './jcode.pl';
&decode;
if($in{'mode'} eq "shori") { &shori; }
&html;
sub html {
&header;
print <<"EOM";
<form action="./test.cgi" method="post">
<input type="hidden" name="mode" value="shori">
名前:<input type="text" size="8" name="name"><br>
住所:<input type="text" size="20" name="jusho">
<input type="submit" value="登録">
</form>
EOM
&footer;
exit;
}
# ≪登録処理画面≫
sub shori {
open(IN,"./test.dat");
@touroku=<IN>;
close(IN);
foreach(@touroku) { ($name,$jusho)=split(/<>/);
if($in{'name'} eq "$name") { &error("二重投稿しています");}
}
open(OUT,">./test.dat");
print OUT ("$in{'name'}<>$in{'jusho'}\n");
print OUT @touroku;
close(OUT);
&header;
print "登録が終了しました\n";
&footer;
exit;
}

こんな感じですれば二重投稿の防止が出来ます
(簡単に作ってるので後は改造してください(^^)w

一番先頭のperlの設定
&decord; →デコード部です
&header; →ヘッダー部です
&footer; →フッター部です
&error →エラー部です
open-fileのdie部
これらはsouta_nさんのスクリプトを使ってください
    • good
    • 0

追記


≪登録処理画面≫6行目
if($in{'name'} eq "$name") { &error("二重投稿しています");}



if($in{'name'} eq "$name") { &html;}

にすると二重投稿したときには登録処理画面に行かずに即座に登録画面に戻りますのでファイルに重書き込みすることはなくなります
・・・が登録者にとっては登録が出来たのか確認が取れないのであまりお勧めはできません(--;)

他の方法としては
# ≪登録処理画面≫
sub shori {
open(IN,"./test.dat");
@touroku=<IN>;
close(IN);
foreach(@touroku) { ($name,$jusho)=split(/<>/);
if($in{'name'} ne "$name") { push(@touroku0,"$_"); }
}
open(OUT,">./test.dat");
print OUT ("$in{'name'}<>$in{'jusho'}\n");
print OUT @touroku0;
close(OUT);
&header;
print "登録が終了しました\n";
&footer;
exit;
}

とすることができます @touroku0 はなんでもいいです
これだとファイルを見て同じ名前だったら省いてまた新たに書き込むという方法です
    • good
    • 0

登録処理の前に重複チェックを入れてみてはいかがでしょうか?


送信されたデータの内容とファイルを比較して一致するデータがある場合
登録処理が行われないようにすれば、重複は防げると思います。
ボタン連打はjavascriptを使用して一度クリックされたらクリック無効にする処理を入れてあげたらある程度は防げると思います。
    • good
    • 0

100%というのは難しいのですが、99%阻止することはできるかな。

。。
JavaScriptを使って、Click済み変数を用意しておいて、onClickでその変数に値を入れるようにする。
CGIから戻ってきたらその変数をクリアする。
のようにすれば良いのではないかと思います。

もしくは、フォーム送信データに時刻データも入れておいて、
データ登録時に「要求された時刻」を登録時の時刻と比較して、
システム的にあり得ない近似した時刻であれば、処理をしない
とか。

この回答への補足

お応えありがとうございます。

> JavaScriptを使って、Click済み変数を用意しておいて、onClickでその変数に値を入れるようにする。

出来ればそのJavaScriptかんたんなコーディング例など教えていただけないでしょうか。

補足日時:2007/01/15 12:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!