POST が再送信されないようにする方法の 1 つは、その投稿セッションに一意の識別子を関連付けることです。たとえば、ショッピング カートの場合、チェックアウトを開始するときに、そのプロセスの一意の ID を生成します。チェックアウトが完了したら (たとえば、POST が送信された場合)、使用できる ID からその ID を削除します。
フォームで一意のキーを生成することでこれを行うこともできます。フォームが送信された場合は、保存されている場所からそのキーを削除します。
<input type="hidden" name="key" value="<?php echo generateUniqueKey(); ?>" />
ここで、generateUniqueKey() 関数はテーブルをクエリして一意の ID を挿入し、ID を返します。フォームを処理しているページで、次のようにします。
<?php
$key = $_POST['key'];
if (isKeyStillValid ($key)) {
markKeyAsInvalid ($key);
// Process form ...
}
else {
die ("You have already submitted this form".);
}
?>
isKeyStillValid() 関数がデータベースをチェックして、フォームで使用されているキーがまだ使用可能なキーであることを確認し、markKeyAsInvalid() 関数がデータベースからキーを削除します。
更新:
これは、先ほど説明した内容を正確に含む、私が作成したばかりの例です。これは非常に単純な例であり、単純に SQL テーブルの自動インクリメント ID をキーとして使用していますが、例としては十分なはずです。現実的には、これよりももっと考え抜かれたものが必要になるでしょう。
http://alexloney.com/post/