header会有效防止重复提交数据吗? 当提交数据到test.php时,如果test.php处理数据后,header("abc.php");(或者header("test.php"))如果用户在提交数据后按F5,那么页面在跳转到abc.php(或者新的test.php)之前,会不会重复提交数据?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?phpif ($_POST["TiJiao"]=="提交"){ print_r($_POST); echo "<script>alert('1')</script>"; $str=""; for ($i=0; $i<100; $i++) { $str.="mm"; echo $str; } header("location: 1.php");}?><form action="" id="myForm" method="post"> <input type="text" id="A" name="A" value="A"> <input type="text" id="B" name="B" value="B"> <input type="submit" name="TiJiao" value="提交"></form>使用上面这段代码,有两个问题不理解1.为什么在ie8上,按提交时,会弹出两次alert('1'),在firefox下只有一次2.为什么在ie8和firefox上,header("location: 1.php");没有起作用,都没有跳转到1.php页面上去? <input type="submit" name="TiJiao" value="提交">改为button后,ie8就只弹出一次alert 要说header前面不能有输出<?phpif ($_POST["A"]=="A"){ print_r($_POST); $str=""; for ($i=0; $i<100; $i++) { $str.="mm"; //echo $str; } echo $str; header("location:abc.php");}?><form action="" id="myForm" method="post"> <input type="text" id="A" name="A" value="A"> <input type="text" id="B" name="B" value="B"> <input type="button" name="TiJiao" value="提交" onclick="document.getElementById('myForm').submit()"></form>这段就没有问题,能跳转到abc.php 当提交数据到test.php时,test.php处理数据后,header("abc.php");(或者header("test.php"))如果用户在提交数据后按F5,那么页面在跳转到abc.php(或者新的test.php)之前,重复提交数据了。test.php页面重复处理数据,比如把数据插入到数据库里,那么,header不能有效得防止重复提交数据,对不对? 一般阻止重复提交,我都是用session来实现,因为不可以伪造。以注册为例:首先在打开注册from表单时,生成一个session。当用户提交后,检测session是否存在,如果存在则继续。经过一系列数据检测(及用户名是否合法,密码正确等),成功插入数据库后,清除这个session。当用户刷新时,又会遇到这个检测session是否存在的问题,而用户没有,因为已经被清空,则else header(“location:错误页面”)。 我试验了一下,代码如下<?php//sleep(5);if ($_POST["A"]=="A"){ print_r($_POST); echo "<script>alert('abc');</script>"; $str=0; for ($i=0; $i<1000000; $i++) { for ($j=1; $j<10; $j++) $str.="mm"; //echo $str; } //header("location:abc.php");}?><form action="" id="myForm" method="post"> <input type="text" id="A" name="A" value="A"> <input type="text" id="B" name="B" value="B"> <input type="button" name="TiJiao" value="提交" onclick="document.getElementById('myForm').submit()"></form>根据结果,我觉得,当提交数据到服务器,并且服务器返回处理数据后的页面(并且没有header跳转),按F5刷新才会重复提交数据。如果服务器处理数据要很长时间,处理完数据前,用户按F5,这时就会重复获取test.php(GET test.php),而没有提交数据。如果服务器处理数据后,把新的页面发送到客户端,没有使用header跳转,那么用户按F5,就会重复提交数据。如果服务器使用header跳转到新的页面了,客户端的页面跳转到新的页面了,那么如果客户再按F5,就只能获取新的页面(GET abc.php)。不知道在客户端,显示服务处理数据后的页面和跳转到新的页面之间,是不是有一段时间,如果有的话, 用户按F5,会不会重复提交数据。如果在客户端,没有中间一段时间的话,就不会重复提交数据了。现在就是不知道,应该如何测试 服务处理数据后的页面和跳转到新的页面之间,是不是有一段时间,能不能在这段时间中间按F5重复提交数据。哪位老大分析一下我说的对不对? pandaidea:你说的这种情况,当用户第一次提交数据后,马上又按F5刷新,是不是会重复提交?假设服务器处理数据后,还是返回原来的页面。如果用户按了提交后,发现数据不对,就在当前的页面上再修改,然后再提交,就会发现不能提交修改的数据了。 如果你的header前能输出,那应该是你打开了某种方式的输出缓冲,输出的内容还是要放在header后面去的,后面的论断一个我觉得和ignore_user_abort设定有关(关于F5是否中断了前面的提交)另外一个这个过程大部分时候很快,似乎不必如此严格要求.....或者结合javascript来控制....另用session控制理论上在快速2次提交的情况下一样可能会出现重复...或者跳转到错误页面(用户以为成功的情况),并且在刷新时,用户会得到那个讨厌的"是否重复提交"对话框, 我觉得还不如用header当然一个办法是可以结合起来用...如果不怕麻烦... 我这边是header前面可以有echo "abccc";但是并没有输出到屏幕中。 1. 给跳转页的url后面加上一个参数 &msg='abccc'2. 在跳转页写echo $_GET['msg']; 上楼, 参数应该是 fackback.php?msg=abccc 后面没引号的 看了上面的方法还是觉得session比较好。不过我提一种思路,不知道行不行,还望各位指教。在提交数据时,目标网页包含在一个隐藏的iframe中执行,这样他不就不能随便自行的刷新了吗?<form action="target.php" method="post" target="phpifram">........</form><iframe id="phpiframe" name="phpiframe" width="0" height="0" marginwidth="0" frameborder="0" src="about:blank"></iframe> wcunw:不知道还在不在,你这种方法的原理是什么?不太明白 我以前碰到类似问题时,做了个cookie 防刷验证。保证3秒钟之类只允许请求一次就好了。 也就是说在当前页面包含一个空白的iframe,然后提交内容处理的时候,用target把处理过程放到iframe中执行,然后处理部分你只接受post方法传递来的变量,这样他单独刷新处理页面的时候变量值是获取不到的,那么自然就停止处理了,这样就达到他不能自行刷新的效果了。他如果直接刷新当前页面的话,那么所有的数据全部重载,一样是无效的。我只是提一个思路,而且我也用过这种方式,但具体这种方式好不好还得等高手来指教呢 楼上所有方法都可行, 这个问题没那么恐怖的,不用这么严格的个人最喜欢header,因为最简单,而且很多开源代码都是用的header,都没什么大问题啦 窗口B是由窗口A链接过来的窗口B想要在header跳转到C之前,刷新一下窗口A,或者跳转之后刷新,但是不能在C页面上写代码刷新A本来想使用echo "<script>if (opener && typeof(window.opener.document)!='unknown' && typeof(window.opener.document)!='undefined'){opener.location.href=opener.location.pathname+opener.location.search;}</script>";header("location:");但是header前面的echo通常不起作用,请问这时候应该怎么做?谢谢 header 前面不能有输出 ie 和火狐 兼容问题 那有没有办法在header前面刷新父窗口了? PHP程序员【应聘】--北京 怎样用array_push()添加一个有键值的元素呢? 跪求 水印 支持 中文 的代码 请高手帮助,在线等 没有记录却统计输出了"1" tab面板 加载会显示a标签那种链接样式 过一秒后显示正常? 初学者学习php的好网站 求救:怎么样把数据库布置到服务器上 php用IMAP连接邮件服务器速度问题 请教一个PHP图形处理的小问题? (如何把一个图片的一部分取出来显示?) 如何用php匹配出这段代码? 关于用mail()发邮件的问题 请问怎么在header跳转之前,刷新父窗口?
if ($_POST["TiJiao"]=="提交")
{
print_r($_POST);
echo "<script>alert('1')</script>";
$str="";
for ($i=0; $i<100; $i++)
{
$str.="mm";
echo $str;
}
header("location: 1.php");
}
?>
<form action="" id="myForm" method="post">
<input type="text" id="A" name="A" value="A">
<input type="text" id="B" name="B" value="B">
<input type="submit" name="TiJiao" value="提交">
</form>使用上面这段代码,有两个问题不理解
1.为什么在ie8上,按提交时,会弹出两次alert('1'),在firefox下只有一次
2.为什么在ie8和firefox上,header("location: 1.php");没有起作用,都没有跳转到1.php页面上去?
改为button后,ie8就只弹出一次alert
<?php
if ($_POST["A"]=="A")
{
print_r($_POST);
$str="";
for ($i=0; $i<100; $i++)
{
$str.="mm";
//echo $str;
}
echo $str;
header("location:abc.php");
}
?>
<form action="" id="myForm" method="post">
<input type="text" id="A" name="A" value="A">
<input type="text" id="B" name="B" value="B">
<input type="button" name="TiJiao" value="提交" onclick="document.getElementById('myForm').submit()">
</form>
这段就没有问题,能跳转到abc.php
经过一系列数据检测(及用户名是否合法,密码正确等),成功插入数据库后,清除这个session。当用户刷新时,又会遇到这个检测session是否存在的问题,而用户没有,因为已经被清空,则else header(“location:错误页面”)。
<?php
//sleep(5);
if ($_POST["A"]=="A")
{
print_r($_POST);
echo "<script>alert('abc');</script>";
$str=0;
for ($i=0; $i<1000000; $i++)
{
for ($j=1; $j<10; $j++)
$str.="mm";
//echo $str;
}
//header("location:abc.php");
}
?>
<form action="" id="myForm" method="post">
<input type="text" id="A" name="A" value="A">
<input type="text" id="B" name="B" value="B">
<input type="button" name="TiJiao" value="提交" onclick="document.getElementById('myForm').submit()">
</form>根据结果,我觉得,当提交数据到服务器,并且服务器返回处理数据后的页面(并且没有header跳转),按F5刷新才会重复提交数据。
如果服务器处理数据要很长时间,处理完数据前,用户按F5,这时就会重复获取test.php(GET test.php),而没有提交数据。
如果服务器处理数据后,把新的页面发送到客户端,没有使用header跳转,那么用户按F5,就会重复提交数据。
如果服务器使用header跳转到新的页面了,客户端的页面跳转到新的页面了,那么如果客户再按F5,就只能获取新的页面(GET abc.php)。
不知道在客户端,显示服务处理数据后的页面和跳转到新的页面之间,是不是有一段时间,如果有的话, 用户按F5,会不会重复提交数据。如果在客户端,没有中间一段时间的话,就不会重复提交数据了。
现在就是不知道,应该如何测试 服务处理数据后的页面和跳转到新的页面之间,是不是有一段时间,能不能在这段时间中间按F5重复提交数据。
哪位老大分析一下我说的对不对?
你说的这种情况,当用户第一次提交数据后,马上又按F5刷新,是不是会重复提交?
假设服务器处理数据后,还是返回原来的页面。如果用户按了提交后,发现数据不对,就在当前的页面上再修改,然后再提交,就会发现不能提交修改的数据了。
2. 在跳转页写echo $_GET['msg'];
....
....
</form>
<iframe id="phpiframe" name="phpiframe" width="0" height="0" marginwidth="0" frameborder="0" src="about:blank"></iframe>
不知道还在不在,
你这种方法的原理是什么?不太明白
保证3秒钟之类只允许请求一次就好了。
也就是说在当前页面包含一个空白的iframe,然后提交内容处理的时候,用target把处理过程放到iframe中执行,然后处理部分你只接受post方法传递来的变量,这样他单独刷新处理页面的时候变量值是获取不到的,那么自然就停止处理了,这样就达到他不能自行刷新的效果了。他如果直接刷新当前页面的话,那么所有的数据全部重载,一样是无效的。我只是提一个思路,而且我也用过这种方式,但具体这种方式好不好还得等高手来指教呢
个人最喜欢header,因为最简单,而且很多开源代码都是用的header,都没什么大问题啦
窗口B想要在header跳转到C之前,刷新一下窗口A,或者跳转之后刷新,但是不能在C页面上写代码刷新A
本来想使用echo "<script>
if (opener && typeof(window.opener.document)!='unknown' && typeof(window.opener.document)!='undefined')
{
opener.location.href=opener.location.pathname+opener.location.search;
}
</script>";
header("location:");
但是header前面的echo通常不起作用,
请问这时候应该怎么做?谢谢