基于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 相关文章推荐
PHP4(windows版本)中的COM函数
Oct 09 PHP
set_include_path在win和linux下的区别
Jan 10 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
PHP控制循环操作的时间
Apr 01 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将字符串转换成数字的方法
2019/01/27 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
Angular网络请求的封装方法
2018/05/22 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
python字符串连接的N种方式总结
2014/09/17 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
Python中函数参数匹配模型详解
2019/06/09 Python
pytorch 共享参数的示例
2019/08/17 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
护理实习自我鉴定
2013/12/14 职场文书
开业庆典邀请函
2014/01/08 职场文书
技能比赛获奖感言
2014/02/14 职场文书
承诺书范文
2014/06/03 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
董事长新年致辞
2015/07/29 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android