`
dcj3sjt126com
  • 浏览: 1857907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP防止表单重复提交以及表单过期处理

    博客分类:
  • PHP
php 
阅读更多
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
1.使用客户端脚本
提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:
<form method=”post” name=”register” action=”test.php” enctype=”multipart/form-data”>
<input name=”text” type=”text” id=”text” />
<input name=”cont” value=”提交” type=”button” onClick=”document.register.cont.value=’正在提交,请等待…’;document.register.cont.disabled=true;document.the_form.submit();”>
</form>
 
当用户单击“提交”按钮后,该按钮将变为灰色不可用状态,如图5-6所示。
 
上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。
 
还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:
<script language=”javascript”>
<!–
var submitcount=0;
function submitOnce (form){
if (submitcount == 0){
submitcount++;
return true;
} else{
alert(“正在操作,请不要重复提交,谢谢!”);
return false;
}
}
//–>
</script>
<form name=”the_form” method=”post” action=”" onSubmit=”return submitOnce(this)”>
<input name=”text” type=”text” id=”text” />
<input name=”cont” value=”提交” type=”submit”>
</form>
在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。
 
2.使用Cookie处理
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码:
 
<?php
if(isset($_POST['go'])){
setcookie(“tempcookie”,”",time()+30);
header(“Location:”.$_SERVER[PHP_SELF]);
exit();
}
 
if(isset($_COOKIE["tempcookie"])){
setcookie(“tempcookie”,”",0);
echo “您已经提交过表单”;
}
?>
 
如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。关于Cookie的详细介绍,请参阅第10章“PHP会话管理”。
 
3.使用Session处理
利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交,请见如下代码:
 
<?php
session_start();
//根据当前SESSION生成随机数
$code = mt_rand(0,1000000);
$_SESSION['code'] = $code;
?>
 
在页面表单上将随机数作为隐藏值进行传递,代码如下:
<input type=”hidden” name=”originator” value=”<?=$code?>”>
在接收页面的PHP代码如下:
 
<?php
session_start();
if(isset($_POST['originator'])) {
if($_POST['originator'] == $_SESSION['code']){
// 处理该表单的语句,省略
}else{
echo ‘请不要刷新本页面或重复提交表单!’;
}
}
?>
 
4.使用header函数转向
除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。
if (isset($_POST['action']) && $_POST['action'] == ‘submitted’) {
//处理数据,如插入数据后,立即转向到其他页面
header(‘location:submits_success.php’);
}
 
这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。
 
5.表单过期的处理
在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。
 
5.1  使用header头设置缓存控制头Cache-control。
header(‘Cache-control: private, must-revalidate’); //支持页面回跳
 
5.2  使用session_cache_limiter方法。
session_cache_limiter(‘private, must-revalidate’); //要写在session_start方法之前
 
下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:
session_cache_limiter(‘nocache’);
session_cache_limiter(‘private’);
session_cache_limiter(‘public’);
session_start();
 
//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空
 
将该段代码贴到所要应用的脚本顶部即可。
 
Cache-Control消息头域说明
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
 
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。各个消息中的指令含义如下表所示:
 
缓存指令
说    明
 
public
指示响应可被任何缓存区缓存
 
private
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效
 
no-cache
指示请求或响应消息不能缓存
 
no-store
用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
 
max-age
指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
 
min-fresh
指示客户机可以接收响应时间小于当前时间加上指定时间的响应
 
max-stale
指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息
 
有关Session和Cookie的介绍,详细内容请参阅第10章“PHP会话管理”。
 
判断表单动作的技巧
表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。
 
其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮,以如下表单为例:
 
<FORM method=”POST” Action=test.php>
<input type=submit name=”btn” value=”a”>
<input type=submit name=”btn” value=”b”>
</FORM>
 
当使用者按下“a”按钮的时候btn=a,按下“b”按钮,则btn=b。
 
另外也可以通过提交按钮的名字(name)来判断,请见如下代码:
<FORM method=”POST” Action=test.php>
<input type=submit name=”a” value=”提交A”>
<input type=submit name=”b” value=”提交B”>
</FORM>
 
这样只要POST/GET的参数里面有a或b,就可以知道按下的按钮是哪个。
 
<?php
print_r($_POST);
?>

分享到:
评论

相关推荐

    thinkphp3.2 防止表单重复提交

    在Web开发中,防止表单重复提交是一个重要的问题,它能确保用户操作的唯一性和数据的一致性。ThinkPHP 3.2 是一个基于MVC模式的PHP开发框架,提供了丰富的功能来帮助开发者构建安全、高效的应用。在这个场景中,我们...

    自定义标签防止表单重复提交

    本文将深入探讨如何通过自定义标签来防止表单的重复提交,以确保数据的一致性和系统的稳定性。 首先,理解表单重复提交的问题。当用户点击提交按钮时,如果网络连接不稳定或者用户快速多次点击,可能会导致同一份...

    php防止表单重复提交实例讲解

    使用Cookie防止表单重复提交的原理是在用户第一次提交表单时,后端通过PHP设置一个Cookie,比如命名为`formFlag`,并且将此Cookie的值设置为当前时间戳,同时设定一个过期时间(例如30秒),在这个过期时间内如果...

    js防止表单重复提交实现代码

    在网页开发中,防止表单重复提交是一个重要的问题,它能确保用户的数据只被处理一次,避免因网络延迟或误操作导致的重复数据插入。本文将深入探讨如何使用JavaScript、HTTP头信息以及令牌机制来防止表单的重复提交。...

    PHP防止post重复提交数据的简单例子

    在某帝国面试的时候问题了这个题: 怎么处理post提交重复的问题, 后来跟@暖阳交流,他说记录时间,我没有明白,我想的是用session在表单页面记录下,然后提交页面判断,如果相等则视为成功,并清空session,但有个问题是如果...

    PHP提交表单失败后如何保留填写的信息

    PHP 提交表单失败后如何保留填写的信息 当用户提交表单时,可能会因为网络连接不稳定或服务器端错误等原因导致提交失败。在这种情况下,如何保留用户填写的信息是一个重要的问题。本文将介绍如何使用缓存和 Ajax ...

    php页面防重复提交方法总结

    总的来说,防止PHP页面重复提交是一个涉及前端和后端协同处理的问题,需要合理利用JavaScript、session和服务器端验证等手段。正确实施这些策略,能够有效地避免用户误操作或恶意攻击导致的数据混乱。

    PHP提交表单失败后如何保留已经填写的信息

    在PHP开发中,当用户尝试提交表单时,如果因为某些...总结来说,保留PHP表单提交失败后的信息,可以通过设置HTTP缓存头或者使用AJAX技术来实现。而AJAX通常是更优的选择,因为它提供了更好的用户体验和更精确的控制。

    PHP+Mysql+JQuery按照步骤找回密码表单代码

    本教程将聚焦于使用PHP、MySQL和jQuery实现一个分步找回密码的表单。...在实际开发中,还需要考虑安全措施,如使用预处理语句防止SQL注入,使用HTTPS确保数据传输安全,以及设置合理的令牌过期时间。

    php加法验证码

    加法验证码是一种常见的防止自动化程序(如机器人)非法提交表单的安全机制,它通常用于确保用户是人类,而非机器。在网页开发中,PHP是一种广泛使用的服务器端脚本语言,常用于实现这种功能。下面我们将深入探讨...

    PHP用户注册邮箱验证激活帐号

    1. 创建用户注册表单并处理提交的数据。 2. 使用PHP连接MySQL数据库,安全地存储用户信息。 3. 通过SMTP发送带有激活码的邮件。 4. 实现`active.php`页面,验证激活码的有效性,包括链接的时效性和未使用状态。 5. ...

    php后退一页表单内容保存实现方法

    总结来说,要实现PHP表单提交后退页面仍保留表单内容,关键在于结合使用`session_start()`和`header("Cache-control: private")`来避免浏览器缓存页面,并利用session存储表单数据。这样,用户在后退时,系统会从...

    《PHP编程最快明白》第四讲:日期、表单接收、session、cookie_.docx

    例如,对表单数据进行过滤和验证,使用预处理语句保护数据库操作,以及使用 `htmlspecialchars()` 或 `strip_tags()` 防止 XSS 攻击。在使用 session 和 cookie 时,也需要考虑数据加密和安全设置,如设置合适的 ...

    php防止CC攻击代码 php防止网页频繁刷新

    针对标题“php防止CC攻击代码 php防止网页频繁刷新”以及描述中提供的内容,可以总结出以下知识点: ***攻击的原理:CC攻击指的是攻击者利用代理服务器发起对目标网站的大量合法请求,从而模拟多用户连续不断地访问...

    PHP单页面简易投票

    5. **数据处理**:当用户提交投票时,PHP脚本会捕获这些数据,检查投票的有效性(例如,防止同一用户重复投票),然后更新数据库中的相应投票计数。 6. **CRUD操作**:系统支持添加、删除等操作。添加通常指的是...

    phpweb 留言模块

    2. 数据处理:当用户提交留言时,PHP脚本会捕获这些数据,并进行必要的验证和清理,以防止SQL注入等安全问题。例如,可能会检查字段是否为空,电子邮件格式是否正确,以及内容中是否含有非法字符。数据处理还包括将...

    表单要求Captcha Code

    标题中的“表单要求Captcha Code”指的是网页表单中常用的验证码技术,它主要用于防止自动化的机器人或恶意脚本进行欺诈性操作,如批量注册、恶意登录等。验证码(Captcha)是“Completely Automated Public Turing ...

    PHP源码_邮箱密码找回功能开发源码

    1. **表单处理**:创建HTML表单,让用户输入邮箱地址,使用POST方法提交数据到PHP脚本。 2. **数据库操作**:查询数据库,验证邮箱地址是否存在于用户表中。这需要熟悉SQL语句,如`SELECT * FROM users WHERE email...

Global site tag (gtag.js) - Google Analytics