PHP 提交表单失败后如何保留已经填写的信息

  • 1.使用header头设置缓存控制头Cache-control。

    PHP代码如下:

    ?
    1
    header( 'Cache-control: private, must-revalidate' ); //支持页面回跳

    2.使用session_cache_limiter方法。

    PHP代码如下:

    ?
    1
    session_cache_limiter( 'private, must-revalidate' ); //要写在session_start方法之前

    下面介绍一下session_cache_limiter参数:

    session_cache_limiter内的几个参数意义是:
    nocache:当然是不缓存(比如:表单信息被清除),但公共变量可以缓存
    private:私有方式缓存(比如:表单信息被保留,但在生存期内有效)
    private_no_cache:私有方式但不过期(表单信息被保留)
    publice:公有方式,(表单信息也被保留)
    设置缓存过期时间:session_cache_expire函数设置,缺省是180分钟。

    常遇见问题:

    1.session_cache_limiter("private");表单信息是保留了,但是如果我修改已经提交的信息,表单页面所呈现的信息还是缓存里信息,没能及时自动刷新,如果不用session_cache_limiter("private");又不能保留表单信息
    解决方案:

    在session_start前面加上

    ?
    1
    session_cache_limiter( "private, must-revalidate" );

    即可。

    2.另一种办法我们可以使用ajax来实例

    index.html模板文件大致内容如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    < html >
    < head >
    < title >jQuery Ajax 实例演示</ title >
    </ head >
    < script src = "./js/jquery.js" type = "text/javascript" ></ script >
    < script type = "text/javascript" >
    $(document).ready(function(){//这个就是jQueryready ,它就像C语言的main 所有操作包含在它里面
      $("#button_login").mousedown(function(){
      login(); //点击ID为"button_login"的按钮后触发函数 login();
      });
      function login(){ //函数 login();
       var username = $("#username").val();//取框中的用户名
       var password = $("#password").val();//取框中的密码
       $.ajax({ //一个Ajax过程
        type: "post", //以post方式与后台沟通
        url : "login.php", //与此php页面沟通
        dataType:'json',//从php返回的值以 JSON方式 解释
        data: 'username='+username+'&password='+password, //发给php的数据有两项,分别是上面传来的u和p
        success: function(json){//如果调用php成功
        //alert(json.username+'n'+json.password); //把php中的返回值(json.username)给 alert出来
        $('#result').html("姓名:" + json.username + "< br />密码:" + json.password); //把php中的返回值显示在预定义的result定位符位置
        }
       });
      }
      //$.post()方式:
      $('#test_post').mousedown(function (){
       $.post(
        'login.php',
        {
        username:$('#username').val(),
        password:$('#password').val()
        },
        function (data) //回传函数
        {
         var myjson='';
         eval_r('myjson=' + data + ';');
         $('#result').html("姓名1:" + myjson.username + "< br />密码1:" + myjson.password);
        }
       );
      });
      //$.get()方式:
      $('#test_get').mousedown(function (){
       $.get(
        'login.php',
        {
        username:$('#username').val(),
        password:$('#password').val()
        },
        function(data) //回传函数
        {
         var myjson='';
         eval_r("myjson=" + data + ";");
         $('#result').html("姓名2:" + myjson.username + "< br />密码2:" + myjson.password);
        }
       );
      });
    });
    </ script >
    < body >
    < div id = "result" style = "background:orange;border:1px solid red;width:300px;height:200px;" ></ div >
    < form id = "formtest" action = "" method = "post" >
    < p >< span >输入姓名:</ span >< input type = "text" name = "username" id = "username" /></ p >
    < p >< span >输入密码:</ span >< input type = "text" name = "password" id = "password" /></ p >
    </ form >
    < button id = "button_login" >ajax提交</ button >
    < button id = "test_post" >post提交</ button >
    < button id = "test_get" >get提交</ button >
    </ body >
    </ html >

    login.php文件的内容如下:

    ?
    1
    2
    3
    <?php
    echo json_encode( array ( 'username' => $_REQUEST [ 'username' ], 'password' => $_REQUEST [ 'password' ]));
    ?>












  • session_cache_limiter(private,must-revalidate)是什么意思

    表义一:

    指定会话页面所使用的缓冲控制方法:
    当session_cache_limiter('private')时,用处是让表单history.go(-1)的时候,填写内容不丢失!就避免页面失效的警告!

    表义二:

    这个会话与header('cache-control:private,must_revalidate');效果相同

 

但是要值得注意的是session_cache_limiter()方法要写在session_start()方法之前才有用;

 

支持页面回跳详解,session_cache_limiter()的使用详解

 

现在表单的填写,我们可以用AJAX对用户随时进行验证,进行友好的提示,但是在用户没有留意AJAX友好提示,提交了错误的表单,跳回原页,而填写的信息却全部丢失了。要支持页面回跳,有以下的办法:

  • 1.使用session_cache_limiter方法:
  1. session_cache_limiter('private,must-revalidate');  
session_cache_limiter('private,must-revalidate');

但是要值得注意的是session_cache_limiter()方法要写在session_start()方法之前才有用;

  • 2.用header来设置控制缓存的方法:

 

在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。

第一,使用Header方法设置消息头Cache-control 
引用:
header('Cache-control: private, must-revalidate');//支持页面回跳
第二,使用session_cache_limiter方法 
引用:
//注意要写在session_start方法之前
session_cache_limiter('private, must-revalidate');

补充:
Cache-Control消息头域说明
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if- cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

Public指示响应可被任何缓存区缓存。

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

no-cache指示请求或响应消息不能缓存

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

关于表单刷新

问:为什么我在点击浏览器的后退按钮后,所有字段的信息都被清空了?

答:这是由于你在你的表单提交页面中使用了 session_start 函数。该函数会强制当前页面不被缓存。解决办法为,在你的 Session_start 函数后加入 header(双引号Cache-control: private双引号); 注意在本行之前你的PHP程序不能有任何输出。

补充:还有基于session的解决方法,在session_start前加上 
引用:
session_cache_limiter('nocache');// 清空表单
session_cache_limiter('private'); //不清空表单,只在session生效期间
session_cache_limiter('public'); //不清空表单,如同没使用session一般

可以在session_start();前加上 session_cache_limiter('private,max-age=10800');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值