5.8.3 避免表单重复提交
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
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所示。
图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 ‘请不要刷新本页面或重复提交表单!’;
}
}
?>
|
关于Session的内容,我们会在第10章“PHP会话管理”详细讨论,你可以直接查阅这一章,然后再返回本节继续阅读。
4.使用header函数转向
除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
//处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php');
}
|
这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。
分享到:
相关推荐
很实用,体积不大,支持Win8.1,有简体中文
Filter Wiz PRO 5.8.3 设计滤波器,操作简单。
ActivePerl.5.8.3.chm
C/C++ IDE编译器 无需安装,解压后运行“devcpp.exe”即可。 若要初始化设置,删除“%AppData%”下的“Dev-Cpp”文件夹即可。
如果你的网站运行的是受影响的版本,应及时更新到5.8.3或更高版本以避免风险。 分析这个漏洞,关键在于插件中对`WP_Query`的使用。为了测试和重现该漏洞,可以创建一个简单的插件,从...
阿里巴巴-钱盾5.8.3.apk
WordPress插件 advanced-custom-fields.5.8.3.zip 高级自定义字段插件,基本上能解决所有后台自定的问题,例如图片置顶,相册功能,编辑页面自定义,等等;强大到无法想象
《Notepad++ 5.8.3:编程者的高效文本编辑器》 Notepad++,一个备受编程者喜爱的文本编辑器,以其强大的功能和易用性在业界赢得了广泛赞誉。这款软件虽然名称简单,但功能却远超普通的记事本,是许多程序员日常工作...
X-Lite 5.8.3_102651安装文件,安装完freeswitch后,使用软电话进行测试,如何测试,可以到百度自行查找
scada_5.8.3_full_en
ROM为ResurrectionRemix-N v5.8.3,类原生,安卓版本7.1.2,适用机型乐檬K30移动版联通版。已在真机实测OK无Bug,可以在4.4底包直接刷入,无需合并分区等操作。系统非常流畅,无任何垃圾预装,仅预装常用工具类软件...
《SynEdit 5.8.3:一个强大的代码编辑组件》 SynEdit 5.8.3 是一款专为开发者设计的高级文本编辑组件,它以其丰富的功能和优秀的性能在IT行业中广受赞誉。该版本包含了Demo和SynGen,使得用户能够更直观地了解其...
在这个场景中,我们关注的是一个名为“hutool-all-5.8.3”的JAR包,它是Hutool工具库的全功能集合。 Hutool是一个小巧而强大的Java工具集,旨在简化日常开发任务,提高开发效率。它由一系列精心设计的模块组成,...
除此之外,NoSQL Manager for MongoDB还支持脚本执行,用户可以编写和运行JavaScript脚本来自动化一些重复的任务,提高工作效率。对于开发团队,版本控制功能则能确保代码的协同编辑和历史追踪。 总之,NoSQL ...
再者,SynEditStudio集成了拼写检查功能,"Dictionary"目录可能包含了用于此功能的词典文件,帮助开发者在编写文档或注释时避免拼写错误。此外,它还支持查找和替换操作,可以方便地在整个工程中搜索特定的文本或...
DISQLite3.Pro.v.5.8.3 crack
**WinsCP中文版 V5.8.3** 是一个广受欢迎的开源文件传输协议(FTP)客户端,尤其在Linux和Windows系统中被广泛使用。它提供了图形化的用户界面,使得用户能够方便地进行文件和目录的上传、下载、移动以及管理。这个...
这使得Notepad++可以在没有管理员权限的环境中使用,同时避免了与系统级别的Notepad++版本冲突。 除此之外,Notepad++还支持插件扩展,用户可以根据需求安装其他功能插件,比如NppFTP用于FTP/SFTP文件管理,或...
jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET、ASP.NET CORE、PHP为特色,同时具备反向代理、入侵检测等重要功能。可以这样说,Jexus是.NET、.NET CORE跨平台的最优秀的宿主服务器,如果...
目前找到的最方便的Dzsoft PerlEditor。较之别的版本较少有崩溃的情况。强烈推荐!