thinkphp3.2 验证码的生成和校验,以及遇到的一些问题

时间:2024-03-10 07:25:27

      已经自学了三个月的php了,感觉好像什么都了解了一点,又还是什么都不会。归根结底还是不怎么总结和做记录的原因吧   每天都会遇到问题,有时候折腾个半天一天的就解决了,时间一久又会忘记,碰到相同的问题又是懵比。

相比起学习新的知识,对于之前学过的用过的东西总结我想更为的重要一些吧。

      最近利用thinkphp做了一个简单的后台内容管理程序,可以对数据库进行数据的增删改查,可以将midi文件上传,将下载链接保存到数据库中。将数据库中表数据读取生成xml文件 以供 app开发人员调用。

      下面是我在做后台登陆验证码的刷新校验时遇到的一个比较常见的问题。

      1、验证码的生成

      2、前台点击即使刷新

      3、登录提交时 ajax+jquery会进行二次验证,此时会一直提示验证码错误的问题。

 

      贴出代码。

 1                 //显示验证码
 2         public function verify(){
 3                 $config = array(
 4                 \'imageW\'=>100,
 5                 \'imageH\'=>26,
 6                 \'fontSize\'=>14,
 7                 \'length\'=>4,
 8                 \'useNoise\'=>false,
 9                 \'codeSet\'=>\'0123456789\',
10             );
11             $Verify = new \Think\Verify($config);
12             $Verify->entry();
13         }   
          <th>验证码:</th>
                    <td>
                        <input type="code" class="len250" name="code"/>
                        <img src="{:U(\'verify\')}" alt="验证码" id="code" onclick="this.src = this.src + \'?\'"/> 
                    </td>
1         //校验验证码  写在Common/Common/function.php 里边,在控制器校验验证码时调用
2     function check_verify($code,$id = ""){
3         $verify = new \Think\Verify();
4         return $verify->check($code,$id);
5     }
1         //异步校验验证码 
2     public function checkcode(){
3         $code = I(\'post.code\');
4         if(check_verify($code)===false){
5             echo 0;
6         }else{
7             echo 1;
8         }
9     }
 1         //jquery 验证验证码
 2     $("input[name=\'code\']").blur(function(){
 3         var code = $("input[name=\'code\']");
 4         if(code.val().trim()==\'\'){
 5             code.parent().find("span").remove().end().append("<span class=\'error\'>验证码不能为空</span>");
 6             return ;
 7         }
 8         $.post(CONTROL+"/checkcode",{code:code.val().trim()},function(stat){
 9             if(stat==1){
10                 validate.code=0;
11                 code.parent().find("span").remove();
12                 return;
13             }else{
14                 code.parent().find("span").remove().end().append("<span class=\'error\'>验证码错误</span>");
15                 return;
16             }
17 
18         })
19     })            
1      <script type="text/javascript" src="__PUBLIC__/js/jquery-1.7.2.min.js"></script>
2         <script type="text/javascript" src="__PUBLIC__/js/login.js"></script>
3         <script>
4             var  CONTROL = "__APP__/home/Login";
5         </script>

 

    在写完以上代码的时候,验证码就可以显示并且即使验证了。

    但是这个时候会出现前文提到的第三个问题,在点击提交submit的时候,会进行二次验证,此时会提示验证码错误。

    其实原因还是出在Thinkphp的Verify.class.php上:

 1 // 中文验证码字符串
 2         \'useImgBg\'  =>  false,           // 使用背景图片 
 3         \'fontSize\'  =>  25,              // 验证码字体大小(px)
 4         \'useCurve\'  =>  true,            // 是否画混淆曲线
 5         \'useNoise\'  =>  true,            // 是否添加杂点    
 6         \'imageH\'    =>  0,               // 验证码图片高度
 7         \'imageW\'    =>  0,               // 验证码图片宽度
 8         \'length\'    =>  5,               // 验证码位数
 9         \'fontttf\'   =>  \'\',              // 验证码字体,不设置随机获取
10         \'bg\'        =>  array(243, 251, 254),  // 背景颜色
11         \'reset\'     =>  false,           // 验证成功后是否重置
12         );

      最后一个reset 默认是true,只需要改为false 就不会出现这个问题了。