回车太快导致重复提交 请问如何解决这个问题,谢谢1、我一定要通过回车提交;2、已屏蔽提交后SUBMIT变灰,但按回车还是会提交 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用js试试看,第一次回车触发一个function 来屏蔽Enter键,第二次的Enter就无效了 IE浏览器6.0-8.0我在FORM设置了一个一个隐藏框form_secret,值等于$secret$secret=md5(uniqid(rand(), true));$_SESSION['FORM_SECRET']=$secret;提交后,判断if(strcasecmp($_POST['form_secret'],$_SESSION['FORM_SECRET'])===0)然后删除session,还是会重复提交整个表单就一个输入框,一个隐藏按钮,然后按回车就提交,假设我回车键按着不放,就会一直提交。 是个好主意,但这个要求是尽量减少 用户动作,也就是只要按一个回车,其他都不需要USER去管,否则在提交前,也可以提示是要保存之类的。 如果让 submit 变灰还不能解决问题的话,那就用更严厉的办法阻止 form 重复提交,比如在 form 的 onsubmit 事件里返回 false。————————————————————————————————基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) php防止重复提交表单 解决方案一:引入cookie机制来解决 提交页面代码如下a.php代码如下: <form id="form1" name="form1" method="post" action="t2.php"> <p>说明 <input type="text" name="titile" /></p> <p> <input type="submit" name="Submit" value="提交" /></p> </form> <?php setcookie("onlypost", 't'); //设置cookie,可以带上时间值。像有些论坛防止灌水就可以将你的一些基本信息存放到里面。?> 处理页面b.php代码如下: <?php if($_COOKIE['onlypost'] == 't'){ print_r($_COOKIE); //处理提交的内容 如果验证成功则处理 print "ok"; setcookie("onlypost", 'f'); //改变cooike值删除也可以了} ?> body 如上处理的缺点:如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。 解决方案二:使用session(这个与JSP处理方法是一样的) 利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。A页面的代码: <?php session_start(); //根据当前SESSION生成随机数 $code = mt_rand(0,1000000); $_SESSION['code'] = $code; //将此随机数暂存入到session?> <form id="form1" name="form1" method="post" action="t2.php"> <p>说明 <input type="text" name="titile" /> <input type="hidden" name="originator" value="<?php echo $code;?>"></p> <p> <input type="submit" name="Submit" value="提交" /></p> </form> B页面: <?php session_start(); if(isset($_POST['originator'])) { if($_POST['originator'] == $_SESSION['code']){ echo "ok"; unset($_SESSION["code"]); //将其清除掉此时再按F5则无效 }else{ echo "请不要刷新本页面或重复提交表单"; } }?> 解决方案三:在服务器端做重定向处理 if (isset($_POST['action']) && $_POST['action'] == 'submitted') { // 处理数据,如插入数据后,立即转向到其他页面 header('location:submits_success.php'); //效果与JSP里面的sendRedirect类似 } 用js控制form的提交,不要用submitr的button或用ajax提交一次清空input,判断值是否为空,是的话,return false; var submitFlag = true;<form onsubmit="return submitFlag; submitFlag = false;"> 以前有人问,在极端情况下! 比如,post之间间隔小!且量大。如何处理? 客户没意见的话禁止回车: onsubmit="return false;" 按一下之后,立刻把submit button黑了。 没有那么复杂吧,用JS很简单<input type="submit" name="save" id="save" value="保存" onclick="this.value='数据提交中,请稍候……';this.disabled=true;" />就这么简单。 disable掉按钮,然后回车是trigger这个按钮,我不信还能提交。还有一种方法是$("#ok:not(.btn-disable)").live("click",function() { $(this).addClass("btn-disable");} session的方法可行,可以有效的杜绝重复提交和刷新提交 很简单,看例子<form action='a.php' method='post' onsubmit="this.action='#';">...<input type='submit' value='提交'></form>只要用戶第一次提交過之後form的action就变为#了,这样就不能第二次提交了. 哈哈,我就是经常测试出来。一个输入框,一个submit按钮,输入一个数字,按回车不放,在后台写个UPDATE,qty=qty+输入的数量,各位按照你们的方法测试看看,结果会是多少。我之前就试过几种1、onsubmit事件,sumbmit1(submit按钮的名称).disabled=true;2、在form里放一个隐藏按钮,值为某个session的值,提交后判断两个值是否一样,判断后删除session值不行!从输入到提交过程不能有任何干扰USER的事件,比如提示是否保存什么的,这个是要求,不是我能决定的,我也想搞个提示框……。 LZ是否可以将问题再描述得清楚一点,是表单默认的enter触发submit,还是捕捉keydown事件。提交是直接form提交还是隐藏frame,还是ajax。 这个问题在js端的办法就是取消回车提交!不用submit,用button试试。在后台:据说极端情况下很难解决。因为这些请求可能同时到达服务器。 而服务器在接收时并不是按相应顺序处理的。 服务器有多线程。 表单加一个 onsubmit事件 有个隐藏域值为1 提交的时候 判断隐藏域的值如果为1 提交然后把值改变为零,如果不是 就不提交 如果你的表单里有文本域 那就更简单onsubmit事件 判断 文本域是否有值 如果有 提交 然后清空文本域里的内容如果无就不提交然后弹出提示 还有别的方法比如用 js监控 key的值 在你提交表单以后js 就让键值为13(我记得回车好像是13)的键禁用... 我有两种方案:第一种:假如你提交的页面是a.php接收的页面是b.phpa页面每载入一次赋值给$_SESSION['submit']=1;当把参数传递到b页面的时候赋值给$_SESSION['submit']=0;然后a页面判断当$_SESSION['submit']==1的时候再允许提交,这样在一个页面中他就不能重复提交啦,只有把a.php页面刷新一下才能提交第二种方案当参数提交到b.php页面的时候当提交的时候首选检测time()-$_SESSION['time']>3 如果大于的话就提示提交过快,请稍后再试,否则赋值给$_SESSION['time']=time(); 這問題我也遇到過:我是用JS做的,方法和11樓差不多。但是11樓有個露點:就是有時候你沒有輸入或輸入錯誤時你會提示一個信息並阻止提交。就像註冊的時候:如果一個用戶的密碼不一致或郵箱錯誤等你需要阻止其提交。但是因為你已經提交過一次了所以幾時他該正確了還是不能提交。因為JS已經阻止了。所以就要在每個可能阻止提交的地方加入formReturn = true;e.g.var formReturn = true;//定義formReturn,可提交。funciton checkForm(){ formReturn = false; if(a.value == ''){ formReturn = true; return false; } return formReturn;} 测试了一下,没有发现楼主所说的问题!测试环境为win7+apache+php. 分别为get 和post提交表单。 重复点击及按回不放及多次回车。老大说绝无可能,也许是真的。当多次提交时,根本提交不上去,也许是自动放弃以前提交。在响应页放了sleep(5),仍然提交不上去。 PHP 给表单生成一个Hash码, 提交检验Hash码正确后unset之,看你程序好像用了SESSION,这个就很容易了。最好还要提交成功后返回个提示,若干秒后自动返回到诸如列表页之类的地方去。 通过写个js,就可以控制重复提交的,你可以google下。 做1个 _hash_ 存在 表单隐藏值. 判断一样就挑转其他页面。说他重复提交。 代码意思不太明白 一个是对象,一个不是。怎么会这样的。 radio单选按钮怎么提交(TP自动完成) 免费动态域名解析,为何不能用?是使用方法的问题,还是电信的问题? 关于页面自动刷新 使用file_get_content获取网页内容,想删除里面的js代码。 php语句转C++ PHP建立网站群和可视化编辑,100分 百度编辑器ueditor怎么修改图片上传路径?(图片存储在另一个站点目录下,非工程目录下) 高价悬赏文本自动缩进html格式化的php代码 如何让phpexcel生成的excel文件打开时需要密码 关于myeclipse能够像zend studio一样链接服务器
我在FORM设置了一个一个隐藏框form_secret,值等于$secret
$secret=md5(uniqid(rand(), true));
$_SESSION['FORM_SECRET']=$secret;提交后,判断if(strcasecmp($_POST['form_secret'],$_SESSION['FORM_SECRET'])===0)
然后删除session,还是会重复提交
整个表单就一个输入框,一个隐藏按钮,然后按回车就提交,假设我回车键按着不放,就会一直提交。
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
解决方案一:引入cookie机制来解决
提交页面代码如下a.php代码如下:
<form id="form1" name="form1" method="post" action="t2.php">
<p>说明
<input type="text" name="titile" />
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
<?php
setcookie("onlypost", 't'); //设置cookie,可以带上时间值。像有些论坛防止灌水就可以将你的一些基本信息存放到里面。
?> 处理页面b.php代码如下:
<?php
if($_COOKIE['onlypost'] == 't'){
print_r($_COOKIE);
//处理提交的内容 如果验证成功则处理
print "ok";
setcookie("onlypost", 'f'); //改变cooike值删除也可以了
} ?>
body
如上处理的缺点:如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。
解决方案二:使用session(这个与JSP处理方法是一样的)
利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。
A页面的代码:
<?php
session_start(); //根据当前SESSION生成随机数
$code = mt_rand(0,1000000);
$_SESSION['code'] = $code; //将此随机数暂存入到session
?> <form id="form1" name="form1" method="post" action="t2.php">
<p>说明
<input type="text" name="titile" />
<input type="hidden" name="originator" value="<?php echo $code;?>">
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
B页面:
<?php
session_start();
if(isset($_POST['originator'])) {
if($_POST['originator'] == $_SESSION['code']){
echo "ok";
unset($_SESSION["code"]); //将其清除掉此时再按F5则无效
}else{
echo "请不要刷新本页面或重复提交表单";
} }?>
解决方案三:在服务器端做重定向处理
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
// 处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php'); //效果与JSP里面的sendRedirect类似
}
<form onsubmit="return submitFlag; submitFlag = false;">
如何处理?
<input type="submit" name="save" id="save" value="保存" onclick="this.value='数据提交中,请稍候……';this.disabled=true;" />
就这么简单。
还有一种方法是$("#ok:not(.btn-disable)").live("click",function()
{
$(this).addClass("btn-disable");
}
<form action='a.php' method='post' onsubmit="this.action='#';">
...
<input type='submit' value='提交'>
</form>只要用戶第一次提交過之後form的action就变为#了,这样就不能第二次提交了.
一个输入框,一个submit按钮,输入一个数字,按回车不放,在后台写个UPDATE,qty=qty+输入的数量,各位按照你们的方法测试看看,结果会是多少。我之前就试过几种
1、onsubmit事件,sumbmit1(submit按钮的名称).disabled=true;
2、在form里放一个隐藏按钮,值为某个session的值,提交后判断两个值是否一样,判断后删除session值不行!
从输入到提交过程不能有任何干扰USER的事件,比如提示是否保存什么的,这个是要求,不是我能决定的,我也想搞个提示框……。
提交是直接form提交还是隐藏frame,还是ajax。
这个问题在js端的办法就是取消回车提交!不用submit,用button试试。
在后台:据说极端情况下很难解决。因为这些请求可能同时到达服务器。 而服务器在接收时并不是按相应顺序处理的。 服务器有多线程。
onsubmit事件
判断 文本域是否有值 如果有 提交 然后清空文本域里的内容
如果无就不提交然后弹出提示
第一种:
假如你提交的页面是a.php
接收的页面是b.php
a页面每载入一次赋值给$_SESSION['submit']=1;
当把参数传递到b页面的时候赋值给$_SESSION['submit']=0;
然后a页面判断当$_SESSION['submit']==1的时候再允许提交,这样在一个页面中他就不能重复提交啦,只有把a.php页面刷新一下才能提交第二种方案
当参数提交到b.php页面的时候当提交的时候首选检测time()-$_SESSION['time']>3 如果大于的话就提示
提交过快,请稍后再试,否则赋值给$_SESSION['time']=time();
但是11樓有個露點:
就是有時候你沒有輸入或輸入錯誤時你會提示一個信息並阻止提交。
就像註冊的時候:如果一個用戶的密碼不一致或郵箱錯誤等你需要阻止其提交。
但是因為你已經提交過一次了所以幾時他該正確了還是不能提交。因為JS已經阻止了。
所以就要在每個可能阻止提交的地方加入formReturn = true;
e.g.
var formReturn = true;//定義formReturn,可提交。
funciton checkForm()
{
formReturn = false;
if(a.value == ''){
formReturn = true;
return false;
}
return formReturn;
}