php

位置:IT落伍者 >> php >> 浏览文章

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


发布日期:2021年09月05日
 
解析php防止form重复提交的方法
本篇文章是对php防止form重复提交的方法进行了详细的分析介绍需要的朋友参考下

php 防止表单重复提交实例

复制代码 代码如下:
<?php
session_start();
$_SESSION[fsess]=($_SESSION[fsess])?$_SESSION[fsess]:time();
?>
<!DOCTYPE html PUBLIC "//WC//DTD XHTML Transitional//EN" "
<html xmlns="
<head>
<meta httpequiv="ContentType" content="text/html; charset=gb" />
<title>防止表单重复提交</title>
<SCRIPT language=Javascript type=text/javascript>
<!
//*****Javascript防重复提交************
var frm_submit=false;   //纪录提交状态
function check_form(fobj) {
var error = ;
var error_message = "";
if (fobjformtextvalue=="")
{
error_message = error_message + "formtext 不能为空n";
error = ;
}

if (frm_submit==true) {
error_message = error_message + "这个表单已经提交n请耐心等待服务器处理你的请求nn";
error=;
}

if (error == ) {
alert(error_message);
return false;
} else {
frm_submit=true;  //改变提交状态
return true;
}
}
>
</script>
</head>
<body>
Javascript和服务器端 双重防止表单重复提交演示
<br/>
<br/>
现在时间<?php echo date("Ymd 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>


*************************************************************
上面是完整例题下面是在网站摘抄仅供参考
*************************************************************
用户提交表单时可能因为网速的原因或者网页被恶意刷新致使同一条记录重复插入到数据库中这是一个比较棘手的问题我们可以从客户端和服务器端一起着手设法避免同一表单的重复提交

.使用客户端脚本
提到客户端脚本经常使用的是JavaScript进行常规输入验证在下面的例子中我们使用它处理表单的重复提交问题请看下面的代码
<form method="post" name="register" action="testphp" enctype="multipart/formdata">
<input name="text" type="text" id="text" />
<input  name="cont" value="提交" type="button"  onClick="documentregistercontvalue=正在提交请等待; documentregistercontdisabled=true;documentthe_formsubmit();">
</form>
当用户单击“提交”按钮后该按钮将变为灰色不可用状态
上面的例子中使用OnClick事件检测用户的提交状态如果单击了“提交”按钮该按钮立即置为失效状态用户不能单击按钮再次提交
还有一个方法也是利用JavaScript的功能但是使用的是OnSubmit()方法如果已经提交过一次表单将立即弹出对话框代码如下

复制代码 代码如下:
<script language="javascript">
<!
var submitcount=;
function submitOnce (form){
if (submitcount == ){
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变量自加当用户试图再次提交时脚本判断submitcount变量值非零提示用户已经提交从而避免重复提交表单

.使用Cookie处理
使用Cookie记录表单提交的状态根据其状态可以检查是否已经提交表单请见下面的代码

复制代码 代码如下:
<?php
if(isset($_POST[go])){
setcookie("tempcookie"""time()+);
header("Location:"$_SERVER[PHP_SELF]);
exit();
}
if(isset($_COOKIE["tempcookie"])){
setcookie("tempcookie""");
echo "您已经提交过表单";
}
?>


如果客户端禁止了Cookie该方法将不起任何作用这点请注意关于Cookie的详细介绍请参阅第章“PHP会话管理”

.使用Session处理
利用PHP的Session功能也能避免重复提交表单Session保 存在服务器端在PHP运行过程中可以改变Session变量下次访问这个变量时得到的是新赋的值所以可以用一个Session变量记录表单提交 的值如果不匹配则认为是用户在重复提交请见如下代码

复制代码 代码如下:
<?php
session_start();
//根据当前SESSION生成随机数
$code = mt_rand();
$_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的内容我们会在第章“PHP会话管理”详细讨论你可以直接查阅这一章然后再返回本节继续阅读

.使用header函数转向
除了上面的方法之外还有一个更简单的方法那就是当用户提交表单服务器端处理后立即转向其他的页面代码如下所示
if (isset($_POST[action]) && $_POST[action] == submitted) {
//处理数据如插入数据后立即转向到其他页面
header(location:submits_successphp);
}
这样即使用户使用刷新键也不会导致表单的重复提交因为已经转向新的页面而这个页面脚本已经不理会任何提交的数据了

表单过期的处理
在开发过程中经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况为了支持页面回跳可以通过以下两种方法实现
.使用header头设置缓存控制头Cachecontrol
header(Cachecontrol: private mustrevalidate); //支持页面回跳

.使用session_cache_limiter方法
session_cache_limiter(private mustrevalidate); //要写在session_start方法之前
下面的代码片断可以防止用户填写表单的时候单击“提交”按钮返回时刚刚在表单上填写的内容不会被清除
session_cache_limiter(nocache);
session_cache_limiter(private);
session_cache_limiter(public);
session_start();
//以下是表单内容这样在用户返回该表单时已经填写的内容不会被清空
将该段代码贴到所要应用的脚本顶部即可
CacheControl消息头域说明
CacheControl指定请求和响应遵循的缓存机制在请求消息或响应消息中设置CacheControl并不会修改另一个消息处理过程中的缓存处理过程
请 求时的缓存指令包括nocachenostoremaxagemaxstaleminfresh和onlyifcached响应 消息中的指令包括publicprivatenocachenostorenotransformmustrevalidate proxyrevalidate和maxage
缓存指令
说    明
public
指示响应可被任何缓存区缓存
private
指示对于单个用户的整个或部分响应消息不能被共享缓存处理这允许服务器仅仅描述当用户的部分响应消息此响应消息对于其他用户的请求无效
nocache
指示请求或响应消息不能缓存
nostore
用于防止重要的信息被无意的发布在请求消息中发送将使得请求和响应消息都不使用缓存
maxage
指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
minfresh
指示客户机可以接收响应时间小于当前时间加上指定时间的响应
maxstale
指示客户机可以接收超出超时期间的响应消息如果指定maxstale消息的值那么客户机可以接收超出超时期指定值之内的响应消息

判断表单动作的技巧
表单可以通过同一个程序来分配应该要处理的动作在表单中有不同的逻辑要怎么判别使用者按下的按钮内容不过是个小问题
其实只要通过提交按钮的name 就可以知道了表单在提交出去的时候只有按下的submit类型的按钮才会被送到表单数组去所以只要判断按钮的值就可以知道使用者按下哪一个按钮以如下表单为例
<FORM method="POST" Action=testphp>
<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=testphp>
<input type=submit name="a" value="提交A">
<input type=submit name="b" value="提交B">
</FORM>
这样只要POST/GET的参数里面有a或b就可以知道按下的按钮是哪个
<?php
print_r($_POST);
?>

               

上一篇:如何使用PHP实现javascript的escape和unescape函数

下一篇:关于php循环跳出的问题