`
独善其身008
  • 浏览: 171397 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

5.8.3 避免表单重复提交

 
阅读更多

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'); }

这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

分享到:
评论

相关推荐

    Dev-Cpp 5.8.3

    很实用,体积不大,支持Win8.1,有简体中文

    Filter Wiz PRO 5.8.3.exe

    Filter Wiz PRO 5.8.3 设计滤波器,操作简单。

    ActivePerl.5.8.3.chm

    ActivePerl.5.8.3.chm

    Dev-Cpp v5.8.3

    C/C++ IDE编译器 无需安装,解压后运行“devcpp.exe”即可。 若要初始化设置,删除“%AppData%”下的“Dev-Cpp”文件夹即可。

    WordPress 5.8.3 SQL注入漏洞 CVE-2022-21661.pdf

    如果你的网站运行的是受影响的版本,应及时更新到5.8.3或更高版本以避免风险。 分析这个漏洞,关键在于插件中对`WP_Query`的使用。为了测试和重现该漏洞,可以创建一个简单的插件,从...

    阿里巴巴-钱盾5.8.3.apk

    阿里巴巴-钱盾5.8.3.apk

    advanced-custom-fields.5.8.3.zip

    WordPress插件 advanced-custom-fields.5.8.3.zip 高级自定义字段插件,基本上能解决所有后台自定的问题,例如图片置顶,相册功能,编辑页面自定义,等等;强大到无法想象

    notepad++5.8.3

    《Notepad++ 5.8.3:编程者的高效文本编辑器》 Notepad++,一个备受编程者喜爱的文本编辑器,以其强大的功能和易用性在业界赢得了广泛赞誉。这款软件虽然名称简单,但功能却远超普通的记事本,是许多程序员日常工作...

    X-Lite_5.8.3_102651.exe

    X-Lite 5.8.3_102651安装文件,安装完freeswitch后,使用软电话进行测试,如何测试,可以到百度自行查找

    scada_5.8.3_full_en

    scada_5.8.3_full_en

    联想乐檬K30-t ResurrectionRemix N-v5.8.3 ROM包

    ROM为ResurrectionRemix-N v5.8.3,类原生,安卓版本7.1.2,适用机型乐檬K30移动版联通版。已在真机实测OK无Bug,可以在4.4底包直接刷入,无需合并分区等操作。系统非常流畅,无任何垃圾预装,仅预装常用工具类软件...

    SynEdit 5.8.3

    《SynEdit 5.8.3:一个强大的代码编辑组件》 SynEdit 5.8.3 是一款专为开发者设计的高级文本编辑组件,它以其丰富的功能和优秀的性能在IT行业中广受赞誉。该版本包含了Demo和SynGen,使得用户能够更直观地了解其...

    java_jar_hutool-all-5.8.3

    在这个场景中,我们关注的是一个名为“hutool-all-5.8.3”的JAR包,它是Hutool工具库的全功能集合。 Hutool是一个小巧而强大的Java工具集,旨在简化日常开发任务,提高开发效率。它由一系列精心设计的模块组成,...

    NoSQL Manager for MongoDB(5.8.3)

    除此之外,NoSQL Manager for MongoDB还支持脚本执行,用户可以编写和运行JavaScript脚本来自动化一些重复的任务,提高工作效率。对于开发团队,版本控制功能则能确保代码的协同编辑和历史追踪。 总之,NoSQL ...

    haoxiongdi_SynEditStudio_5.8.3.rar

    再者,SynEditStudio集成了拼写检查功能,"Dictionary"目录可能包含了用于此功能的词典文件,帮助开发者在编写文档或注释时避免拼写错误。此外,它还支持查找和替换操作,可以方便地在整个工程中搜索特定的文本或...

    DISQLite3.Pro.v.5.8.3.D4-XE10

    DISQLite3.Pro.v.5.8.3 crack

    winscp中文版 V5.8.3绿色免费版

    **WinsCP中文版 V5.8.3** 是一个广受欢迎的开源文件传输协议(FTP)客户端,尤其在Linux和Windows系统中被广泛使用。它提供了图形化的用户界面,使得用户能够方便地进行文件和目录的上传、下载、移动以及管理。这个...

    Notepad++Portable 5.8.3Cyrus自压版.rar

    这使得Notepad++可以在没有管理员权限的环境中使用,同时避免了与系统级别的Notepad++版本冲突。 除此之外,Notepad++还支持插件扩展,用户可以根据需求安装其他功能插件,比如NppFTP用于FTP/SFTP文件管理,或...

    jexus-5.8.3-x64.tar.gz

    jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET、ASP.NET CORE、PHP为特色,同时具备反向代理、入侵检测等重要功能。可以这样说,Jexus是.NET、.NET CORE跨平台的最优秀的宿主服务器,如果...

    DZsoft perl editor 5.8.3

    目前找到的最方便的Dzsoft PerlEditor。较之别的版本较少有崩溃的情况。强烈推荐!

Global site tag (gtag.js) - Google Analytics