//封装一个随机字符串函数,以便调用
function rand_str($len=4, $style=1){
switch($style){
//如果$style=1,则他是0-9的纯数字数组
//如果$style=2,则他是a-z的纯字母数组,array_merge()合并数组
//如果$style=3,则他是a-z 0-9 的字母数字组合数组,
//默认值是字母数字全有
case 1: $arr = range(0, 9); break;
case 2: $arr = array_merge(range('a', 'z'), range('A', 'Z')); break;
case 3: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9)); break;
default: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
}
//随机打乱数组
shuffle($arr);
//截取一段数组元素,0是表示从头开始取,正数从头开始取,负数从尾开始取
$subarr = array_slice($arr, 0, $len);
//implode()把数组元素组合为字符串并返回
return implode($subarr);
}
$code = rand_str();
echo $code;
image.png
session_start();
开始会话
$_SESSION['verify'] = strtolower($code);
结束会话,并把通话过程中产生的数据保存为一个数组
可以到另一个页面读取会话,以实现页面之间的通信
<?php
/*
将6个参数封装成一个数组之后,不但传参可以单独传,而且不用管顺序
在这里给参数,下面varify()传参数,就可以修改了
$config = ['style'=>3, 'disturb'=>false, 'size'=> 30, 'len' => 6];
*/
//调用验证码函数
varify();
//封装验证码函数
function varify($config=[]){
//相当于从这里开始保存,到下面结束$_SESSION['verify'] = strtolower($code);处结束
session_start();
header("content-type: image/png;");//告诉浏览器文件类型
//将这6个参数封装成一个数组$config,如果给定参数,就是用给定的
//如果没有给参数,就使用默认的
//style是随机字符串,1是数字,2是字母,3是数字加字母
//宽度和高度如果传了参数就以传的参数为准,否则用默认的
$size = !empty($config['size'])?$config['size']:20;
$len = !empty($config['len'])?$config['len']:4;
$style = !empty($config['style'])?$config['style']:1;
$width = !empty($config['width'])?$config['width']:($size + 5)*$len;
$height = !empty($config['width'])?$config['width']:$size + 15;
//默认需要干扰,在调试的时候可以关掉它,改成false就没有干扰了
//这里不能用!empty,应为false是空,empty也是空,会出错
//所以用isset来设置
$disturb = isset($config['disturb'])?$config['disturb']:true;
//创建画布
$im = imagecreatetruecolor($width, $height);
$gray = imagecolorallocate($im, 240, 240, 240);
$black = imagecolorallocate($im, 0, 0, 0);
//验证码画布设置背景颜色
imagefill($im, 0, 0, $gray);
//画干扰
//角度、x、y轴、颜色都给随机范围
//if是判断是否需要干扰,用于调试
//for是干扰
if($disturb){
//随机给0-50个干扰项
for($i=0; $i<50; $i++){
$c = rand_str(1, 3);
//颜色范围随机
$color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
//角度、x、y轴都给随机范围
imagechar($im, mt_rand(1, 5), mt_rand(0, $width), mt_rand(0, $height), $c, $color);
}
}
$code = rand_str($len, $style);
//session在这里接收随机出来的验证码字符串,并把他转换成小写
//验证码一般都是只输小写就可以了
//将他转换成小写之后,到另一个页面进行比较
$_SESSION['verify'] = strtolower($code);
//将随机出来的字符分别提取出来一个一个显示
//给每一个字符不定的位置和不定的显示角度
for($i=0; $i<strlen($code); $i++){
//每一个字符的位置坐标移动多少距离
$x = $size*$i+10;
//$y的坐标在这两个值之间随机产生
$y = mt_rand($height-10, $height-5);
imagettftext($im, $size, mt_rand(0, 20), $x, $y, $black, 'C:/Windows/Fonts/simsun.ttc', $code[$i]);
}
imagepng($im);//有两个参数,有第二个就是存储,没有就是显示
imagedestroy($im);//销毁画布资源
}
//封装一个随机字符串函数,以便调用
function rand_str($len=4, $style=1){
switch($style){
//如果$style=1,则他是0-9的纯数字数组
//如果$style=2,则他是a-z的纯字母数组,array_merge()合并数组
//如果$style=3,则他是a-z 0-9 的字母数字组合数组,
//默认值是字母数字全有
case 1: $arr = range(0, 9); break;
case 2: $arr = array_merge(range('a', 'z'), range('A', 'Z')); break;
case 3: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9)); break;
default: $arr = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
}
//随机打乱数组
shuffle($arr);
//截取一段数组元素,0是表示从头开始取,正数从头开始取,负数从尾开始取
$subarr = array_slice($arr, 0, $len);
//implode()把数组元素组合为字符串并返回
return implode($subarr);
}
//调用函数
$code = rand_str();
?>
image.png
网友评论