基于php实现的验证码小程序


Posted in PHP onDecember 13, 2016

验证码功能(个人理解):

  • 减轻服务器的压力(如12306的验证码功能);
  • 防止暴力注册

个人思路:在a-z,A-Z,1-9生成n位随机的数来构成新的验证码。

关于生成验证码的几个小函数

range() //指定范围输出一个数组
  a)       如: range(1,9)
array_merge()//合并数组
  a)       array_merge(数组1,数组2….)
array_rand(数组,数量)
  a)       随机从数组中取出几个下标返回一个数组

  • shuffle(数组)//将再一次打乱数组中元素
  • mt_rand(指定一个范围) //生成一个更好的随机数
  • 如: mt_rand(1,5) //生成一个在1-5之间的任意数

生成验证码代码

<?php
 $arr1=range('a', 'z');//指定范围输出一个数组
 $arr2=range('A', 'Z');
 $arr3=range(1,9);
 $arr=array_merge($arr1,$arr2,$arr3); //合并数组
 $index = array_rand($arr,5); //在$arr中随机取5个数,返回值是$arr的下标
 Shuffle($index);
 $code = '';//定义一个空的字符串来存储生成的验证码用'点'来进行拼接
 foreach ($index as $key => $value) {//遍历数组
 $code.= $arr[$value];//根据下标取数组中的值
 }
 var_dump($code);
?>

运行结果截图

基于php实现的验证码小程序

完善:要把验证码添加到图像中这样的验证码才逼真

在完善之前先介绍有关图像创建的大致步骤

创建图像

方法一: 创建一个真彩色图像 (空画布)

imagecreatetruecolor(width, height) //创建一个真彩色图像

说明:

  • width : 画布的宽度(像素)
  • height: 画布的高度(像素)
  • 返回值为图像资源

基于php实现的验证码小程序

注意:

基于php实现的验证码小程序

为真彩色图像: 填充颜色

imagefill(image, x, y, color) //为图像资源填充颜色

说明:

  • image //图像资源
  • x,y,填充的坐标点(注意:填充的与此点最接近的颜色)
  • color; //用什么颜色来填充

为真彩色图像: 分配颜色

imagecolorallocate(image, red, green, blue)

说明:

  • image //图像资源
  • red: //红颜色(0-255) 或 0x(00-ff) //即十六进制来表示 (0xff就是255)
  • green//绿颜色(0-255)
  • blue //蓝颜色(0-255)

imagefill和imagecolorallocate的代码演示

在没有给画布填充颜色时的效果

基于php实现的验证码小程序

给画布填充颜色时的效果和代码

<?php
//创建图像资源(空白画布)默认显示为黑色
$image = imagecreatetruecolor(300, 400);
//1.image //图像资源
//2.red: //红颜色(0-255) 或 0x(00-ff) //即十六进制来表示 (0xff就是255)
//3.green//绿颜色(0-255)
//4.blue //蓝颜色(0-255)
$color = imagecolorallocate($image, 255, 0, 0);
//1.image //图像资源
//2.x,y,填充的坐标点(注意:填充的与此点最接近的颜色)
//3.color; //用什么颜色来填充
imagefill($image, 0, 0, $color);
//输出图像
header('content-type:image/jpeg');
imagejpeg($image);
//销毁图像资源
imagedestroy($image);
?>

结果截图;

基于php实现的验证码小程序

输出图像(以jpeg为例)

输出图像到浏览器

a)  header('content-type:image/jpeg'); //设置将图像通过浏览来查看

b)  imagejpeg(图像资源)

按文件进行输出图像

a)  imagejpeg(图像资源,'图像路径',图像的质量)    //质量取值0-100

b)  注意:

基于php实现的验证码小程序

注意:只能jpeg格式才有质量这个参数.

销毁图像

imagedestroy($image); //销毁图像,释放内存资源.

注意: 当前生成几个图像资源,就销毁几个.

验证码的整个代码:

