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 相关文章推荐
escape unescape的php下的实现方法
Apr 27 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
php判断用户是否手机访问代码
Jun 08 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
Laravel配合jwt使用的方法实例
Oct 25 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+java实现自动新闻滚动窗口
2006/10/09 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
利用PHP实现短域名互转
2013/07/05 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
YII路径的用法总结
2014/07/09 PHP
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
管理失职检讨书
2015/05/05 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
运动会3000米加油稿
2015/07/21 职场文书
Python基础之数据结构详解
2021/04/28 Python
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL