php验证码实现代码(3种)


Posted in PHP onSeptember 07, 2015

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

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

<?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

<!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代码:

<?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();
  }

显示页面如下:

php验证码实现代码(3种)

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

<?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);

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

php验证码实现代码(3种)

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

<?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种)

以上就是php实现的三种验证码:纯数字验证码,数字加英文验证码,还有一种汉字验证码,希望对大家熟练掌握php验证码有所帮助。

PHP 相关文章推荐
PHP中操作ini配置文件的方法
Apr 25 PHP
基于php下载文件的详解
Jun 02 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
PHP中常用的字符串格式化函数总结
Nov 19 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP7 新特性详细介绍
Sep 06 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
PHP Web木马扫描器代码分享
Sep 06 #PHP
使用php-timeit估计php函数的执行时间
Sep 06 #PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 #PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 #PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 #PHP
PHP中error_reporting()用法详解
Aug 31 #PHP
大家在抢红包,程序员在研究红包算法
Aug 31 #PHP
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js的回调函数详解
2015/01/05 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python如何删除文件中重复的字段
2019/07/16 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
python3爬取torrent种子链接实例
2020/01/16 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
基于python实现删除指定文件类型
2020/07/21 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
内业资料员岗位职责
2014/01/04 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
排查整治工作方案
2014/06/09 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
办理房产证委托书
2014/09/18 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书