基于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数组内存耗用太多问题的解决方法
Apr 05 PHP
ThinkPHP3.2.2的插件控制器功能简述
Jul 09 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
PHP单例模式详细介绍
Jul 01 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
Aug 20 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
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
vue mounted组件的使用
2018/06/18 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python中使用Inotify监控文件实例
2015/02/14 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
你们项目是如何进行变更控制的
2015/08/26 面试题
材料物理专业大学毕业生求职信
2013/10/15 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
大学生毕业自我鉴定
2013/11/06 职场文书
工地安全检查制度
2014/02/04 职场文书
领班岗位职责范文
2014/02/06 职场文书
新任教师自我鉴定
2014/02/24 职场文书
给老师的一封建议书
2014/03/13 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
入党申请书怎么写?
2019/06/21 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
mysql的单列多值存储实例详解
2022/04/05 MySQL