美文网首页
ThinkPHP技巧-POST过滤

ThinkPHP技巧-POST过滤

作者: AS凡凡妈妈 | 来源:发表于2017-06-20 16:09 被阅读0次

    下面文章介绍了如下几个问题的解决方法仅供参考:

    问题:

    1. 表单 post 重复提交?

    2.限制 post 模拟提交?

    3.数据 add() 自增id出现奇数偶数?


    1.如何解决表单 post 重复提交?

    a.页面提交后转到另一个页面而不是本页面,举个栗子,比如你的页面地址为

    http://yourdomain.com/User/Index/login

    则该页面的表单action地址可以为另外的处理地址,如

    <form action="{:U('User/Index/check_login')}" method="post">

    这样报错返回,或者用户点击回退按钮,还是会回到上一个地址

    b.提交表单后提交按钮变灰/隐藏提交按钮

    通过JS来动态监听用户的点击动作,动态将按钮属性置成disabeld,即为灰色不可用。代码如下:

    <form action="{:U('User/Index/check_login')}"  method="post">
         <input type="text" name="uname" value="" id="uname" />
         <input type="password" name="userpwd" id="userpwd" />
         <input type="submit" name="login_btn" id="login_btn" value="登录" />
    </form>

    JS:

    $().ready(function(){
      $("#login_btn").on('click',function(){    
          $(this).attr('disabled',true);    
       });
    });

    c. 使用隐藏随机TOKEN值的方法进行重复提交判断

    首先,在项目的functions.php中添加如下方法

    //创建TOKEN
    functioncreateToken(){ 
        $code = chr(
                      mt_rand(0xB0,0xF7)) .
                      chr(mt_rand(0xA1,0xFE)) .    
                      chr(mt_rand(0xB0,0xF7)) .
                      chr(mt_rand(0xA1,0xFE)) .
                      chr(mt_rand(0xB0,0xF7)) .
                      chr(mt_rand(0xA1,0xFE)
                      ); 
      session('TOKEN', authcode($code));
    }
    //判断TOKEN
    function checkToken($token){
        if($token == session('TOKEN')) {
            session('TOKEN',NULL);
            returnTRUE;  
         }else{
             returnFALSE;  
         }
    }
    /* 加密TOKEN */
    functionauthcode($str){
        $key ="YOURKEY";   
        $str = substr(md5($str),8,10);
       returnmd5($key . $str);
    }

    在表单页面form中填入以下HTML代码

    HTML:

    <input type="hidden" name="TOKEN"  value="{:session('TOKEN')}" />

    在页面展示前调用creatToken()方法生成token,在相应控制器POST请求中 使用 checkToken() 进行判断是否重复提交

    if(IS_POST){
      $post_token = I('post.TOKEN');
      if(!checkToken($post_token)){
          $this->error('请不要重复提交页面',U('User/Index/login')); 
       }
    }

    基本上,就能解决ThinkPHP开发中表单重复提交问题,当然,有同学说可以使用ThinkPHP的令牌环机制,这样其实就更简单了,TP会默认在表单中生成一个隐藏域,到时候判断这个隐藏域是否存在以及和session中的值是否想的即可,原理和方法3是一样的。

    2.如何限制表单post模拟提交?

    //如果是ajax 的post提交在控制器下方法内加入代码:

    if(IS_AJAX&&IS_POST){
      // 同时需要判定post是否是页面定义的post参数,非页面定义的参数,提示请求参数溢出
     ......
    }

    //若果只是post提交在控制器下方法加入代码:
    if(IS_POST){
        // 同时需要判定post是否是页面定义的post参数,非页面定义的参数,提示请求参数溢出
       ......
    }

    3.thinkphp调用add()方法时候自增id出现奇数偶数如何处理?

    #首先,查看mysql当前数据库自增长的步长?
            SHOW VARIABLES LIKE 'auto_inc%';
    #然后,查看结果 auto_increment_increment 的值是否等于 1 ,如果是1代表以1递增,如果是2代表以2递增......
    #最后设定每次增长步长
          SET @auto_increment_increment=1;

    #若想在表中的主键id以奇数出现,则设置为 SET @auto_increment_increment=奇数; 例如=3
    #若想在表中的主键id以奇数出现,则设置为 SET @auto_increment_increment=偶数; 例如=2
    #若想在表中的主键id以顺序增长1出现,则设置为 SET @auto_increment_increment=1;      


    相关文章

      网友评论

          本文标题:ThinkPHP技巧-POST过滤

          本文链接:https://www.haomeiwen.com/subject/wmwoqxtx.html