SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

二重登録を防ぐ

いろんな実装が可能でしょうし、フレームワークレベルで対応しやすい方法などもいろいろでしょう。

次のサンプルは、よそから拾ってきた一例です。

この場合、複数ウインドウを開く場合など考慮しなければ、二重登録は防げます。
1、フォーム表示時点で、画面にhiddenにキーを、セッションにもキーを仕込んでおく。
2、登録処理のとき、画面から来たキーとセッションに格納されているキーを比較して、正しくフォーム表示の画面から遷移しているか確認する。

form.php

<?php
//二重登録防止フォーム-フォーム表示
session_start();
//session_regenerate_id();
//$taskId = session_id();
$taskId = mt_rand();
$_SESSION['taskId'] = $taskId;
print('<form action="submit.php" method="post">');
print('<input type="hidden" value="' . md5($taskId) . '" name="taskId" />');
print('<input type="submit" value="submit" name="submit" />');
print('</form>');

submit.php

<?php
//二重登録防止フォーム-登録処理
session_start();
$taskId = $_SESSION['taskId'];
unset($_SESSION['taskId']);
if (md5($taskId) == $_POST['taskId']) {
    //正常にsubmitされた時の処理
    print('きちんと前の画面からsubmitされています。');
} else {
    //二重登録された場合や、直接アクセスされた場合の処理
    print('フォームを通してアクセスして下さい。');
}

複数ウインドウ開いて使用するような場合にも対応するなら、もうちょっと作りこみが必要ですね。
フォームを複数立ち上げたら、複数のキーが発行されるわけで、その複数のキーをうまく格納しておいたり、登録処理時にチェックしたりする仕組みが必要です。

別の話になりますが、POST後にその続きでそのまま画面を表示するプログラムがよくあります。
登録処理後に、header(‘Location: 完了画面URL’); で完了画面にHTTPリダイレクトで遷移するようにしておけば、特別な対策なしでも完了画面をリロードされても問題なくなります。

関連するメモ

コメント