防止刷新重复提交的两种方法

ashchen 2003-10-09 10:05:02
post方法种下如果直接在下一个页面接收变量那么如果刷新一下那么刚才的变量会被重新提交一次,如何避免呢?
方法1:提交给本页,本页头部做判断,如果符合条件就用header()跳转页面,不过这种方法要用到session,提交大变量的时候慎用
方法2: 提交给下一个页面,下一个页面头部写法如下
if(isset($_POST['a']))
{
.....//处理上页提交的变量
echo '<head><META http-equiv="refresh" content="0.5;URL='.$_SERVER['PHP_SELF'].'"></head>';
}
或者用header("location:".$_SERVER['PHP_SELF'])也行
但是上面两种方法的缺点是按后退键则以前填的东西会清空,需要重新填

希望大家能想出更好的方法
...全文
5363 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
nne998 2003-12-15
  • 打赏
  • 举报
回复
没这么复杂吧,,,
用session记录一下, 然后自己控制一下就行了
bonniewater 2003-12-15
  • 打赏
  • 举报
回复
我一般都是入库的时候判断是否重复

但是如果重复又回到原来的表单,内容就保存不了了
xinyaoxp 2003-12-15
  • 打赏
  • 举报
回复
up
hlddn 2003-12-15
  • 打赏
  • 举报
回复
我觉得跳转就可以了,跳到首页,还可以让用户重新流缆一遍网站呢.
xuguoxin 2003-12-15
  • 打赏
  • 举报
回复
说一下数据保持吧,提交过去后再返回的保持表单数据最好用程序控制,而不要依赖浏览器
可以做个数据保持的类:

进入提交页:
$datas = new StoreDatas();
$datas->setPostDatas($_POST,array('username',',password',',content'));
出错返回
<input type=text name=username value="<?=$datas->getpostDatas('username');?>">
具体功能实现可以用session,post方法

trysun 2003-12-15
  • 打赏
  • 举报
回复
数据使用完后,马上清空。
roapzone 2003-12-15
  • 打赏
  • 举报
回复
用iframe解决
cantona 2003-12-15
  • 打赏
  • 举报
回复
我的做法是提交后,如果出错,就在原先填写的表单上显示出错信息,并保留所有发送的信息在表单中(省去了返回的麻烦),直接修改错误的信息后就可以再次发送。如果没有出错,则在数据库操作后跳转页面。
Averylonelywolf 2003-12-15
  • 打赏
  • 举报
回复
mark
i三千 2003-12-14
  • 打赏
  • 举报
回复
我就使用页面跳转呀~
多菜鸟 2003-12-14
  • 打赏
  • 举报
回复
up
ashchen 2003-12-14
  • 打赏
  • 举报
回复
up一下就揭帖
cloudchen 2003-10-10
  • 打赏
  • 举报
回复
为什么要保存原来的数据?坚持要的话用cookie不就可以了,有什么意思。
2.php里面操作完数据库后,header到3.php就不会出现重复提交了。好累啊,一个帖子里说了n遍
ashchen 2003-10-10
  • 打赏
  • 举报
回复
这个问题主要出现在注册或者提交帖子等涉及数据库操作的页面,不注意很可能造成数据记录的重复。
既要避免重复提交又能返回,以前填写在文本筐的数据又不丢失,我找个另外一个比较好的解决方法,等我忙好就贴出来,欢迎指正
Cain 2003-10-10
  • 打赏
  • 举报
回复
我也遇到了相同的问题,我自己发了帖子,我源代码也贴出来了,麻烦大家去看一看,谢谢.
ashchen 2003-10-10
  • 打赏
  • 举报
回复
重复提交的例子是
1.php

<FORM METHOD=POST ACTION="2.php">
<INPUT TYPE="text" NAME="a">
<INPUT TYPE="submit">
</FORM>

2.php

<?
echo $_POST['a'];
?>

提交好以后刷新2.php则会出现一个对话框问你重试还是取消,重试会重新提交一次,取消会显示过期。如果2.php有操作数据库的语句那么刷新重试可能会造成记录的重复。
ustb 2003-10-10
  • 打赏
  • 举报
回复
用alert弹出,确定后跳转
ashchen 2003-10-10
  • 打赏
  • 举报
回复
ie6提交两次我也碰到过,大致是用图片代替submit时,图片上有个submit(),这样会提交两次,如果只是submit钮我没碰到过提交两次的情况。

现在整理一下:
方法基本上前面几位说得差不多
接收的页即2.php分为两部分,一部分处理提交过来的变量,一部分显示页面
处理变量完毕用header("location:".$_SERVER['PHP_SELF'])跳转到自身页
本部分要做判断,如果没有post的变量就跳过。当然也可以跳到别的页面。
跳到别的页面返回时会有问题,建议做在一个php文件里。
如果上页穿过来得变量不符合要求可以强制返回
<script>
history.go(-1);
</script>

只说了一下大体思路,也许高手们不会遇到此类问题,可是并不是每个人都是高手。
2.php的流程
if(isset($_POST))
{ 接收变量
if(变量不符合要求)
<script>history.go(-1);</script>
else
操作数据
...
if(操作完成)
header("location:".$_SERVER['PHP_SELF']);
}
<script language="JavaScript">
<!--
 javascript:window.history.forward(1);
//-->
</script>

显示注册成功等信息


xuzuning 2003-10-10
  • 打赏
  • 举报
回复
1、“取消”不会出现“过期”(ie5.5)
2、既然有提示“对话框”仍需“重试”这反映的是用户的一种需求
3、传统的做法是(并不是php才有此现象)
提交验证不成功,使用
<script>
history.go(-1);
</script>
回退到表单页
提交验证成功,使用
$url = $HTTP_REFERER;
$time = 0;
header("Refresh: $time; URL=$url");
echo "<a href='$url'>操作成功!{$time}秒后返回</a>";

并可有选择的使用
<script language="JavaScript">
<!--
 javascript:window.history.forward(1);
//-->
</script>
以阻止“后退”

既然已成功的提交,回退到表单再行提交是没有意义的,也是不允许的(从处理流程上讲)。

实际上在ie6上有一种现象可能你没有注意到:
表单提交后,并不需要“刷新”或重新提交。入库的内容就已经是两条了!
ashchen 2003-10-10
  • 打赏
  • 举报
回复
to: cloudchen(陈系上.net)
我这个帖子不是写给高手看的,因为看到许多人的确碰到这个问题才写这个帖子
觉得累就去休息
加载更多回复(10)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