• ベストアンサー

2,3度連続して入る同データを1回分だけ有効

PerlでCGI(フォームに入力したデータをCSVに貯めています)を作っているのですが、送信フォームを2,3回クリックする人がいるので同じデータが入ってきてしまうので、制限をかけたいのです。 一定時間内に同じデータが入ってきたら1回しか有効化しないという制限を入れれば良いのでしょうが、記述の仕方がわかりません。 どなたかお知恵をお貸しください。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

JavaScriptがオフの時の安全策、ということでしょうか? # フォームページをCGIで出力する、という仮定ですが・・・ 短時間に大量にアクセスされたりしないのなら、フォームページに hidden を設けて、これにフォームページ表示時の時間(timeの値)を埋め込んでみてはどうでしょうか。 で、CSVにもそのデータを入れておき、データを入れる際に同じ時刻のものがないかチェックする、という感じです。 CSVには時刻順になるようにデータを入れると、チェックも楽&軽くなります。 もし偶然の同時アクセスや、大量アクセスを心配するなら、時刻以外に $ENV{REMOTE_PORT} を入れてやると良いです。 この値は、クライアントごとにユニークになる(はず)ので、少なくとも時刻とダブルでチェックすれば、二重送信のチェックと、別クライアントからの同時送信をチェックできます。

milktea_
質問者

お礼

回答ありがとうございます。 CSVには、登録された時間もとっているので同じ時間がないのかチェックをしてあったらエラーを出すという命令をいれるのですね? 少し勉強が必要なようです。 ありがとうございました。

その他の回答 (3)

  • quenista
  • ベストアンサー率28% (122/425)
回答No.4

>「文章の重複チェック」 文字列が、以前のデータと全く同じであれば、はじいてしまう方法です。 文字列が長いと、単純に全文比較をすると時間が掛かかったりしますので、検出方法を工夫しないと辛いかも...。 (例えば、文字列データのサムを作るとか...。)

milktea_
質問者

お礼

ありがとうございます。 文字列の比較的短いところでチェックを取ってみます。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

Javascript のカテゴリーでも質問をしているようですが、そちらの方で行う方が 安直にいけると思います。 CGI は、一回の要求毎にプロセスが起こされますから、基本的に「前回」を知ることが 難しいです。 Perl でやろうとするならば、Cookie に情報を残して、それをチェックするという ような感じになります。 ただ、何も考えないで実装してしまうと、一度に2~3回押したときと、次の2回目が う~んと後(例えば、次の日)の区別がつかなくなりますので、実装には注意が必要です。

milktea_
質問者

補足

ありがとうございます。 CSVでデータを貯めているのでそこに毎回見に行って同じなものがあったらエラーを出すと言う方法をとるということをしなければいけないと考えています。 JSの方で一度試してみます。 ありがとうございました。

  • quenista
  • ベストアンサー率28% (122/425)
回答No.1

少し手間かも知れませんが、ここのサイトで使われてる「文章の重複チェック」を行って見られては如何ですか? 或いは、送信ボタン押下直後に一旦画面を送ってしまう方法も有りますが、 文章等の入力がある場合は、送信失敗の時にうっとしいと思いますね。

milktea_
質問者

お礼

お答えありがとうございます。 ここのサイトで使われてる「文章の重複チェック」というのはドコのことでしょうか? 手間はいといませんので、教えていただければ幸いです。

関連するQ&A