//a.php内容如下
<?php
session_start();
header('Cache-control: private');//防止返回表单值丢失 
?>
<html>
<body>
 <form  method="post" enctype="multipart/form-data" action="b.php">
<input type="text" name="name" />
<input type="submit" value="提交" />
 </form>
</body>
</html>//b.php内容如下
<html>
<body>
<a href="javascript:history.go(-1)">保留表单值返回测试</a>
<a href="javascript:location.href='a.php'">不保留表单值返回测试</a>";
</body>
</html>
/*
不知道为什么,如果提交a.php的表单到b.php的时候,如果点击第一个按钮(保留表单值返回测试),有时候会出现
该网页已经过期的提示,但也不是一定出现大约有1/20的概率会出现网页过期,我用的是ie浏览器,不知道为什么,请大家帮忙,还有就是如果在a.php当中把缓存页面的时间搞长一点吧,如果提交到b.php之后点击第二个按钮的话(不保留表单值返回测试),则a.php表单当中的内容还会保留,好矛盾啊?程序的每个页面都是用这种方式跳转的,修改起来不是太方便,希望大家帮忙找出原因来,谢谢
*/

解决方案 »

  1.   

    去掉enctype="multipart/form-data"试试
      

  2.   

    try:
    =============================
    session_cache_limiter('private');
    session_start();
      

  3.   

    up  有点意思不过个人觉得,这个cookie是客户端的东西,不知道能不能通过程序改变 ...
    做到最后可能无用 ..
      

  4.   

    文提出在这里:
    enctype="multipart/form-data"如果不需要上传文件,去掉这个就可以了。
    如果需要上传文件,就不能用JavaScript返回
    把这段代码改成链接
    javascript:history.go(-1)
    在session保存输入数据。
      

  5.   

    不太明白:在session保存输入数据。是什么意思啊?
      

  6.   


    这种情况都是把数据保存到session里面的,没有你这么弄的。
    就是把$_REQUEST的数据放到$_SESSION里面,
    如果还不明白,自己去翻翻书吧。
      

  7.   

    这种情况都是把数据保存到session里面的,没有你这么弄的。
    就是把$_REQUEST的数据放到$_SESSION里面,
    如果还不明白,自己去翻翻书吧。
    不好意思,再打扰您一下,你说的意思是不是说:
    把提交的表单数据保存在session里面,如果提交验证不通过的话,返回表单的话,再把session的值填入表单?
    这样的话?启不是每次提交都要新建立session文件?而且php的session垃圾回收机制也不是太好啊?
      

  8.   


    这种情况是根据validation结果调用不同的view文件,form中直接使用$_REQUEST数据。
    明白这里的意思吗?用session自然要有管理步骤,垃圾如何回收,控制在你自己。方法有很多,具体用那种,依照你的情况首选的是容易接受的,
    不过无论有什么方法,javascript:history.go(-1)这种依存于浏览器的处理肯定是行不通的。
      

  9.   


    如froole所说的。js中的history.go(-1)是有浏览器控制的。从语义上来说history就是历史记录了。历史记录回退,当然会提示你过期。这种作法是取巧的行为。非常没有科学依据啊。。(-_-)b一种常规的解决方案。
    SESSION和COOKIE.第三方的用flash等其它的共享存储对像。COOKIE只能存4KB的本地数据。所以如果是小表单的话可以利用它的。当你提交表单时:
    <html>
        <body>
             <form  method="post" enctype="multipart/form-data" action="b.php" onsubmit="saveMyData()"> //<---写一个预存储js函数,将数据存入cookie.再提交数据至php
                <input type="text" name="name" value="<?=$_COOKIE['youValueKey']?>"/> //<---此处写一个测试过的值进行填充也行。如果不空在Cookie值,也就表明,用户没有填写数据。那么,给一个''空值value就好了。
                <input type="submit" value="提交" />
             </form>
        </body>
    </html>SESSION 的方案,始终是下下策。。SESSION就是文件!服务器写文件。如果项目不大就用吧。
    方法:
    将$_POST的值存入$_SESSION,然后再进行处理。当点击返回a.php文件时(静态的,别用history)再从$_SESSION中读取出来。一定要记住MVC模式的规范。数据处理就是数据处理,视图就是视图,控制器就是控制器。不要使用不可预测的“小技巧”就是王道。
      

  10.   

    谢谢楼上的,我也感觉SESSION 的方案,始终是下下策
    何况session对于radio表单类型的返回保存状态太复杂还得判断一下哪个选择上了,
    请楼上的推荐一种方案吧
      

  11.   

    那是因为在你的页面里有使用了post提交数据 或开启session的原因,你在头部加上
    if(@function_exists(session_cache_limiter)) {
    @session_cache_limiter("private, must-revalidate");
      }
    再测试下,应该问题就不存在了!
      

  12.   

    cookie或者flash的SharedObject。具体方法我就不说了,网上已经把这些教程都写烂了。
      

  13.   

    一般都是直接指定url链接回去,history.go这种东西一般很少用.
      

  14.   

    建议lz别听风就是雨,
    去卓越找本评价比较高的php入门书,先从模仿开始。
    有老师教,问问老师是最好。闭门造车,很容易走弯路!
      

  15.   

    #  froole
    谢谢我也知道
    闭门造车,很容易走弯路! 
    但是手头上正在为自己写一个cms想写完之后在出去找工作见识一下外面的技术,
    但是没有完成这个cms之前,真的不想出去,唉,我也没有办法啊
      

  16.   

    javascript:history.go(-1)把这个改成js
    跳到你想去的页面
      

  17.   


    你想在那两个页面里写些什么内容? 为何弄得如些复杂,我看你说"session对于radio表单类型..."就一头问号,是想做个文件提交吗? 验证错误就返回,并把错误信息返回? 书上应该有介绍这功能吧,好似很简单的.
      

  18.   

    用户提交表单a后,在b里验证,错的信息保存于COOKIE,并返回于a页,在a页检查到有COOKIE就输吧,没COOKIE,表单的value就空着
      

  19.   

    好方法就是在a.php里加一个iframe name='hidd'在b.php中的form里 <form target="hidd"这样,提交后就后在iframe里调用b,a.php不会有任何变化,如果有出错,你只要在b.php里alert()出来就行了,如果成功
    你再 parent.location.href进行跳转很适合输入内容很多的页面,感觉像ajax是的,哈,或干脆用ajax
      

  20.   

    如果不想保证表单值 ,在页面a.php中禁止缓存,然后把下面内容改下
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache"); 
    <a href="javascript:location.href='a.php'">不保留表单值返回测试</a>";==><a href="a.php">不保留表单值返回测试</a>";
      

  21.   


    如果 form 的使用了 method="post" 方法,再退回到上一页,是肯定会报页面过期的。如果你的条件允许,可以改成 method="get",这样就肯定不会报过期。但最好的解决方法,还是用 Session 记录当前的值,用第二个按钮的链接进入到上一个页面,并再将 Session 变量写回对应的 field中。
      

  22.   

    get明文传输好像不可行啊,
    那启不是每个提交的表单都要手动的写入返回session的值,如果有一百个这样的表单不就麻烦死了,唉,
    还是不可行啊?
      

  23.   

    这是浏览器认为表单过期的原因,最好最保险的方法是多写点代码,而不是用 js 的 history.back类似将表单存在session之类的
      

  24.   

    我有大约100个这样的表单啊?如果用session的话,每个回转表单都要用session,
    例如返回的单单格式如下:<form>
    <intput type="radio" sex="1" if($_SESSION["sex"]) == "1" echo " checked='checked " >男
    <input type="radio" sex="2"  if($_SESSION["sex"]) == "1" echo " checked='checked " >女
    </form>不知道楼上说的是这个意思吗?如果是这样的话不太好吧,麻烦死了啊?
    也许我理解的意思不对,还请指教。
      

  25.   

    sigh这个问题讨论的过头了……froole的方法是最标准的,为什么不肯用呢?就算你用100个表单,那么你就可以考虑创建自己的类来处理表单了……
      

  26.   

    用cookie吧。如果要通用,还是比较麻烦。
    其实有更简单的办法。提交的时候用ajax提交,这样页面不刷新了,也不存在保留不保留表单的问题。<?php
    session_start();
    ?>
    <html>
        <body>
             <form  method="post" enctype="multipart/form-data" action="b.php">
                
             <input type="text" name="name" value="<?php  
    if ($_COOKIE['name'])
    {
       echo $_COOKIE['name'];
    }
    ?>"/>
                <input type="submit" value="提交" />
             </form>
        </body>
    </html>//b.php内容如下
    <php?
    setcookie('name',htmlspecialchars($_POST['name']), time()+561600,'/');//
    ?>
    <html>
        <body>
            <a href="javascript:location.href='a.php">保留表单值返回测试</a>
            
        </body>
    </html>