Thinkphp如何实现简单验证码
使用Thinkphp开发了一个代理商管理系统,而在前端给的模型当中,是需要添加一个简单验证码的,而在Thinkphp中是不需要引入外部类的,Thinkphp自带了验证码的类,我们只需要调用就可以了,所以在Thinkphp中实现验证码是较为简单的。
首先写控制器 Controller,如下代码:
- <?php
- namespace Home\Controller;
- use Think\Controller;
- use Think\Verify;//这个类一定记得引用
- class IndexController extends Controller {
- public function index(){
- $this->redirect('login');//重定向至login方法
- }
- /*验证码*/
- public function verify(){
- $verify=new Verify();//新建一个验证码
- $verify->entry();//输出验证码
- }
- /*登陆*/
- public function login(){
- $this->display();//调用对应模板中的login.html
- }
- /*登陆验证*/
- public function login_do(){
- $code=I('code');
- $verify=new Verify();
- if($verify->check($code)){
- $this->success("验证成功");
- }else{
- $this->error("验证码错误");
- }
- }
- }
然后写模板 view 模块,比如新建一个 login.html,一定要对应控制器,如下代码:
- <form action="__URL__/login_do" method="post">
- <input type="text" placeholder="请输入验证码" name="code" required>
- <img src="{:U('verify')}" alt="" onclick="this.src='{:U('verify')}'" title="看不清换一张">
- <button>登陆</button>
- </form>
验证码图片和onclick点击直接连接IndexController中的 verify 就可以了,比如 /index.php?m=Channel&c=Index&a=verify,确保这个链接可以打开,自行调试就ok了。
访问测试,直接打开 IndexController 中 login 就可以了,正常显示之后,我们还可以进行验证码的自定义化,在这个基础上来简化一下验证码,比如验证码长度宽度,杂点,混淆曲线等的设置,如下:
- /*验证码*/
- public function verify(){
- $config=array(
- 'expire'=> 60, //验证码的有效期(秒)
- 'useImgBg'=>false , //是否使用背景图片 默认为false
- 'fontSize'=>35 , //验证码字体大小(像素) 默认为25
- 'useCurve'=>true , //是否使用混淆曲线 默认为true
- 'useNoise'=>true , //是否添加杂点 默认为true
- //'imageW'=>100 , //验证码宽度 设置为0为自动计算
- //'imageH'=>30 , //验证码高度 设置为0为自动计算
- 'length'=>4 , //验证码位数
- //'fontttf'=> , //指定验证码字体 默认为随机获取
- //'useZh'=> , //是否使用中文验证码
- //'bg'=> , //验证码背景颜色 rgb数组设置,例如 array(243, 251, 254)
- //'seKey'=> , //验证码的加密密钥
- //'codeSet'=> , //验证码字符集合 3.2.1 新增
- //'zhSet'=> , //验证码字符集合(中文) 3.2.1 新增
- );
- $verify=new Verify($config);//新建一个验证码
- $verify->entry();//输出验证码
- }
我们可以根据网站前端的样式,比如验证码高度,宽度等等通过 Thinkphp 配置自定义验证码。
关于Thinkphp验证码无法显示的问题:
有的时候明明配置好了Thinkphp,结果却出现类似于如下的错误:
图像“http://site/index.php?act=seccode&op=funcode&nchash=101d10a9”因存在错误而无法显示。
遇到这种问题,我们需要清理一下输出缓冲区内容即可,在方法 verify() 调用验证码之前加上 ob_clean() 即可,如下所示:
- public function verify(){
- ob_clean();
- $verify = new \Think\Verify();
- $verify->entry();
- }
也就添加了一行 ob_clean()代码即可解决验证码不显示的问题,ob_clean函数的主要作用就是丢弃输出缓冲区中的内容,如果我们一直在测试中的话,可能会产生许多类似于验证码类的图片,如果想要正常访问的话,是需要经常清理输出缓冲区的。