您当前的位置: 首页 > 网站编程 > PHP教程 > 解析php防止form重复提交的方法

解析php防止form重复提交的方法

作者:不详 来源:网络 发布时间: 2014-08-15 08:49 点击:
本篇文章是对php防止form重复提交的方法进行了详细的分析介绍,需要的朋友参考下 php 防止表单重复提交实例: 复制代码 代码如下: ?php session_start(); $_SESSION['fsess']=($_SESSION['fsess'])?$_SESSION['fsess']:time(); ? !DOCTYPE html PUBLIC -//W3C//DTD XHT

解析php防止form重复提交的方法

  本篇文章是对php防止form重复提交的方法进行了详细的分析介绍,需要的朋友参考下

  php 防止表单重复提交实例:

  


  复制代码 代码如下:

  <?php

  session_start();

  $_SESSION['fsess']=($_SESSION['fsess'])?$_SESSION['fsess']:time();

  ?>

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head>

  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

  <title>防止表单重复提交</title>

  <SCRIPT language=Javascript type=text/javascript>

  <!--

  //*****Javascript防重复提交************

  var frm_submit=false; //纪录提交状态

  function check_form(fobj) {

  var error = 0;

  var error_message = "";

  if (fobj.formtext.value=="")

  {

  error_message = error_message + "formtext 不能为空.n";

  error = 1;

  }

  if (frm_submit==true) {

  error_message = error_message + "这个表单已经提交.n请耐心等待服务器处理你的请求.nn";

  error=1;

  }

  if (error == 1) {

  alert(error_message);

  return false;

  } else {

  frm_submit=true; //改变提交状态

  return true;

  }

  }

  -->

  </script>

  </head>

  <body>

  Javascript和服务器端 双重防止表单重复提交演示

  <br/>

  <br/>

  现在时间:<?php echo date("Y-m-d H:i:s"); ?>

  <br/>

  <br/>

  <?php

  if(@$_POST["faction"]=="submit"||@$_GET["faction"]=="submit"){

  //提交处理

  //*****服务器端防重复提交*******************

  //如果POST传来的表单生成时间与SESSION保存的表单生成时间

  //相同;为正常提交

  //不相同;为重复提交

  if($_SESSION["fsess"]==$_POST["fpsess"]){

  $_SESSION["fsess"]=time();

  echo "提交内容:<br/>n";

  echo $_POST["fpsess"]."<br/>n";;

  echo $_POST["formtext"];

  echo "</body></html>";

  exit;

  } else {

  echo "重复提交,退出!!!!<br/>n";

  echo "</body></html>";

  exit;

  }

  }

  //$_SESSION["fsess"]=time();

  ?>

  <form name="f_info" action="" method="post" onSubmit="return check_form(this);">

  <input name="fpsess" type="hidden" value="<?php echo $_SESSION["fsess"]; ?>" />

  <!-- 保存表单生成时间 -->

  <input name="faction" type="hidden" value="submit" />

  <input name="formtext" id="formtext" type="text" value="" />

  <input type="submit" value="提交" />

  <input type="reset" value="重置" />

  </form>

  </body>

  </html>

  *************************************************************

  上面是完整例题,下面是在网站摘抄,仅供参考

  
*************************************************************

  用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

  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>

  当用户单击“提交”按钮后,该按钮将变为灰色不可用状态。

  上面的例子中使用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');

  }

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

  5.8.4 表单过期的处理

  
在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

  1.使用header头设置缓存控制头Cache-control。

  
header('Cache-control: private, must-revalidate'); //支持页面回跳

  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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

  

  5.8.5 判断表单动作的技巧

  
表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。

  其实只要通过提交按钮的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);

  ?>
分享到:
本文"解析php防止form重复提交的方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4