我想知道我可以使用哪些技术来避免用户在刷新页面并选择再次提交时两次发布表单?
e.g。我在 regiter.php 中有表格并在 register.php中处理它。
第一次我可以处理另一个文件,例如 register_process.php 并重定向到register.php,但是我必须创建大约20个新页面并重新定位大量代码,我不想要这个选项。
第二次我可以玩headers
我不记得确切的伎俩,但有一些不好的经验 - 用户在刷新后看到页面上的旧数据......
第三次我可以将成功重定向到某些 dummy.php ,然后从 dummy.php 重新导向 register.php 那么即使他们刷新页面浏览器也不会重新发布,但是它不会使用后退按钮来保护他们并选择重新发布,我知道我可以使页面过期,但我发现我和其他用户看到页面过期错误的烦人体验。
第4次为每个表单使用一些独特的“访问密钥”,一旦页面加载,将使用表单发布,一旦使用不能重复使用,但我有点挣扎于该功能的逻辑。知道如何使用密钥而不将其存储在MySQL数据库中,我认为基于时间的连接不是很好,因为有些用户可以在页面打开和表单提交之间花费很长时间。
我需要更多建议,以避免用户再次重新发布表单。
答案 0 :(得分:2)
试试这个:
<?php
session_start();
if( strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) {
$_SESSION['postdata'] = $_POST;
header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
exit;
}
if( isset($_SESSION['postdata'])) {
$_POST = $_SESSION['postdata'];
unset($_SESSION['postdata']);
}
这基本上会保存POST数据并导致浏览器重新请求作为GET请求。
答案 1 :(得分:1)
第五。使用AJAX或jQuery,当在页面上单击表单时,在后台提交该数据。输出对屏幕的响应。将表单标记为已提交,或保存到会话中,当他们刷新时,他们将无法再次提交表单。
在我看来,无论如何这是最好的方式。我有一个包含20个或更多表单的记分牌,它可以很好地发送数据而无需刷新。您可以返回响应并使页面看起来非常专业。使用jQuery,您还可以使用一些很棒的表单验证来确保他们提交所需的字段。
答案 2 :(得分:0)
当您考虑第一个选项时,我不了解您网站的设计(编程设计^^),但您只需要1页。假设您使用所有参数调用redirect.php,您应该调用控制器,控制器应该知道无论参数如何处理它们。
在编程时能够做一些抽象和良好的设计是一个好习惯,它在这种情况下有很多帮助。
答案 3 :(得分:0)
我认为最好的解决方案是这样的:
*创建发布数据的md5或base64
*将此哈希值与会话变量进行比较(让我们称之为$ _SESSION [&#39; repost&#39;])
*如果哈希值匹配,则跳过此保存应执行的任何操作并输出警告
*如果哈希不匹配,或哈希不存在
*使用当前散列分配会话变量
*做任何应该做的事情
答案 4 :(得分:0)
其他方式是将最后一篇文章存储在会话变量中,并检查是否相等,如下所示:
<?php
... program ...
if ($_SESSION['PREPOST'] == $_POST) {
// DO SOMETHING
}
... program ...
$_SESSION['PREPOST'] = $_POST;
?>