PHP 验证码类——封装验证码生成方法,ValidateCode验证码类封装了一个图像验证码的生成方法,用户在需要使用验证码的地方直接调用这个类即可完成验证码的生成操作。
PHP 验证码类 语法
/*********************************************
* @ 说明:验证码类
*********************************************/
class ValidateCode{
//宽度
private _width;
//长度
private_height;
//验证码
private _codeStr;
//字体类型 0-粗体 1-细黑体
private_fontType;
//图像句柄
private _img;
/**
* 构造方法
*
* @param stringwidth
* @param string height
* @param stringcodeStr
* @param int fontType
*/
public function _construct (width, height,codeStr = '0000', fontType = 0){this->_width = width;this->_height = height;this->_codeStr = substr(codeStr, 0, 4);this->_fontType = fontType;
}
/**
* 获取颜色
*
* @param 颜色范围最小值x
* @param 颜色范围最大值 y
* @return imagecolorallocate()
*/
private function _getColor (x, y) {r = mt_rand(x,y);
g = mt_rand(x, y);b = mt_rand(x,y);
return imagecolorallocate(this->_img,r, g,b);
}
/**
* 初始图像
*
*/
private function _init (){
this->_img = imagecreate(this->_width, this->_height);
}
/**
* 创建验证码
*
*/
private function _build () {
imagefill(this->_img, 0, 0, this->_getColor(150, 250));
imagerectangle(this->_img, 0, 0, this->_width - 1,this->_height - 1,
this->_getColor(50, 150));
if (this->_fontType == 0) {
fontFileName = 'ARIALBI.TTF';
} else {fontFileName = 'ARIALN.TTF';
}
for (i = 0;i < strlen(this->_codeStr);i ++) {
imagettftext(this->_img, mt_rand(12, 24), 0, (this->_width) / 4 * i,
mt_rand(20,this->_height - 5), this->_getColor(10, 180), 'font/'.fontFileName, substr(this->_codeStr,i, 1));
}
for (i = 0;i < 15; i ++) {
imageline(this->_img, mt_rand(0, this->_width), mt_rand(0,this->_height),
mt_rand(0, this->_width), mt_rand(0,this->_height), this->_getColor
(110, 210));
}
}
/**
* 显示图像
*
*/
public function show (){
header('content-type:image/png');this->_init();
this->_build();
imagepng(this->_img);
}
}
PHP 验证码类 示例
本实例中编写一个用户登录功能,调用验证码类生成验证码,通过jQuery在客户端完成对用户登录信息的验证。
(1)封装ValidateCode验证码类,存储于ValidateCode.php文件中。
(2)创建index.php文件,设计用户登录界面,添加用户登录的表单元素。
(3)创建yzm.php文件,生成验证码,并且在index.php文件中以图像形式输出。
其关键代码如下:
<?php
session_start(); //初始化SESSION 变量
include("ValidateCode.php"); //载入验证码生成类
codeStr = ""; //定义验证码变量codeArray = array('0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' ,
'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' ,
'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z');
for (i = 0;i < 4; i ++) {codeStr .= codeArray[mt_rand(0, 35)]; //生成随机验证码数据
}_SESSION['Vcode']=codeStr; //将验证码数据赋给SESSION 变量validateCode = new ValidateCode(80, 30, codeStr, 0); //实例化验证码类validateCode->show(); //生成验证码
?>
(4)创建JavaScript脚本,编写changeVcode()方法,实现验证码的切换。其代码如下:
function changeVcode(){
$("#vcodeImg").attr("src", "yzm.php?rand="+Math.random()+"')");
}
(5)编写JavaScript脚本,通过jQuery技术完成对表单中提交数据的验证。其中要特别注意调用的check_code.php文件,在该文件中对用户提交的验证码进行验证。JavaScript脚本的代码如下:
//表单验证
function chkInputLogin(flag){
.get("check_code.php?vcode="+encodeURI(("#vcode").val()), null, function
(chkVcodeReturnData){
var k1=false;
var k2=false;
var k3=false;
//用户昵称
if(flag == 1 || flag == -1){
if(.trim(("#netname").val())==""){
("#chkNetname").html(" 请输入登录昵称");("#netname").css("border", "1px solid #FF0000");
("#chkNetname").css("display", "block");
}else{("#chkNetname").html("");
("#netname").css("border", "1px solid #777777");("#chkNetname").css("display", "none");
k1=true;
}
}
//登录密码
if(flag == 2 || flag == -1){
if(.trim(("#password").val())==""){
("#chkPassword").html(" 请输入登录密码");("#password").css("border", "1px solid #FF0000");
("#chkPassword").css("display", "block");
}else{("#chkPassword").html("");
("#password").css("border", "1px solid #777777");("#chkPassword").css("display", "none");
k2=true;
}
}
//验证码
if(flag == 3 || flag == -1){
if(.trim(("#vcode").val())==""){
("#chkVcode").html(" 请输入验证码");("#vcode").css("border", "1px solid #FF0000");
("#chkVcode").css("display", "block");
}else if(chkVcodeReturnData == "N"){("#chkVcode").html(" 验证码输入有误");
("#vcode").css("border", "1px solid #FF0000");("#chkVcode").css("display", "block");
}else{
("#chkVcode").html("");("#vcode").css("border", "1px solid #777777");
("#chkVcode").css("display", "none");
k3=true;
}
}
//提交表单
if(flag == -1 && k1 && k2 && k3 ){("#form_login").submit();
}
});
}