- ベストアンサー
2,3度連続して入る同データを1回分だけ有効
PerlでCGI(フォームに入力したデータをCSVに貯めています)を作っているのですが、送信フォームを2,3回クリックする人がいるので同じデータが入ってきてしまうので、制限をかけたいのです。 一定時間内に同じデータが入ってきたら1回しか有効化しないという制限を入れれば良いのでしょうが、記述の仕方がわかりません。 どなたかお知恵をお貸しください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
JavaScriptがオフの時の安全策、ということでしょうか? # フォームページをCGIで出力する、という仮定ですが・・・ 短時間に大量にアクセスされたりしないのなら、フォームページに hidden を設けて、これにフォームページ表示時の時間(timeの値)を埋め込んでみてはどうでしょうか。 で、CSVにもそのデータを入れておき、データを入れる際に同じ時刻のものがないかチェックする、という感じです。 CSVには時刻順になるようにデータを入れると、チェックも楽&軽くなります。 もし偶然の同時アクセスや、大量アクセスを心配するなら、時刻以外に $ENV{REMOTE_PORT} を入れてやると良いです。 この値は、クライアントごとにユニークになる(はず)ので、少なくとも時刻とダブルでチェックすれば、二重送信のチェックと、別クライアントからの同時送信をチェックできます。
その他の回答 (3)
- quenista
- ベストアンサー率28% (122/425)
>「文章の重複チェック」 文字列が、以前のデータと全く同じであれば、はじいてしまう方法です。 文字列が長いと、単純に全文比較をすると時間が掛かかったりしますので、検出方法を工夫しないと辛いかも...。 (例えば、文字列データのサムを作るとか...。)
お礼
ありがとうございます。 文字列の比較的短いところでチェックを取ってみます。
- a-kuma
- ベストアンサー率50% (1122/2211)
Javascript のカテゴリーでも質問をしているようですが、そちらの方で行う方が 安直にいけると思います。 CGI は、一回の要求毎にプロセスが起こされますから、基本的に「前回」を知ることが 難しいです。 Perl でやろうとするならば、Cookie に情報を残して、それをチェックするという ような感じになります。 ただ、何も考えないで実装してしまうと、一度に2~3回押したときと、次の2回目が う~んと後(例えば、次の日)の区別がつかなくなりますので、実装には注意が必要です。
補足
ありがとうございます。 CSVでデータを貯めているのでそこに毎回見に行って同じなものがあったらエラーを出すと言う方法をとるということをしなければいけないと考えています。 JSの方で一度試してみます。 ありがとうございました。
- quenista
- ベストアンサー率28% (122/425)
少し手間かも知れませんが、ここのサイトで使われてる「文章の重複チェック」を行って見られては如何ですか? 或いは、送信ボタン押下直後に一旦画面を送ってしまう方法も有りますが、 文章等の入力がある場合は、送信失敗の時にうっとしいと思いますね。
お礼
お答えありがとうございます。 ここのサイトで使われてる「文章の重複チェック」というのはドコのことでしょうか? 手間はいといませんので、教えていただければ幸いです。
お礼
回答ありがとうございます。 CSVには、登録された時間もとっているので同じ時間がないのかチェックをしてあったらエラーを出すという命令をいれるのですね? 少し勉強が必要なようです。 ありがとうございました。