php实现算术验证码功能


Posted in PHP onDecember 05, 2018

最近学了php的图像函数,也练习的验证码的实现,在听从老师的建议下,自己写了一个算术验证码的函数,第一次自己独立完成一个小练习,感觉挺开心的。但是,也知道自己的局限,所以特意写出来,希望各路大神指点一下,能够更多的拓展自己的视野。

php代码如下:实现验证码的功能

<?php
/**
 * @param int $width 宽度,默认为120
 * @param int $height 高度,默认为50
 * @param int $fontSize 字体的大小
 * @return 图片资源
 */
function arithmeticCode($width=120,$height=50,$fontSize=20){
  //开启session
  session_start();
  //创建画布
  $img = imagecreatetruecolor($width,$height);
  //分配颜色
  $color = imagecolorallocate($img,255,255,255);
  //填充颜色
  imagefill($img,0,0,$color);

  //干扰点
  for ($i = 0;$i < 500;$i++){
    $pixColor = imagecolorallocate($img,mt_rand(100,200),mt_rand(100,200),mt_rand(100,200));
    imagesetpixel($img,mt_rand(0,$width),mt_rand(0,$height),$pixColor);
  }
  //干扰线
  for ($i = 0;$i < 4;$i++){
    $lineColor = imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120));
    imageline($img,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),$lineColor);
  }

  //定义一个数组存放运算符号
  $arr = ['+','-','*'];
  //计算数组的长度
  $len = count($arr);
  //定义一个1到20的数组
  $num = range(1,20);
  $numLen = count($num);
  //定义一个空数组来存放随机取得的验证码
  $code = [];
  for ($i = 0;$i < $len;$i++) {
    if ($i == 1) {
      $code[] = $arr[mt_rand(0,$len-1)];
    }else {
      $code[] = $num[mt_rand(0,$numLen-1)];
    }
  }

  $str = implode($code);//将数组转为字符串
  $textColor = imagecolorallocate($img,mt_rand(100,200),mt_rand(100,200),mt_rand(100,200));
  $fontAngle = 0;
  $x = ($width - $fontSize*3)/2;
  $y = ($height - $fontSize) / 2 + $fontSize;
  imagettftext($img,$fontSize,$fontAngle,$x,$y,$textColor,"./img/msyh.ttc",$str);

  $res = getRes($code);


  //将函数存放在session中
  $_SESSION['res'] = $res;

  //输出图片
  header("content-type:image/png");
  imagepng($img);
}


/**
 * @param $arr 一个包含运算符号的数组
 * @return 返回一个运算结果
 */
function getRes($arr) {
  $sum = 0;
  //判断数组元素下标为1的运算符号是什么
  switch ($arr[1]){
    case '+':
      $sum = $arr[0] + $arr[2];
      break;
    case '-':
      $sum = $arr[0] - $arr[2];
      break;
    case '*':
      $sum = $arr[0] * $arr[2];
      break;
  }

  return $sum;
}

//调用函数
arithmeticCode(100,40,18);

html的部分代码

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
     content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    img {
      position: relative;
      top: 20px;
    }
  </style>
</head>
<body>
<form action="test.php">
  验证码 <input type="text" name="code">
  <img src="./demo5.php" alt="点击刷新">
  <br>
  <button>提交</button>
</form>
</body>
</html>
<script>
  //实现点击图片刷新验证码的功能
  var img = document.querySelector("img");
  img.onclick = function () {
    this.src = this.src+"?m="+Math.random();
  }
</script>

test.php的测试

<?php
session_start();
$res = $_SESSION['res'];
$value = $_GET['code'];
if ($res == $value) {
  echo "test success";
}else{
  echo "test fail";
}

以上就是我的代码组成.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
也谈截取首页新闻 - 范例
Oct 09 PHP
基于php split()函数的用法详解
Jun 05 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
php遍历树的常用方法汇总
Jun 18 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP类的特性实例分析
Sep 28 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
Yii2数据库操作常用方法小结
May 04 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 #PHP
Yii支持多域名cors原理的实现
Dec 05 #PHP
php判断电子邮件是否正确方法
Dec 04 #PHP
浅谈Laravel核心解读之Console内核
Dec 02 #PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 #PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 #PHP
php实现每日签到功能
Nov 29 #PHP
You might like
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
用python与文件进行交互的方法
2018/03/01 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
用 python 进行微信好友信息分析
2020/11/28 Python
C语言编程练习
2012/04/02 面试题
写自荐信有哪些不宜?
2013/10/17 职场文书
生产经理的自我评价分享
2013/11/07 职场文书
小学教师国培感言
2014/02/08 职场文书
公交公司毕业生求职信
2014/02/15 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
孩子教育的心得体会
2014/09/01 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
走进毛泽东观后感
2015/06/04 职场文书
交通事故协议书范本
2016/03/19 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript