验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码。

好吧,其实是没有事情干,但是又不想浪费时间,所以学习了下php实现验证码。正所谓,技多不压身。而且,也可以封装成一个函数,以后使用的时候也是很方便的,当然现在未封装。
现在来说说简单的纯数字验证码吧。
如果是初学者,建议按照我代码的注释 //数字  一步步来。最简单的方法,还是把整个代码复制走了。
新建一个captcha.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
  //10>设置session,必须处于脚本最顶部
  session_start();
  $image  = imagecreatetruecolor(100, 30);   //1>设置验证码图片大小的函数
  //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
  $bgcolor  = imagecolorallocate( $image ,255,255,255);  //#ffffff
  //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
  imagefill( $image , 0, 0,  $bgcolor );
  //10>设置变量
  $captcha_code  "" ;
  //7>生成随机数字
  for ( $i =0; $i <4; $i ++){
   //设置字体大小
   $fontsize  = 6;  
   //设置字体颜色,随机颜色
   $fontcolor  = imagecolorallocate( $image , rand(0,120),rand(0,120), rand(0,120));    //0-120深颜色
   //设置数字
   $fontcontent  = rand(0,9);
   //10>.=连续定义变量
   $captcha_code  .=  $fontcontent
   //设置坐标
   $x  = ( $i *100/4)+rand(5,10);
   $y  = rand(5,10);
   imagestring( $image , $fontsize , $x , $y , $fontcontent , $fontcolor );
  }
  //10>存到session
  $_SESSION [ 'authcode' ] =  $captcha_code ;
  //8>增加干扰元素,设置雪花点
  for ( $i =0; $i <200; $i ++){
   //设置点的颜色,50-200颜色比数字浅,不干扰阅读
   $pointcolor  = imagecolorallocate( $image ,rand(50,200), rand(50,200), rand(50,200));  
   //imagesetpixel — 画一个单一像素
   imagesetpixel( $image , rand(1,99), rand(1,29),  $pointcolor );
  }
  //9>增加干扰元素,设置横线
  for ( $i =0; $i <4; $i ++){
   //设置线的颜色
   $linecolor  = imagecolorallocate( $image ,rand(80,220), rand(80,220),rand(80,220));
   //设置线,两点一线
   imageline( $image ,rand(1,99), rand(1,29),rand(1,99), rand(1,29), $linecolor );
  }
  //2>设置头部,image/png
  header( 'Content-Type: image/png' );
  //3>imagepng() 建立png图形函数
  imagepng( $image );
  //4>imagedestroy() 结束图形函数 销毁$image
  imagedestroy( $image );

接着就是静态页的代码了:index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!doctype html>
< html >
  < head >
   < meta  http-equiv = "Content-Type"  content = "text/html; charset=UTF-8" >
   < title >确认验证码</ title >
  </ head >
  < body >
   < form  method = "post"  action = "./form.php" >
    < p >验证码: < img  id = "captcha_img"  border = '1'  src='./captcha.php?r=<?php echo rand(); ?>' style="width:100px; height:30px" />
     < a  href = "javascript:void(0)"  onclick = "document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()" >换一个?</ a >
    </ p >
    < P >请输入验证码:< input  type = "text"  name = 'authcode'  value = '' /></ p >
    < p >< input  type = 'submit'  value = '提交'  style = 'padding:6px 5px;' /></ p
  </ body >
</ html >

从index.html可以看到,提交的表单是到form.php的,所以还要有一个判断的form.php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
   header( "Content-Type:text/html;charset=utf-8" );       //设置头部信息
   //isset()检测变量是否设置
   if (isset( $_REQUEST [ 'authcode' ])){
     session_start();
     //strtolower()小写函数
     if ( strtolower ( $_REQUEST [ 'authcode' ])==  $_SESSION [ 'authcode' ]){
       //跳转页面
       echo  "<script language=\"javascript\">" ;
       echo  "document.location=\"./form.php\"" ;
       echo  "</script>" ;
     } else {
       //提示以及跳转页面
       echo  "<script language=\"javascript\">" ;
       echo  "alert('输入错误!');" ;
       echo  "document.location=\"./form.php\"" ;
       echo  "</script>" ;
     }
     exit ();
   }

显示页面如下:

那么,纯数字的实现了,数字加英文的也应该不难了,废话不多说了,拉代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
  //10>设置session,必须处于脚本最顶部
  session_start();
  $image  = imagecreatetruecolor(100, 30);   //1>设置验证码图片大小的函数
  //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
  $bgcolor  = imagecolorallocate( $image ,255,255,255);  //#ffffff
  //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
  imagefill( $image , 0, 0,  $bgcolor );
  //10>设置变量
  $captcha_code  "" ;
  //7>生成随机的字母和数字
  for ( $i =0; $i <4; $i ++){
   //设置字体大小
   $fontsize  = 8;  
   //设置字体颜色,随机颜色
   $fontcolor  = imagecolorallocate( $image , rand(0,120),rand(0,120), rand(0,120));    //0-120深颜色
   //设置需要随机取的值,去掉容易出错的值如0和o
   $data  = 'abcdefghigkmnpqrstuvwxy3456789' ;
   //取出值,字符串截取方法 strlen获取字符串长度
   $fontcontent  substr ( $data , rand(0, strlen ( $data )),1);
   //10>.=连续定义变量
   $captcha_code  .=  $fontcontent ;  
   //设置坐标
   $x  = ( $i *100/4)+rand(5,10);
   $y  = rand(5,10);
   imagestring( $image , $fontsize , $x , $y , $fontcontent , $fontcolor );
  }
  //10>存到session
  $_SESSION [ 'authcode' ] =  $captcha_code ;
  //8>增加干扰元素,设置雪花点
  for ( $i =0; $i <200; $i ++){
   //设置点的颜色,50-200颜色比数字浅,不干扰阅读
   $pointcolor  = imagecolorallocate( $image ,rand(50,200), rand(50,200), rand(50,200));  
   //imagesetpixel — 画一个单一像素
   imagesetpixel( $image , rand(1,99), rand(1,29),  $pointcolor );
  }
  //9>增加干扰元素,设置横线
  for ( $i =0; $i <4; $i ++){
   //设置线的颜色
   $linecolor  = imagecolorallocate( $image ,rand(80,220), rand(80,220),rand(80,220));
   //设置线,两点一线
   imageline( $image ,rand(1,99), rand(1,29),rand(1,99), rand(1,29), $linecolor );
  }
  //2>设置头部,image/png
  header( 'Content-Type: image/png' );
  //3>imagepng() 建立png图形函数
  imagepng( $image );
  //4>imagedestroy() 结束图形函数 销毁$image
  imagedestroy( $image );

其他的两个页面,不许要修改。

