thinkphp3.2点击刷新生成验证码


Posted in PHP onFebruary 16, 2016

再介绍thinkphp3.2验证码的使用方法之前,先为大家详细介绍ThinkPHP 验证码,具体内容如下

ThinkPHP 内置了验证码的支持,可以直接使用。要使用验证码,需要导入扩展类库中的 ORG.Util.Image 类库和 ORG.Util.String 类库。
验证码方法
我们通过在在模块类中增加一个 verify 方法来用于显示验证码,最简单的例子:

Public function verify(){
  // 导入Image类库
  import("ORG.Util.Image");
  Image::buildImageVerify();
}

import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。如果已经将 Image 类库拷贝到了当前项目下,如 Lib/ORG 下,则可以以:

import("@.Util.Image");

import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。
访问验证码
可以直接在浏览器里访问该验证码方法以确定验证码是否能正常显示:
http://127.0.0.1/index.php/Public/verify
如果一切正常,显示验证码如下所示:

thinkphp3.2点击刷新生成验证码

表单中使用验证码
在表单页面中使用验证码,是以 html img标签 来调用:

<input type="text" name="verify">
<img id="verifyImg" src="-Article-verify" onClick="changeVerify()" title="点击刷新验证码" />

src 属性值即为验证码方法访问地址,视实际情况不同而不同。
验证码刷新
当点击验证码图片时,触发 JavaScript changeVerify() 函数重新读取验证码,从而实现验证码刷新。该函数参考如下:

<script language="JavaScript">
function changeVerify(){
 var timenow = new Date().getTime();
 document.getElementById('verifyImg').src='-Article/verify/'+timenow; 
}
</script>

验证码验证
在调用验证码 verify 的时候,buildImageVerify 会记录本次验证码的 MD5 信息。在表单验证操作里,以如下方法来检查验证码是否正确:

if($_SESSION['verify'] != md5($_POST['verify'])) {
  $this->error('验证码错误!');
}

其中 $_SESSION['verify'] 中的 verify 名称为 buildImageVerify 方法默认 SESSION 注册名称,具体见 buildImageVerify 语法。
上面例子演示了最简单的 ThinkPHP 验证码的使用方法。上面的例子验证码是 4 位数字,如果想使用更多风格的验证码以及中文验证码,参见本节其余部分内容:《ThinkPHP 使用不同风格及中文的验证码》。
验证码不显示原因
如下发现无法显示验证码,可能的原因如下:
1、PHP 是否已经安装 GD 库支持。
2、输出之前是否有任何的输出(尤其是 UTF8 的 BOM 头信息输出)。
3、Image 类库是否正确导入。
4、如果是表单页面,请查看是否正确调用了验证码显示方法。

下面就为大家介绍 thinkphp3.2 验证码生成和点击刷新验证码的实现方法,具体内容如下

一、实例化生成验证码的类(该方法放到IndexController里面便于访问)

/** 
 * 
 * 验证码生成 
 */ 
public function verify_c(){ 
  $Verify = new \Think\Verify(); 
  $Verify->fontSize = 18; 
  $Verify->length  = 4; 
  $Verify->useNoise = false; 
  $Verify->codeSet = '0123456789'; 
  $Verify->imageW = 130; 
  $Verify->imageH = 50; 
  //$Verify->expire = 600; 
  $Verify->entry(); 
}

二、前台需要生成验证码的图片src属性指向

<p class="top15 captcha" id="captcha-container"> 
 <input name="verify" width="50%" height="50" class="captcha-text" placeholder="验证码" type="text">         
 <img width="30%" class="left15" height="50" alt="验证码" src="{:U('Home/Index/verify_c',array())}" title="点击刷新"> 
</p>

三、写完上面的后,页面初始化的验证码就可以出现了,下面要写的就是点击验证码图片后,刷新出新的验证码图片(通过jquery修改图片的src属性来完成,请求的处理函数一样,只是在请求后加一个随机数,区别上一张图片的请求)

// 验证码生成 
var captcha_img = $('#captcha-container').find('img') 
var verifyimg = captcha_img.attr("src"); 
captcha_img.attr('title', '点击刷新'); 
captcha_img.click(function(){ 
  if( verifyimg.indexOf('?')>0){ 
    $(this).attr("src", verifyimg+'&random='+Math.random()); 
  }else{ 
    $(this).attr("src", verifyimg.replace(/\?.*$/,'')+'?'+Math.random()); 
  } 
});

四、校验验证码输入是否正确
a.在common目录下的function.php里加入全局函数

/** 
 * 验证码检查 
 */ 
function check_verify($code, $id = ""){ 
  $verify = new \Think\Verify(); 
  return $verify->check($code, $id); 
}

b.在表单提交的controller对应的处理方法里添加检查代码

// 检查验证码 
$verify = I('param.verify',''); 
if(!check_verify($verify)){ 
  $this->error("亲,验证码输错了哦!",$this->site_url,9); 
}

到此tp3.2验证码的使用就可以了。
补充:我在写的时候将四的b步骤放到一个ajax里验证,返回一次检验结果。然后再依据返回结果确定是否要提交表单,但是在验证码通过第一次的校验后,第二次的就不可以了,目前还没想明白原因。

这就是本文的全部内容,文章最后还有一个小小的疑问,希望大家可以想出解决办法,也希望本文对大家的学习有所帮助。

PHP 相关文章推荐
php Smarty模板生成html文档的方法
Apr 12 PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
Codeigniter中集成smarty和adodb的方法
Mar 04 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
yii2学习教程之5种内置行为类详解
Aug 03 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
PHP模拟post提交数据方法汇总
Feb 16 #PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 #PHP
PHP的Yii框架入门使用教程
Feb 15 #PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 #PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 #PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 #PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 #PHP
You might like
APMServ使用说明
2006/10/23 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
详解Python迭代和迭代器
2016/03/28 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
Python中格式化字符串的四种实现
2020/05/26 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
Python3.9.1中使用split()的处理方法(推荐)
2021/02/07 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
国际政治个人自荐信范文
2013/11/26 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
2015年大学社团工作总结
2015/04/09 职场文书