• ベストアンサー

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

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

  • Perl
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • ボタン2回押しを無効にしたい

    フォームを作っているのですが、送信フォームを2,3回クリックする人がいるので制限をかけたいのです。 ・ボタンを2回以上押すと2回目以降の送信を無効化する ・一定時間以内に何度送信ボタンを押しても1回しか有功化しない のいずれかになると思うのですが、制限のかけ方が分からなく困っております。 JavaScriptで入力チェック(onClickで外部JSファイルのformSendを呼びにいきます)を別に行っているので、現在送信ボタンタグは下記のようになっています。 <input type="button" value="送信" onClick="formSend()"> どなたかお知恵をお貸しください。

  • 何度もすみません…★

    この質問は2回目なのですが、どうしても分からず 再び質問させて下さい…。 そして、どなたかお力を…。 以下のようなサイトを製作中でして… 【記事Aページ】   【記事Bページ】   【記事Cページ】  ↓              ↓        ↓  → → 【問い合わせフォーム】 ← ← この時、例えば記事Aページから 入力フォームページへアクセスしたとします。 すると入力フォームには、以下の様な画面が 表示され… 記事A 名前【  】 性別【  】 《送信》《取消》 記入事項を埋めて《送信》をクリックすると、 以下の様な確認画面が表示され… 記事A 名前【xxx】 性別【xxx】 《送信》《戻る》 そして、送信されたメールには… 記事A 名前 xxx 性別 xxx と、表示される。 と、このようなページを作りたいと考えております。 そこで分からないのは、記事Aという項目を、 入力フォームにアクセスした段階で、 フォームには既に表示されていて、 尚且つ送信内容に含ませる方法です。 フォームへのリンクのURLの末尾に記事Noを記述し フォーム側のCGIで受け取り表示する…とは聞いたものの、やり方がまったく分かりません。 CGIはPerlを使用しています。 やはり、記事ごとにフォームを 用意しなければ駄目でしょうか?

  • フォームメールのCGIスクリプトを探しています。

    ホームページで下記のようなフォームメールを使いたくて 探しているのですがなかなか見つかりません。 もしご存知の方がいらっしゃいましたら場所を教えてください。 ・フォームの入力内容をCSV形式で受け取れる ・画像の添付が出来る(出来たらサイズ制限機能付) ・送信者にも確認メール送信(CSVは管理者のみ) ・1つのCGIで複数のフォームが設置可能 ・出来たら無料で・・・^^; PERLのバージョンは5.8.0 SENDMAILは利用可能です。

  • 勝手に白紙のメールが送信されてしまう。

    お問い合わせフォームにPerlのsendmailを使用しています。JavaScriptとCGIの両方で入力制限をかけ、未入力があると送信できないような設定にしてあるのですが、全て白紙(未入力)のメールが送られてきてしまいます。制限をかけているので、送られてくるはずはないと思うのですが…。制限の仕方が甘いのでしょうか?このようなことはあるのでしょうか?

    • 締切済み
    • CGI
  • CSVファイルをCGIでダウンロード

    Perlを使ってCGIを書いています。 申し込みフォームを送信すると、CSVファイルに書き込むのとメールで送信するというCGIを作りました。 そこで、その作ったCSVファイルをFTPソフトを使うのではなく、ブラウザ上でCGIを使ってダウンロードしたいのですが、どうしたらよいのでしょう? 環境は OS:Linux、PerlのバージョンはPerl5です。

    • ベストアンサー
    • CGI
  • フォームcsvで正常にデータが反映されない

    いつもお世話になっています。 perlで作ったcgiフォームなのですが(jcode.plを使ってます)、どうも正常にデータが反映されていないようなのです。記述してもらった内容が途中で切れてしまっています。いくつか思い当たる節があったので、実験してみたところ半角二重引用符"があるとこれも含めて以降の内容が消失してしまっているようです。入力してもらっている方はドイツの方で、"を使う機会が多いように思います。対策を教えていただけたらと思います。 たとえば、【R\"ockner etc etc ...】と入力すると、csvファイルの該当箇所は【R\】とだけなって、後は消えてしまってます。 一応確認画面を出すようにしていて、そこでは問題なく画面に全文が表示されていますので、確認画面へは正常にデータが反映しているのに不思議で仕方ありません。cgiは拾ってきたソースを適当に改変して作っているので、あまり深い知識がないのですが、csvファイルに書き込む段階でエンコードかデコードが失敗してしまっているのでしょうか。他にもトラブルが起きそうな文字などがあったら教えていただけると大変助かります。

    • 締切済み
    • CGI
  • パッケージとモジュールについて

    こんにちは。Perlを学習し始めた初心者です。 Perl 5.87を使っており、標準モジュールを使う方法を書籍で読みました。 例えば、フォームに入力、送信されたデータを処理するために use CGI; と最初に記述して使うことができますが、 別のエラー処理の構文を見ると $CGI::POST_MAX と1行目に記述してあります。 パッケージとモジュールの概念が、よく分かっていないので戸惑って います。 C:\perl\lib にある、CGI.pmというモジュールを使用していると思う のですが、use CGI;と記述するときと $CGI::と記述するとき、何が異なるのでしょうか? 後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? パッケージという言葉を見ても、よく分からずネットで随分調べましたが、余計に分からなくなってしまいました。 お忙しいところ申し訳ありませんが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • CGIでフォームデータを取得できません

    CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }

    • 締切済み
    • CGI
  • フォームデータ-の送信時の確認画面の表示方法

    初めて質問させていただきます。 perl初心者です。 メールフォームの確認画面の出ないものを作成し(mail.cgi)問題なく稼動していますが何かと不便なので 確認画面のを表示させたいのですがどうすれいいのか 教えていただきたいです。 現在はフォームより送信されてきたデータ-をそのままメール送信しています。 perlでフォームデータ-を読める形に整形し表示するまではできています。 ここから先が分かりません。 いろいろ調べましたが分からず書かせて頂きました。 どなたか よろしく御願いいたします。

    • ベストアンサー
    • Perl
  • 付随データ 読み込み

    恐れ入ります。 MySQLで、 perlを使ってfrorm送信してデータを保存する際に、 フォーム上にコードを入力すると、 そのコードに付随したその他情報が、いくつかのフォーム上に現れるようにしたいのですが、方法はありますか? 04343 を入力 ↓ MySQL上の、04343番に紐づいたデータをその他input フィールドに表示 ↓ 送信 よろしくお願いします。