我有一个表单,在whmcs,我希望用户只能提交一次,所以他们不能提交和刷新重新提交…我正在考虑取消设置$_POST或重定向,但两者都不会在这种情况下工作,我将如何生成一个键,使它只可用一次?不能使用mysql。
为什么不在会话中存储一个随机密钥呢?这就是大多数CRSF令牌系统的工作方式:在加载表单时,生成密钥并将其保存在会话中,并将其包含在表单中。提交时,比较密钥并删除保存的密钥。
如果您只是不希望用户意外地重新提交已成功提交的表单,那么@zerkms的评论中的链接就是您想要的:http://en.wikipedia.org/wiki/Post/Redirect/Get
避免重复发布的最常见方法是
header('location: /'.$your_url_here);
在您完成您的操作后。所以你只需重定向到相同的页面,但没有$_POST。
在表单提交时设置会话或cookie,并事先检查它是否存在
如果你想要一个永久的检查,你也可以将信息存储在一个数据库中,比如他们的IP和浏览器,但这有它自己的问题,所以你永远不会阻止某人100%的时间
我知道这是一个老问题,但我最近有同样的问题。如果你想留在产品详细信息页面(例如),即使你在Post之后切换到另一个smarty模板文件,那么Post/Redirect/Get解决方案似乎都不能在WHMCS上工作。可能是因为它需要$_POST[id'],刷新后它就消失了。所以我能得到的最接近的是让它回到产品列表页面,这不是我想要的,也可能不是原始海报想要的。
我最终想出的解决方案是在表单提交后添加一个$_SESSION[submitted]
变量。你必须根据你正在做的事情自己弄清楚逻辑。
My Logic是这样的:
if ($_SESSION['submitted'] == 1 && !isset($_POST['somecustomkey'])) {
unset($_SESSION['submitted']);
}
这是在顶部,如果你的POST表单数据不存在,重置"提交"会话键。
然后在将信息写入数据库或其他地方之前添加检查。
if ($_SESSION['submitted'] != 1) {
//Do some stuff with $_POST form data
$_SESSION['submitted'] = 1;
}
我认为这很符合$_SESSION的预期目的,并且易于实现。