A-A+

Thinkphp如何实现简单验证码

2018年09月14日 PHP开源系统 暂无评论 阅读 0 views 次

使用Thinkphp开发了一个代理商管理系统,而在前端给的模型当中,是需要添加一个简单验证码的,而在Thinkphp中是不需要引入外部类的,Thinkphp自带了验证码的类,我们只需要调用就可以了,所以在Thinkphp中实现验证码是较为简单的。

首先写控制器 Controller,如下代码:

  1. <?php    
  2. namespace Home\Controller;    
  3. use Think\Controller;    
  4. use Think\Verify;//这个类一定记得引用    
  5. class IndexController extends Controller {    
  6.     public function index(){    
  7.         $this->redirect('login');//重定向至login方法    
  8.     }    
  9.         
  10.     /*验证码*/    
  11.     public function verify(){    
  12.         $verify=new Verify();//新建一个验证码    
  13.         $verify->entry();//输出验证码    
  14.     }    
  15.         
  16.     /*登陆*/    
  17.     public function login(){    
  18.         $this->display();//调用对应模板中的login.html    
  19.     }    
  20.         
  21.     /*登陆验证*/    
  22.     public function login_do(){    
  23.         $code=I('code');    
  24.         $verify=new Verify();    
  25.         if($verify->check($code)){    
  26.             $this->success("验证成功");    
  27.         }else{    
  28.             $this->error("验证码错误");    
  29.         }    
  30.     }    
  31. }  

然后写模板 view 模块,比如新建一个 login.html,一定要对应控制器,如下代码:

  1. <form action="__URL__/login_do" method="post">  
  2.     <input type="text" placeholder="请输入验证码" name="code" required>  
  3.     <img src="{:U('verify')}" alt="" onclick="this.src='{:U('verify')}'" title="看不清换一张">  
  4.     <button>登陆</button>  
  5.   </form>  

验证码图片和onclick点击直接连接IndexController中的 verify 就可以了,比如 /index.php?m=Channel&c=Index&a=verify,确保这个链接可以打开,自行调试就ok了。

访问测试,直接打开 IndexController 中 login 就可以了,正常显示之后,我们还可以进行验证码的自定义化,在这个基础上来简化一下验证码,比如验证码长度宽度,杂点,混淆曲线等的设置,如下:

  1. /*验证码*/  
  2.     public function verify(){  
  3.         $config=array(  
  4.             'expire'=>  60,  //验证码的有效期(秒)  
  5.             'useImgBg'=>false  ,    //是否使用背景图片 默认为false  
  6.             'fontSize'=>35  ,    //验证码字体大小(像素) 默认为25  
  7.             'useCurve'=>true  ,    //是否使用混淆曲线 默认为true  
  8.             'useNoise'=>true  ,    //是否添加杂点 默认为true  
  9.             //'imageW'=>100  ,    //验证码宽度 设置为0为自动计算  
  10.             //'imageH'=>30  ,    //验证码高度 设置为0为自动计算  
  11.             'length'=>4  ,    //验证码位数  
  12.             //'fontttf'=>  ,    //指定验证码字体 默认为随机获取  
  13.             //'useZh'=>  ,    //是否使用中文验证码  
  14.             //'bg'=>  ,    //验证码背景颜色 rgb数组设置,例如 array(243, 251, 254)  
  15.             //'seKey'=>  ,    //验证码的加密密钥  
  16.             //'codeSet'=>  ,    //验证码字符集合 3.2.1 新增  
  17.             //'zhSet'=>  ,    //验证码字符集合(中文) 3.2.1 新增  
  18.         );  
  19.   
  20.         $verify=new Verify($config);//新建一个验证码  
  21.         $verify->entry();//输出验证码  
  22.     }  

我们可以根据网站前端的样式,比如验证码高度,宽度等等通过 Thinkphp 配置自定义验证码。

关于Thinkphp验证码无法显示的问题:

有的时候明明配置好了Thinkphp,结果却出现类似于如下的错误:

图像“http://site/index.php?act=seccode&op=funcode&nchash=101d10a9”因存在错误而无法显示。

遇到这种问题,我们需要清理一下输出缓冲区内容即可,在方法 verify() 调用验证码之前加上 ob_clean() 即可,如下所示:

  1. public function verify(){  
  2.             ob_clean();  
  3.             $verify = new \Think\Verify();  
  4.             $verify->entry();  
  5. }  

也就添加了一行 ob_clean()代码即可解决验证码不显示的问题,ob_clean函数的主要作用就是丢弃输出缓冲区中的内容,如果我们一直在测试中的话,可能会产生许多类似于验证码类的图片,如果想要正常访问的话,是需要经常清理输出缓冲区的。

标签:

给我留言