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数据浏览器
Mar 11 PHP
php str_pad 函数使用详解
Jan 13 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
利用PHP实现智能文件类型检测的实现代码
Aug 02 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
php超快高效率统计大文件行数
Jul 05 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP钩子实现方法解析
May 21 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 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判断变量的函数
2012/04/24 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
js中url对象化管理分析
2017/12/29 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
3种python调用其他脚本的方法
2020/01/06 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
通过cmd进入python的步骤
2020/06/16 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
个人自我鉴定
2013/11/07 职场文书
工商管理系学生的自我评价分享
2013/11/29 职场文书
化验室安全管理制度
2015/08/06 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
一级电子管军用接收机测评
2022/04/05 无线电