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 相关文章推荐
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
我的论坛源代码(九)
Oct 09 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
Apr 24 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
PHP实现的增强性mhash函数
May 27 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 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页面局部刷新功能的实现小结
2013/06/21 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
javascript操作css属性
2013/12/30 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
Python生成验证码实例
2014/08/21 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
linux环境下Django的安装配置详解
2019/07/22 Python
Python3常用内置方法代码实例
2019/11/18 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
服装发布会策划方案
2014/05/22 职场文书
向女朋友道歉的话
2015/01/20 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
Python测试框架pytest高阶用法全面详解
2022/06/01 Python