PHP Version 5.0.3RC2
通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容。在PHP里如何避免这点?
弯路:
由于表单变量的内容由$_POST['name']引用,也许在处理完表单后,直接将$_POST['name']销毁(unset())即可。其实不然。
可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST['name'],刷新后,$_POST['name']还是会被赋值,一样有效。
解决:
利用PHP的Session。Session保存在服务器端,在PHP过程中改变Session变量的值后,即保存在服务器端,下次访问这个变量时,得到是新赋的值,所以,可以用一个Session变量记录表单提交的次数,大于1时,就不在处理表单中的数据。
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
session_start();
isset($_SESSION['submit_time']) or die ("no session");
if ($_SESSION['submit_time']==0){
print '<pre>';
print_r($_POST);
print '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';
print '</pre>';
$_SESSION['submit_time']=1;
echo $_SESSION['submit_time'];
} else {
print '<pre>';
print_r($_POST);
echo "However you have submitted";
print '</pre>';
}
} else {
session_start() or dir("session is not started");
$_SESSION['submit_time']= 0;
// isset($_SESSION['submit_time']) or die ("session var is not created");
// echo $_SESSION['submit_time'];
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
</select><br>
<input type="hidden" name="action" value="submitted">
<input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?>
上面的代码可以实现期望的功能,缺点是,没有明确销毁Session,这样,可能造成服务器上失效的Session文件依然保留。
分享到:
相关推荐
这样可以防止用户因为刷新页面而导致的重复提交。 表单令牌的实现原理是:在用户首次访问表单页面时,服务器生成一个唯一的令牌并存储在session或cookie中,同时将该令牌以隐藏字段的形式发送给浏览器。当表单提交...
此方法可以有效防止用户在页面跳转前重复点击提交按钮,但用户仍有可能通过浏览器的刷新功能来重复提交表单。 3. Token令牌法:这是一种服务器端解决方案,通过在表单中添加一个隐藏的Token字段,在提交数据时验证...
如果用户试图通过刷新浏览器页面或者多次点击提交按钮来重复提交表单,由于“fsess”的值在首次提交后已经更新为新的时间戳,因此再次提交时会因为时间戳不一致而被拒绝。 需要注意的是,为了确保时间戳能够正确...
在表单提交后,将用户重定向到另一个页面可以有效地防止用户按F5键或返回按钮重复提交表单。但是,如果用户在未完成跳转之前刷新页面,仍然可能会导致重复提交。 3. 数据库唯一索引约束。通过在数据库层面设置唯一...
在PHP编程中,防止用户因误操作或意外刷新页面导致的重复提交是一个常见的需求。当用户填写表单并提交后,如果不采取措施,再次刷新页面会导致同样的数据被再次提交到服务器,这可能会对数据库造成不必要的影响,...
这种方法的缺点在于,它只能防止用户在不刷新页面的情况下重复提交同一个表单,无法完全防止多次提交。 最后,使用数据库的唯一索引约束来防止重复提交是一种更加严格的措施。通过在数据库表中的关键字段上建立唯一...
如果不匹配,就认为是重复提交,提示用户不要刷新页面。 4.数据库唯一标识 对于数据库操作,可以在数据库表中设置唯一约束(如唯一索引),这样即使用户尝试多次提交,数据库也会阻止重复数据的插入。例如,如果...
通过Ajax,我们可以实现异步通信,使得用户在提交表单后无需等待页面刷新,提高交互性。 1. **防止重复提交** - 通常,重复提交可能因用户误操作或网络延迟而发生,导致数据库中出现重复数据。 - 在PHP端,一种...
使用JavaScript可以有效地防止用户在提交表单后因刷新页面而再次提交。一种方式是在提交按钮的`onClick`事件中,将按钮禁用并改变其值,让用户知道提交正在进行,例如: ```html 提交" type="button" onClick=...
在PHP开发中,防止表单重复提交是一个常见的需求,尤其对于处理重要数据或者涉及财务交易的表单尤为重要。重复提交可能会导致数据不一致,影响系统的正常运行。以下是一些常用的防止表单重复提交的方法: 1. **利用...
echo '请不要重复提交表单或刷新页面'; } ``` 这种方法的优势在于实现简单,只需记录和比较IP地址即可。然而,它也存在明显的局限性。首先,IP地址可能不是唯一的,尤其是在使用代理服务器或者动态IP分配的情况下...
本文将详细介绍一种基于Session的PHP防止表单重复提交的实现方法。 首先,我们要理解问题的本质:当用户点击表单提交按钮后,由于网络延迟或用户误操作,可能会导致表单数据被多次发送到服务器。为了防止这种情况,...
在Web开发中,表单重复提交...然而,为了确保系统的健壮性,开发者还应考虑其他可能的重复提交情况,比如浏览器的后退按钮、页面刷新等。通过结合前端控制和后端验证,我们可以构建出更可靠的防止表单重复提交的系统。
9. **表单重定向**: 完成表单处理后,可能会使用`header()`函数进行重定向,避免用户重复提交表单。重定向到成功页面、错误页面或者刷新当前页面都是常见的实践。 10. **响应式设计**: 当今的Web应用需要适应不同...
然而,当用户提交表单后,如果页面响应太慢或者用户认为操作失败而点击刷新按钮,就可能导致数据被重复提交。这种情况会给用户带来不良体验,同时也可能给服务器造成不必要的数据处理压力。 为了避免用户刷新导致的...
2. **浏览器刷新**:用户在提交表单后立即按下F5键刷新页面,浏览器可能会重新发送上一次的POST请求。 3. **回退/前进操作**:用户在提交表单后使用浏览器的回退和前进功能,可能导致表单数据再次提交。 **解决表单...