ValidateCode.class.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
<?php /**
* 验证码类
* @author staven
*
*/
class ValidateCode{
private $width; //验证码图片的宽度
private $height; //验证码图片的高度
private $checkCode; //验证码字符
private $codeNum; //验证码字符个数
private $font; //字体
private $fontSize; //字体大小
private $fontColor; //字体颜色
private $image; //验证码句柄
private $charset; //验证字符随机因子
//构造器方法初始化
function __construct($width=100, $height=20, $codeNum=4,$fontSize = 12){
$this->width = $width;
$this->height = $height;
$this->codeNum = $codeNum;
$this->fontSize = $fontSize;
$this->font = dirname(__FILE__) . '/font/elephant.ttf';
$this->charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; //提供随机因子
$this->checkCode = $this->createCheckCode();
}
/* 用于输出验证码图片,并且将验证码信息写入session */
function __toString(){
/* 加到session中, 存储下标为code */
$_SESSION["code"] = strtoupper($this->checkCode);
$this->outImage();
return '';
}
/* 生成随机验证码字符 */
private function createCheckCode(){
for ($i=0; $i<$this->codeNum; $i++){
$this->checkCode .= $this->charset{mt_rand(0,strlen($this->charset)-1)};
}
return $this->checkCode;
}
/* 输出验证码 */
private function outImage(){
$this->getCreateImage();
$this->createLine();
$this->outputText();
$this->outputImage();
}
/* 生成验证码背景图片 */
private function getCreateImage(){
$this->image = imagecreatetruecolor($this->width,$this->height);
$color = imagecolorallocate($this->image, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
imagefilledrectangle($this->image,0,$this->height,$this->width,0,$color);
}
/* 向句柄图片中写入文字信息 */
private function outputText(){
$_x = $this->width / $this->codeNum;
for ($i=0;$i<$this->codeNum;$i++) {
$this->fontcolor = imagecolorallocate($this->image,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imagettftext($this->image,$this->fontSize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontColor,$this->font,$this->checkCode[$i]);
}
}
/* 创建雪花图案 */
private function createLine() {
for ($i=0;$i<6;$i++) {
$color = imagecolorallocate($this->image,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imageline($this->image,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
}
for ($i=0;$i<100;$i++) {
$color = imagecolorallocate($this->image,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($this->image,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
}
}
/* 生成验证码图片 */
private function outputImage(){
header('Content-type:image/png');
imagepng($this->image);
}
/* 销毁句柄,释放资源 */
function __destruct() {
imagedestroy($this->image);
}
}
|
imageCode.php
|
1
2
3
4
|
<?php session_start(); //开启SESSION
require_once 'ValidateCode.class.php';
echo new ValidateCode();
|
image.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<!DOCTYPE html><html><head> <meta charset="gbk">
<title>验证码</title>
</head><body> <img src="imagecode.php" alt="看不清楚,换一张" style="cursor: pointer;" onclick="this.src='imagecode.php?'+new Date().getTime();" />
<form method="POST" action="image.php">
<input type="text" size="4" name="code" />
<input type="submit" name="submit" value="提交">
</form>
</body></html><?php /** 用于 */
session_start(); //开启SESSION
if(isset($_POST['submit'])){ //判断用户提交后执行
/* 判断用户在表单中输入的字符串和验证码图片中的字符串是否相同 */
if(strtoupper(trim($_POST["code"])) == $_SESSION['code']){ //如果验证码输出成功
echo '验证码输入成功<br>'; //输出成功的提示信息
}else{ //如果验证码输入失败
echo '<font color="red">验证码输入错误!!</font><br>'; //输出失败的输入信息
}
}
?> |