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 相关文章推荐
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
简单的php文件上传(实例)
Oct 27 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 PHP
php实现仿写CodeIgniter的购物车类
Jul 29 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP count_chars()函数讲解
Feb 14 PHP
对laravel的session获取与存取方法详解
Oct 08 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
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
多个应用共存的Django配置方法
2018/05/30 Python
Python中一般处理中文的几种方法
2019/03/06 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
python内存动态分配过程详解
2019/07/15 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
linux面试题参考答案(7)
2014/07/24 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
什么是Web Service?
2012/07/25 面试题
如何进行有效的自我评价
2013/09/27 职场文书
人事专员的职责
2014/02/26 职场文书
股权转让协议书范本
2014/04/12 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
SQL基础的查询语句
2021/11/11 MySQL
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python