PHP使用画布生成验证码及验证

demo的完整代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
    <link rel="stylesheet" type="text/css" href="./bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="./bootstrapValidator.min.css">
    <script type="text/javascript" src="./jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="./bootstrap.min.js"></script>   
    <script type="text/javascript" src="./bootstrapValidator.min.js"></script>
</head>
<body>
	<form id="form1" action="demo.php" method="post">
        <div class="form-group">
            <label for="yzm" class="col-sm-2 control-label">验证码</label>
            <div class="col-sm-4">
                <input type="text" class="form-control" id="yzm" name="yzm" placeholder="请输入验证码">
            </div>
            <div class="col-sm-6">
               <img width="100" src="yzm.php" id="validcode" alt="看不清楚,点击刷新">
            </div>            
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary btn-lg btn-block">登录</button>
            </div>
        </div>
	</form>
	<script type="text/javascript">
    $(function(){
         	$('#validcode').click(function(){
                /*alert(123)*/
                $(this).attr('src','yzm.php?'+Math.random());
         	})
    })

    $('form').bootstrapValidator({
            message: 'This value is not valid',
            feedbackIcons: {
                valid: 'glyphicon glyphicon-ok',
                invalid: 'glyphicon glyphicon-remove',
                validating: 'glyphicon glyphicon-refresh'
                           },
            fields: {
                yzm: {
                	validators: {
                		notEmpty: {
                            message: '验证码不能为空'
                        }
                	}
                }
            }
        });
	</script>
</body>
</html>

yzm.php代码

<?php

session_start();//sessionid,随机数
//案例:生成验证码
header('content-type:image/png');
//字符串,去掉不容易识别的i,l,o,I,L,O
$str = "abcdefghjkmnpqrstuvwyzABCDEFGHJKMNPQRSTUVWXYZ0123456789";

//画布
$width = 200;
$height = 100;
$img = imagecreatetruecolor($width,$height);

//颜色
$color = imagecolorallocate($img,0xcc,0xcc,0xcc);

//填充
imagefill($img,0,0,$color);

//画噪点
for($i=0;$i<100;$i++){
   $color = imagecolorallocate($img,rand(0,100),rand(0,100),rand(0,100));
   $x = rand(0,$width);
   $y = rand(0,$height);
   imagesetpixel($img,$x,$y,$color);
}

//画噪线
for($i=0;$i<30;$i++){
   $color = imagecolorallocate($img,rand(0,100),rand(0,100),rand(0,100));
   $x1 = rand(0,$width);
   $y1 = rand(0,$height);
   $x2 = rand(0,$width);
   $y2 = rand(0,$height);
   imageline($img,$x1,$y1,$x2,$y2,$color);
}

//画文字
$len = strlen($str);
$font = 'simsunb.ttf';
$yzm = '';
for($i=0;$i<4;$i++){
	$color = imagecolorallocate($img,255,0,0);
    $index = rand(0,$len);
    $chr = substr($str,$index,1);
    $yzm .= $chr;
    $x = 20 + $i * 40;
    $y = 80;
    imagettftext($img,50,rand(-70,70),$x,$y,$color,$font,$chr);
}

//保存会话
$_SESSION['yzm'] = $yzm;
//输出画布
imagepng($img);

//销毁画布
imagedestroy($img);

demo.php

<?php
session_start();

//获取表单中的数据
$yzm = $_POST['yzm'];

if(strcasecmp($yzm,$_SESSION['yzm']) != 0){
   echo '验证码输入错误';
}else{
   echo '验证码输入正确';
}

demo.html

我们在html中引入了bootstrap框架文件对文件的样式进行了丰富,
bootstrapValidator文件对验证码进行了非空验证,
和jquery文件对验证码进行了切换解决了看不清问题
效果图:
在这里插入图片描述

yzm.php

第一步:我们开启了回话
代码session_start();
第二步:定义了一个空数组。以便以后存放数组,
代码 $yzm = '';
第三步:我们在for循环里定义了一个chr变量,用于获取每一次循环得到的四位数中的第一位
代码 $chr = substr($str,$index,1);
第四步:我们使用 .= 把每一次循环得到的第一位连接起来。
$yzm .= $chr;
第五步:我们把得到的验证码放到imagettftext函数里
imagettftext($img,50,rand(-70,70),$x,$y,$color,$font,$chr);
第六步:保存回话
$_SESSION['yzm'] = $yzm;

demo.php

第一步:开启会话(只要使用session,我们就必须要开启会话)
第二步:获取表单中的数据
第三步:进行验证
if(strcasecmp($yzm,$_SESSION['yzm']) != 0){ echo '验证码输入错误'; }else{ echo '验证码输入正确'; }

strcasecmp

strcasecmp — 二进制安全比较字符串(不区分大小写)
说明
int strcasecmp ( string $str1 , string $str2 )
二进制安全比较字符串(不区分大小写)。
参数
str1 :第一个字符串。
str2 :第二个字符串。
返回值
如果 str1 小于 str2 ,返回负数;如果 str1 大于 str2 ,返回正数;二者相等则返回 0。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 PHP 代码示例来生成随机验证码图片: ```php <?php // 开启session session_start(); // 定义验证码字符集合 $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // 定义验证码长度 $length = 4; // 创建画布 $img = imagecreatetruecolor(100, 30); // 定义画布背景颜色 $bg_color = imagecolorallocate($img, 255, 255, 255); // 填充画布背景颜色 imagefill($img, 0, 0, $bg_color); // 生成验证码字符串 $code = ''; for ($i = 0; $i < $length; ++$i) { $code .= $chars[mt_rand(0, strlen($chars) - 1)]; } // 将验证码存入session $_SESSION['captcha_code'] = $code; // 将验证码绘制画布上 $color = imagecolorallocate($img, 0, 0, 0); imagestring($img, 5, 20, 8, $code, $color); // 添加干扰线条 for ($i = 0; $i < 3; ++$i) { $line_color = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); imageline($img, mt_rand(0, 100), mt_rand(0, 30), mt_rand(0, 100), mt_rand(0, 30), $line_color); } // 添加干扰点 for ($i = 0; $i < 50; ++$i) { $point_color = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); imagesetpixel($img, mt_rand(0, 100), mt_rand(0, 30), $point_color); } // 输出图片 header('Content-Type: image/png'); imagepng($img); // 销毁画布 imagedestroy($img); ?> ``` 在上面的示例中,我们使用了 `imagecreatetruecolor()` 函数来创建一个 100x30 大小的画布使用 `imagefill()` 函数填充了背景颜色,使用 `imagestring()` 函数将验证码字符串绘制画布上,并使用 `imageline()` 和 `imagesetpixel()` 函数添加了一些干扰线条和干扰点。最后,我们使用 `header()` 函数设置输出类型为 png 格式,并使用 `imagepng()` 函数将画布输出到浏览器上。生成验证码字符串会存储在 `$_SESSION['captcha_code']` 变量中,可以用于后续的验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值