<?php
//实例:让文本居于图像的正中
//创建图像资源(空白的画布)
$image = imagecreatetruecolor(100, 50);
$color = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
//为图像资源填充颜色
imagefill($image, 0, 0, $color);
//绘制图像
$font = 5;
//验证码的开始
$arr1 = range('a','z');
$arr3 = range('A','Z');
$arr2 = range(1,9);
//array_merge — 合并一个或多个数组
$arr = array_merge($arr1,$arr2,$arr3);
$index = array_rand($arr,5); //随机从原数组中找出5个下标
$string = '';
foreach ($index as $value) { //$value 两个功能,即是$index中的值,又是$arr中的下标
 $string .= $arr[$value]; //将得到字符进行连接
}
//验证码的结束
//mt_rand — 生成更好的随机数
//echo mt_rand(1,5);die;
//加入点干扰
$pointcolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
//循环创建1000个干扰点
for ($i=0; $i <1000 ; $i++) {
 imagesetpixel($image, mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)), $pointcolor);
}
//加入线的干扰
$lintecolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
// 循环创建50个线干扰
for ($i=0; $i <50 ; $i++) {
 imageline($image, mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)), mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)) ,$lintecolor);
}
//一个字符的宽度 imagefontwidth($font)
//字符串的个数: strlen(字符串)
//一个字符的宽度*字符串的个数
//所有字符串宽度和= 一个字符的宽度*字符串的个数
//$x = (画布的宽度-所有字符串宽度和)/2
$x = (imagesx($image)-imagefontwidth($font)*strlen($string))/2;
//$y = (画布的高度-字符的高度)/2;
//字符的高度: imagefontheight($font)
$y = (imagesy($image)-imagefontheight($font))/2;
$stringcolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));
imagestring($image, $font, $x, $y, $string, $stringcolor);
//输出图像
header('content-type:image/jpeg'); //设置将图像通过浏览来查看
imagejpeg($image,'',100); //将图像资源输出
//销毁图像资源
imagedestroy($image); //销毁图像

理解代码中的一些函数

加入干扰的点

imagesetpixel(image, x, y, color)

说明:x,y 一个点的坐标

基于php实现的验证码小程序

加入干扰的线

imageline(image, x1, y1, x2, y2, color)

说明: x1,y1是线的一个端点坐标; x2,y2是线的另一个端口的坐标; 由两点画一条线

基于php实现的验证码小程序

让验证码居于图像的正中

imagefontheight(font)获取字体的高度:
imagefontwidth(font)获取字体的宽度:
strlen(字符串)//获取字符串的长度
imagesx(image) //获取画布的宽度
imagesy(image) //获取画布的高度

基于php实现的验证码小程序

最后运行结果

基于php实现的验证码小程序

再次完善(和html代码结合起来)

Html代码

基于php实现的验证码小程序

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form name='frm' method='post' action=''>
 <table width="30%" border="2" align="center" rules="all" cellpadding="10">
 <tr>
  <th colspan="2">请输入信息</th>
 </tr>
 <tr>
  <th>姓名:</th>
  <th><input type="text" name="username"></input></th>
 </tr>
 <tr>
  <th>密码:</th>
  <th><input type="password" name="userpwd"></input></th>
 </tr>
 <tr> 555556
  <th>验证码</th>
  <th><input type = 'text' name = 'checkcode'></input><img src="21.php" style="cursor:pointer" onclick="this.src='21.php'?+Math.random()"></th>
 </tr>
 <tr>
  <th colspan="2"><input type="submit" name="submit" value="提交"></input></th>
 </tr>
</table>
</form>
</body>
</html>

理解;

基于php实现的验证码小程序

最后结果截图

基于php实现的验证码小程序

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
几个php应用技巧
Mar 27 PHP
php GD绘制24小时柱状图
Jun 28 PHP
php 高效率写法 推荐
Feb 21 PHP
PHP计数器的实现代码
Jun 08 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
PHP环形链表实现方法示例
Sep 15 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
php 微信开发获取用户信息如何实现
Dec 13 #PHP
php断点续传之文件分割合并详解
Dec 13 #PHP
php json_encode与json_decode详解及实例
Dec 13 #PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 #PHP
php一个文件搞定微信jssdk配置
Dec 12 #PHP
php自定义扩展名获取函数示例
Dec 12 #PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 #PHP
You might like
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
JQuery 风格的HTML文本转义
2009/07/01 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
python 循环while和for in简单实例
2016/08/16 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
python删除字符串中指定字符的方法
2018/08/13 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
django框架ModelForm组件用法详解
2019/12/11 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
Python中os模块功能与用法详解
2020/02/26 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
python+opencv实现车道线检测
2021/02/19 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
应届生求职推荐信
2013/10/28 职场文书
物流管理专业应届生求职信
2013/11/21 职场文书
社区科普工作方案
2014/06/03 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
研讨会致辞
2015/07/31 职场文书
mysql部分操作
2021/04/05 MySQL
Python自动化之批量处理工作簿和工作表
2021/06/03 Python