一般而言,现在就已经够用了。但是就像动漫一样,总会有番外。
那么,我们来个汉字的番外吧。其实我也准备将汉字的验证码放到我的毕业设计里面,虽然现在很流行滑动验证码,但是本人毕竟不是专门学习js的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
  //11>设置session,必须处于脚本最顶部
  session_start();
  //1>设置验证码图片大小的函数
  $image  = imagecreatetruecolor(200, 60);  
  //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
  $bgcolor  = imagecolorallocate( $image ,255,255,255);  //#ffffff
  //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
  imagefill( $image , 0, 0,  $bgcolor );
  //7>设置ttf字体
  $fontface  'FZYTK.TTF' ;
  //7>设置字库,实现简单的数字储备
  $str = '天地不仁以万物为刍狗圣人不仁以百姓为刍狗这句经常出现在控诉暴君暴政上地残暴不仁把万物都当成低贱的猪狗来看待而那些高高在上的所谓圣人们也没两样还不是把我们老百姓也当成猪狗不如的东西但实在正取的解读是地不情感用事对万物一视同仁圣人不情感用事对百姓一视同仁执子之手与子偕老当男女主人公含情脉脉看着对方说了句执子之手与子偕老女方泪眼朦胧含羞地回一句讨厌啦这样的情节我们是不是见过很多但是我们来看看这句的原句死生契阔与子成说执子之手与子偕老于嗟阔兮不我活兮于嗟洵兮不我信兮意思是说战士之间的约定说要一起死现在和我约定的人都走了我怎么活啊赤裸裸的兄弟江湖战友友谊啊形容好基友的基情比男女之间的爱情要合适很多吧' ;
  //str_split()切割字符串为一个数组,一个中文在utf_8为3个字符
  $strdb  str_split ( $str ,3); 
  //>11
  $captcha_code  '' ;
  //8>生成随机的汉子
  for ( $i =0; $i <4; $i ++){
   //设置字体颜色,随机颜色
   $fontcolor  = imagecolorallocate( $image , rand(0,120),rand(0,120), rand(0,120));    //0-120深颜色
   //随机选取中文
   $in  = rand(0, count ( $strdb ));
   $cn  $strdb [ $in ];
   //将中文记录到将保存到session的字符串中
   $captcha_code  .=  $cn ;
   /*imagettftext (resource $image ,float $size ,float $angle ,int $x ,int $y,int $color,
   string $fontfile ,string $text ) 幕布 ,尺寸,角度,坐标,颜色,字体路径,文本字符串
   mt_rand()生成更好的随机数,比rand()快四倍*/
   imagettftext( $image , mt_rand(20,24),mt_rand(-60,60),(40* $i +20),mt_rand(30,35), $fontcolor , $fontface , $cn );
  }
  //11>存到session
  $_SESSION [ 'authcode' ] =  $captcha_code ;
  //9>增加干扰元素,设置点
  for ( $i =0; $i <200; $i ++){
   //设置点的颜色,50-200颜色比数字浅,不干扰阅读
   $pointcolor  = imagecolorallocate( $image ,rand(50,200), rand(50,200), rand(50,200));  
   //imagesetpixel — 画一个单一像素
   imagesetpixel( $image , rand(1,199), rand(1,59),  $pointcolor );
  }
  //10>增加干扰元素,设置线
  for ( $i =0; $i <4; $i ++){
   //设置线的颜色
   $linecolor  = imagecolorallocate( $image ,rand(80,220), rand(80,220),rand(80,220));
   //设置线,两点一线
   imageline( $image ,rand(1,199), rand(1,59),rand(1,199), rand(1,59), $linecolor );
  }
  //2>设置头部,image/png
  header( 'Content-Type: image/png' );
  //3>imagepng() 建立png图形函数
  imagepng( $image );
  //4>imagedestroy() 结束图形函数 销毁$image
  imagedestroy( $image );

其他的页面也是不需要修改的。

效果图如下:

php验证码实现代码(3种)验证类相关推荐

  1. PHP 代码实现表单数据验证类 整理的各种情况

    这篇文章主要介绍了PHP代码实现表单数据验证类,需要的朋友可以参考下 下面通过一段PHP代码实现表单数据验证类,具体介绍如下: 非常好用方便的表单数据验证类 --------------------- ...

  2. PHP代码实现表单数据验证类

    下面通过一段PHP代码实现表单数据验证类,具体介绍如下: 非常好用方便的表单数据验证类 <?php //验证类 class Fun{ function isEmpty($val) { if (! ...

  3. Flutter 完美的验证码输入框(2 种方法)

    Flutter 完美的验证码输入框(2 种方法) 本文向您展示了在 Flutter 中实现完美的验证码输入框几种不同方法. 重点是什么? 真实世界的 完美的验证码输入框或 PIN 输入 UI 通常满足 ...

  4. C#验证:正则表达式 验证类和界面处理(手机号码,邮箱,IP地址)

    使用步骤: 1.创建验证类 2.界面调用验证类中的方法进行验证 实例代码演示如下 1.创建验证类 using System; using System.Collections.Generic; usi ...

  5. 客户端控件Javascript验证类

    客户端控件Javascript验证类 2005-09-20 javascritp一直是web开发的利器,在Ajax逐渐流行以后,javascript又更焕发活力.但是别误会,本文不讨论如何用javas ...

  6. Flask项目实战——6—(前台用户模型、前台登录注册、图形验证码、手机短信验证码、添加表单验证短信验证码请求)

    1.前台用户模型 前台用户模型定义 创建前台模型文件 apps/front/models.py # -*- encoding: utf-8 -*- """ @File : ...

  7. 技术汇总:第七章:三种验证方式

    第一种验证码 b.html <!DOCTYPE html> <html><head><meta charset="UTF-8">&l ...

  8. 分析|拥有11种验证方式的顶象无感验证,不仅省钱,还省时

    验证码"作为人机交互界面经常出现的元素,其本质是为了防止用户利用机器人程序自动注册.登录.恶意投票.发送垃圾邮件.恶意尝试密码等登陆尝试,保证网络安全." 据统计,全球所有人每天需 ...

  9. django authentication_classes自定义权限验证类 authenticate

    什么是身份认证 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或与其签名的令牌)关联的机制. 视图的最开始处运行身份验证 在权限和限制检查发生之前,以及在允许继续执行任何其他代码之前,始终在视 ...

  10. c# 图形验证码生成 代码解析

    之前做登录时,发送短信验证码需要做安全控制,使用到了图形验证码 使用的思路是: 1.建立一个验证码图片生成器页面 2.生成字母或数字组成的随机字符串 3.在Cookie中保存随机验证码 4.根据生成的 ...

最新文章

  1. 日记 [2008年03月23日]LINUX网关后面的pptp ***客户机连接***
  2. 白名单模板_亚马逊品牌备案常见问题—— 白名单、IP加速器及品牌备案后无法使用A+...
  3. 以图搜图Python实现Hash算法
  4. 一款java代码生成器(我受够了加班),走起!
  5. 【C++】 C++标准模板库(八) MultiMaps
  6. 分布式架构中一致性解决方案——Zookeeper集群搭建
  7. 编程学习笔记(第三篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(3)软件开发的现状、UML扩展...
  8. 前端工具:推荐几款UI设计师好用的设计软件
  9. 【渝粤题库】陕西师范大学201371 国际法学作业
  10. MAC 设置$PATH 关闭terminal后就失效 解决方案
  11. P2657 [SCOI2009]windy数
  12. centos中安装配置nginx完成之后主机无法访问
  13. android studio 中由于网络问题,编译错误
  14. Spark-SQL与hive整合【版本spark1.6.0+hive0.14】--Standalone模式
  15. 办公室电脑里的文件和家里电脑的文件同步,有什么便签软件可以实现
  16. Win10系统 禁止某个程序\软件联网
  17. 7-2 The Judger (25分)
  18. Python轻松制作王者荣耀自动刷金币脚本
  19. 马尔可夫蒙特卡洛(MCMC)-从平稳分布,细致平衡到Metropolis-Hastings和Gibbs采样
  20. 系统安装 使用VMware15安装Win7系统

热门文章

  1. iPhone 8快速充电技术简介,苹果再也不能被安卓嘲笑充电慢
  2. java 调用远程grpc_帮你节省一半时间的gRPC入门指南
  3. VM VirtualBox虚拟机添加虚拟硬盘
  4. 别人比25岁的今日,你去比25岁后的明天!!!
  5. 表单的内容用WORD形式保存
  6. 红米手机查看屏幕厂家
  7. 唯众物联网—基于物联网平台的Andorid实验设计与实现教学实训资源 免费开源
  8. WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果
  9. Unity导出apk时报错:UnauthorizedAccessException:Access to the path“F:\“ is denied
  10. 三轴加速度计值检测碰撞和摔倒