当提交数据到test.php时,如果test.php处理数据后,header("abc.php");(或者header("test.php"))如果用户在提交数据后按F5,那么页面在跳转到abc.php(或者新的test.php)之前,会不会重复提交数据?谢谢

解决方案 »

  1.   

    <?php
    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页面上去?
      

  2.   

    <input type="submit" name="TiJiao" value="提交">
    改为button后,ie8就只弹出一次alert
      

  3.   

    要说header前面不能有输出
    <?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
      

  4.   

    当提交数据到test.php时,test.php处理数据后,header("abc.php");(或者header("test.php"))如果用户在提交数据后按F5,那么页面在跳转到abc.php(或者新的test.php)之前,重复提交数据了。test.php页面重复处理数据,比如把数据插入到数据库里,那么,header不能有效得防止重复提交数据,对不对?
      

  5.   

    一般阻止重复提交,我都是用session来实现,因为不可以伪造。以注册为例:首先在打开注册from表单时,生成一个session。当用户提交后,检测session是否存在,如果存在则继续。
    经过一系列数据检测(及用户名是否合法,密码正确等),成功插入数据库后,清除这个session。当用户刷新时,又会遇到这个检测session是否存在的问题,而用户没有,因为已经被清空,则else header(“location:错误页面”)。
      

  6.   

    我试验了一下,代码如下
    <?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重复提交数据。
    哪位老大分析一下我说的对不对?
      

  7.   

    pandaidea:
    你说的这种情况,当用户第一次提交数据后,马上又按F5刷新,是不是会重复提交?
    假设服务器处理数据后,还是返回原来的页面。如果用户按了提交后,发现数据不对,就在当前的页面上再修改,然后再提交,就会发现不能提交修改的数据了。
      

  8.   

    如果你的header前能输出,那应该是你打开了某种方式的输出缓冲,输出的内容还是要放在header后面去的,后面的论断一个我觉得和ignore_user_abort设定有关(关于F5是否中断了前面的提交)另外一个这个过程大部分时候很快,似乎不必如此严格要求.....或者结合javascript来控制....另用session控制理论上在快速2次提交的情况下一样可能会出现重复...或者跳转到错误页面(用户以为成功的情况),并且在刷新时,用户会得到那个讨厌的"是否重复提交"对话框, 我觉得还不如用header当然一个办法是可以结合起来用...如果不怕麻烦...
      

  9.   

    我这边是header前面可以有echo "abccc";但是并没有输出到屏幕中。
      

  10.   

    1. 给跳转页的url后面加上一个参数 &msg='abccc'
    2. 在跳转页写echo $_GET['msg'];
      

  11.   

    上楼, 参数应该是 fackback.php?msg=abccc 后面没引号的
      

  12.   

    看了上面的方法还是觉得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>
      

  13.   

    wcunw:
    不知道还在不在,
    你这种方法的原理是什么?不太明白
      

  14.   

    我以前碰到类似问题时,做了个cookie 防刷验证。
    保证3秒钟之类只允许请求一次就好了。
      

  15.   


    也就是说在当前页面包含一个空白的iframe,然后提交内容处理的时候,用target把处理过程放到iframe中执行,然后处理部分你只接受post方法传递来的变量,这样他单独刷新处理页面的时候变量值是获取不到的,那么自然就停止处理了,这样就达到他不能自行刷新的效果了。他如果直接刷新当前页面的话,那么所有的数据全部重载,一样是无效的。我只是提一个思路,而且我也用过这种方式,但具体这种方式好不好还得等高手来指教呢
      

  16.   

    楼上所有方法都可行, 这个问题没那么恐怖的,不用这么严格的
    个人最喜欢header,因为最简单,而且很多开源代码都是用的header,都没什么大问题啦
      

  17.   

    窗口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通常不起作用,
    请问这时候应该怎么做?谢谢
      

  18.   

    header 前面不能有输出      ie 和火狐 兼容问题
      

  19.   

    那有没有办法在header前面刷新父窗口了?