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 相关文章推荐
Look And Say 序列php实现代码
May 22 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
PHP遍历数组的方法汇总
Apr 30 PHP
php实现可逆加密的方法
Aug 11 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
php字符串函数 str类常见用法示例
May 15 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 array_push 数组函数
2009/12/26 PHP
php自动加载的两种实现方法
2010/06/21 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
django 创建过滤器的实例详解
2017/08/14 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
python字典key不能是可以是啥类型
2020/08/04 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
JAVA代码查错题
2014/10/10 面试题
高中物理教学反思
2014/02/08 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
绩效工资实施方案
2014/03/15 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
反邪教标语
2014/06/23 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书