如果您觉得该文章对您有帮助,让更多人受用,请关注“键盘码农”,转发该文章。
该案例共分为4个文件:code.php(验证码随机生成方法)、register.html(验证码测试界面)、register.php(验证码判断)、verify.php(验证码)。
随机验证码生成案例(原生)
code.php(验证码随机生成方法)
<?php
/**
* 随机生成验证码
*$width : 宽度
*$height: 高度
*$type: 要产生的验证码的类型
0表示纯数字, 1表示纯字符, 2表示数字字符混合 3表示计算
*$num: 验证码的个数
至少是两个
*/
// code();
function code($width = 100, $height = 50, $type = 1, $num = 4)
{
//创建画布
$image = imagecreatetruecolor($width, $height);
//给画布创建颜色
//给画布上画矩形
imagefilledrectangle($image, 0, 0, $width, $height,light_color($image));
//生成验证码
switch ($type) {
case 0:
$code = rand_number($num);
break;
case 1:
$code = rand_char($num);
break;
case 2:
$code = rand_num_char($num);
break;
case 3:
$code = rand_computer();
break;
}
//将验证码画到画布上
$w = ceil($width / $num);
for ($i = 0; $i < $num; $i++) {
$x = mt_rand($i * $w, ($i + 1) * $w - 10);
$y = mt_rand(0 + 5, $height - 15);
//一次只能画一个字符
imagechar($image, 5, $x, $y, $code[$i], dark_color($image));
}
//给验证码上加干扰元素 点 弧度
for ($i = 0; $i < 100; $i++) {
imagesetpixel($image, mt_rand(0, $width), mt_rand(0, $height), dark_color($image));
}
for ($i = 0; $i < 10; $i++) {
imagearc($image, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, 90), mt_rand(0, 180), dark_color($image));
}
//告知浏览器要显示的文件类型
header('Content-type: image/png');
//显示到浏览器
imagepng($image);
//关闭资源
imagedestroy($image);
//返回验证码
return $code;
}
/**
* 生成浅色系
*/
function light_color($image)
{
return imagecolorallocate($image, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
}
/**
* 生成深色系
*/
function dark_color($image)
{
return imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
}
function rand_number($num)
{
//方式一:
// $str = '0123456789';
// $str = str_shuffle($str);
// return substr($str, 0, $num);
//方式二:
// $arr = range(0, 9);
// shuffle($arr);
// $str = join('', $arr);
// return substr($str, 0, $num);
//方式三
$arr = range(0, 9);
shuffle($arr);
$arr = array_slice($arr, 0, $num);
return join('', $arr);
}
/**
* 生成纯字符的验证码
*/
function rand_char($num)
{
//方式一
// $str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// $str = str_shuffle($str);
// return substr($str, 0, $num);
//方式二:
// $a = range('a', 'z');
// $b = range('A', 'Z');
// $arr = array_merge($a, $b);
// shuffle($arr);
// $arr = array_slice($arr, 0, $num);
// return join('', $arr);
//方式三
$a = range('a', 'z');
$b = range('A', 'Z');
$arr = array_merge($a, $b);
//键值对调
$arr = array_flip($arr);
$arr = array_rand($arr, $num);
return implode('', $arr);
}
/**
* 产生数字字母混合验证码
*/
function rand_num_char($num)
{
//方式一
// $a = range(0, 9);
// $b = range('a', 'z');
// $c = range('A', 'Z');
// $arr = array_merge($a, $b, $c);
// shuffle($arr);
// $arr = array_slice($arr, 0, $num);
// return join('', $arr);
//方式二:
$str = '';
for ($i = 0; $i < $num; $i++) {
//产生一个0-2的随机数, 0表示0-9, 1表示a-z 2表示A-Z
$rand = mt_rand(0, 2);
switch ($rand) {
case 0:
$str .= chr(mt_rand(48, 57));
break;
case 1:
$str .= chr(mt_rand(97, 122));
break;
case 2:
$str .= chr(mt_rand(65, 90));
break;
}
}
return $str;
}
function rand_computer()
{
$arr = ['+', '-', '*'];
$a = mt_rand(1, 9);
$b = mt_rand(1, 9);
$rand = mt_rand(0, 2);
return $a .$arr[$rand]. $b. '=';
}
php验证码生成
register.html(验证码测试界面)
<!DOCTYPE html>
<html>
<head>
<title>验证码</title>
<meta charset="utf-8">
</head>
<body>
<form action="register.php" method="post">
<input type="text" name="code">
<img src="verify.php">
<input type="submit" name="dosubmit" value="提交">
</form>
</body>
</html>
php验证码生成测试
register.php(验证码判断)
<?php
session_start();
$code = $_POST['code'];
if (strcasecmp($code, $_SESSION['code'])) {
exit('验证码输入错误,请让人操作');
} else {
exit('输入正确');
}
verify.php(要调用的验证码)
<?php
include 'code.php';
session_start();
$_SESSION['code'] = code(75, 20, 2, 4);
多看多测试,包括验证码生成的多种方法都已一一举例,希望对您有所帮助,如有疑问不懂的地方欢迎提问,谢谢!