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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
php表单习惯用的正则表达式
Oct 11 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数组操作
2011/12/30 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
老生常谈ES6中的类
2017/07/31 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python重试装饰器的简单实现方法
2019/01/31 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
英国大码女性时装零售商:Evans
2018/08/29 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
大学生入党思想汇报
2014/01/01 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
研究生个人学年总结
2015/02/14 职场文书
工作自我推荐信范文
2015/03/25 职场文书