确保不重新提交 POST 的一种方法是使用与该发布会话关联的唯一标识符,例如,如果它是购物车,则当他们开始结账时,为该进程生成唯一 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 作为 key,但作为一个例子应该足够了。实际上,你会想要比这更深思熟虑的东西。
http://alexloney.com/post/