如何避免页面刷新导致数据重复写入数据库

当表单的数据是提交给本页面处理并写入数据库时,点提交后,刷新页面的话使数据重复写入数据库。解决方案有如下几种:

一、把一页面分开为两个,数据提交给另一个页面处理,之后再跳转到输入页面。

总的说来,这是一种不错的解决方案。但是要防止用户使用浏览器的返回按钮返回上一页,然后再刷新页面,重复插入数据。

1
2
3
4
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {  
// 处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php'); //效果与JSP里面的sendRedirect类似
}

二、在数据入库之前执行一次验证查询,看数据库里是否已经存在了相同的记录,由此来决定是否写入数据。

三、利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。例:

A页面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
session_start(); //根据当前SESSION生成随机数
$code = mt_rand(0,1000000);
$_SESSION['code'] = $code; //将此随机数暂存入到session
?>

<form id="form1" name="form1" method="post" action="t2.php">
说明:
<input type="text" name="titile" />
<input type="hidden" name="originator" value="<?php echo $code;?>">
<input type="submit" name="Submit" value="提交" />
</form>

B页面的代码:

1
2
3
4
5
6
7
8
9
10
11
<?php  
session_start();
if(isset($_POST['originator'])) {
if($_POST['originator'] == $_SESSION['code']){
echo "ok";
unset($_SESSION["code"]); //将其清除掉此时再按F5则无效
}else{
echo "请不要刷新本页面或重复提交表单";
}
}
?>

最近我有一个点击领红包的项目,第一页有一个【领红包】的按钮,它的url是:/index/add_hongbao/用户id,当我点击这个按钮后,它就会到控制器找到add_hongbao方法,这个方法会执行insert操作,往数据库中插入一条中奖纪录,然后再返回一个中奖的提示页面,可是在这个页面上就出问题了。因为这个提示页的url正是/index/add_hongbao/用户id,因此只要重复刷新页面,就能不断的向数据库中重复插入记录!因为一个用户可以领取多个红包,所以不能根据用户id判断是否允许再次插入数据。这个时候就只能用页面跳转这个方法了,当我执行了add_hongbao()这个方法插入记录后,使用head()方法跳转到/index/add_hongbao2,这个方法没有数据库操作,只返回中奖的提示页,这样就可以防止用户进行页面的重复刷新了。

扩展阅读:JQuery脚本-通过禁用按钮防止表单重复提交