PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

【PHP】フォーム送信時の重複データ挿入を防ぐ方法を解説

はじめに

Webアプリケーションを開発していると、ユーザーが送信ボタンを連打したり、ページを再読み込みしたりすることで、同じフォームデータが何度もデータベースに挿入されてしまう問題に直面することがあります。このような重複送信(二重投稿)は、データの整合性を損なう原因となるため、適切な対策が必要です。

本記事では、PHPのセッション(session)を活用して、フォーム送信時の重複挿入を防止する方法を解説します。

仕組み:セッション変数とタイムスタンプによる制御

PHPセッションを使えば、短時間内の連続したPOSTリクエストを検出し、ブロックすることができます。具体的な流れは以下の通りです。

  1. POSTリクエストを受け取った際に、セッション変数(例:$_SESSION['posttimer'])に現在のタイムスタンプを保存します。
  2. 次にフォームが送信されたとき、処理を行う前に $_SESSION['posttimer'] の存在を確認します。
  3. 前回のPOSTからの経過時間が特定の秒数(例:2〜3秒)以内であれば、重複送信とみなして処理をスキップします。

この方法により、実際に重複している挿入処理を識別し、除外することが可能になります。

サンプルコード

1. シンプルなフォーム(form.html)

// form.html
<form action="my_session_file.php" method="post">
    <input type="text" name="bar" />
    <input type="submit" value="Save">
</form>

上記のフォームは、テキスト入力欄と送信ボタンを持つごくシンプルな構成です。送信先として「my_session_file.php」が指定されています。

2. 重複送信をチェックするPHP側の処理

「my_session_file.php」には、以下のようなコードを記述します。

if (isset($_POST) && !empty($_POST)) {
    if (isset($_SESSION['posttimer'])) {
        if ( (time() - $_SESSION['posttimer']) <= 2) {
            // 前回のPOSTから2秒以内 → 重複送信として無視する
        } else {
            // 前回のPOSTから2秒以上経過 → 正常な送信として処理する
        }
    }
    $_SESSION['posttimer'] = time();
}

実行結果

このコードを実行すると、以下のように正常な送信のみが処理されます。

The unique form submitted data.

コードの解説

処理のポイントを整理しましょう。

  • タイムスタンプの記録: POSTリクエストを受けるたびに、time() 関数で現在の時刻を取得し、その値をセッション変数 $_SESSION['posttimer'] に代入します。
  • 時間差の判定: 次回以降の送信時に、現在時刻と保存されたタイムスタンプの差分を計算します。差分が2秒以下であれば、直前のPOST操作からの再送信と判断され、そのデータは破棄(除外)されます。
  • 正常な送信の扱い: 差分が2秒を超えていれば、ユーザーの意図的な新規送信とみなし、通常どおりデータを保存します。

注意点と補足

この手法はシンプルで効果的ですが、実運用では以下の点にも留意してください。

  • セッションの開始: セッション変数を使用する前に、必ず session_start() を呼び出す必要があります。
  • トークン方式との併用: ワンタイムトークン(CSRFトークン)をフォームに埋め込む方法と組み合わせると、より堅牢な重複送信対策になります。
  • 待機時間の調整: 許容秒数(ここでは2秒)は、アプリケーションの特性に応じて3秒などに調整可能です。

まとめ

PHPセッションにタイムスタンプを記録し、前回のPOSTからの経過時間をチェックすることで、フォームの重複送信による不要なデータ挿入を簡単に防ぐことができます。まずは本記事のコードを参考に、自身のプロジェクトに組み込んでみてください。

  1. Windows 10でタイピング中にタッチパッドが反応するのを防ぐ設定方法

    かつて、仕事も勉強も趣味の時間も、そのすべてをノートパソコンでこなしていた時期がありました。あの持ち運びの自由さと利便性は今でも懐かしく感じますが、ただひとつ、絶対に懐かしくないものがあります。それは、ノートパソコンのキーボードでのタイピングです。 キーボード自体に問題があるわけではありません。イライラさせられるのは、タッチパッドによる誤操作の方です。せっかくスムーズに入力していても、気づけばカーソルが画面上の見知らぬ場所へ飛んでしまい、作業の流れが断ち切られる——これは本当にストレスです。 実はWindowsには、タイピング中にタッチパッドの操作を一時的に無効化する機能が標準で備わっていま

  2. OneDriveで複数のファイルを削除する際に通知を表示する方法

    ローカルPC上のOneDriveから5個、10個、あるいは任意の数のファイルを削除する際に通知を表示したい場合は、この記事の手順を参考にしてください。この設定は、ローカルグループポリシーエディター(GPEDIT)またはレジストリエディター(REGEDIT)を使用することで有効化できます。 例えば、一度に10個や15個のファイルを削除したときに通知を受け取りたいとしましょう。残念ながら、OneDriveの設定パネルにはこのような項目は組み込まれていないため、REGEDITかGPEDITのいずれかを使う必要があります。なお、GPEDITの方法を使う場合は、あらかじめローカルグループポリシーエディタ