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面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
Apr 26 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
php设计模式之策略模式应用案例详解
Jun 17 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
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php教程之phpize使用方法
2014/02/12 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
深入理解javascript中的this
2021/02/08 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python之list对应元素求和的方法
2018/06/28 Python
python实现机器人卡牌
2019/10/06 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
高级工程师岗位职责
2013/12/15 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
综合实践活动方案
2014/02/14 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
前台接待员岗位职责
2015/04/15 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
Go语言读取txt文档的操作方法
2022/01/22 Golang
SQL Server使用导出向导功能
2022/04/08 SQL Server