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 memcache扩展的三种安装方法
Apr 26 PHP
PHP中使用数组实现堆栈数据结构的代码
Feb 05 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
PHP实现合并discuz用户
Aug 05 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 PHP
php使用event扩展的io复用测试的示例
Oct 20 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内存不够用的快速解决方法
2013/10/26 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
python数据爬下来保存的位置
2020/02/17 Python
使用Pycharm分段执行代码
2020/04/15 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
linux下进程间通信的方式
2014/12/23 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
院药学专业个人求职信
2013/09/21 职场文书
大学生村官事迹材料
2014/01/21 职场文书
优秀小学生家长评语
2014/01/30 职场文书
国培教师自我鉴定
2014/02/12 职场文书
美国留学经济担保书
2014/05/20 职场文书
应聘教师求职信
2014/07/19 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
委托书范本格式
2019/04/18 职场文书
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android