本文实例讲述了PHP实现的click captcha点击验证码类及其用法,是非常实用的功能。分享给大家供大家参考之用。具体如下:
一、需求:
现在常用的表单验证码大部分都是要用户输入为主,但这样对手机用户会不方便。 如果手机用户访问,可以不用输入,而是click某一位置便可确认验证码,这样就会方便很多。
二、原理:
1.使用PHP imagecreate创建PNG图象,在图中画N个圆弧,其中一个是完整的圆(验证用),将圆心坐标及半径记录入session。
3.将用户点击的坐标与session记录的圆心坐标、半径比较,判断是否在圆中,如是则验证通过。
程序运行效果如下图所示:
三、实现方法:
public $sess_name = 'm_captcha';
public $width = 500;
public $height = 200;
public $icon = 5;
public $iconColor = array(255,255,0);
public $backgroundColor = array(0,0);
public $iconSize = 56;
private $_img_res = null;
public function __construct($sess_name=''){
if(session_id() == ''){
session_start();
}
if($sess_name!=''){
$this->sess_name = $sess_name; // 设置session name
}
}
/* 创建验证码 /
public function create(){
// 创建图象
$this->_img_res = imagecreate($this->width,$this->height);
// 填充背景
ImageColorAllocate($this->_img_res,$this->backgroundColor[0],$this->backgroundColor[1],$this->backgroundColor[2]);
// 分配颜色
$col_ellipse = imagecolorallocate($this->_img_res,$this->iconColor[0],$this->iconColor[1],$this->iconColor[2]);
$minArea = $this->iconSize/2+3;
// 混淆用图象,不完整的圆
for($i=0; $i<$this->icon; $i++){
$x = mt_rand($minArea,$this->width-$minArea);
$y = mt_rand($minArea,$this->height-$minArea);
$s = mt_rand(0,360);
$e = $s + 330;
imagearc($this->_img_res,$x,$y,$this->iconSize,$s,$e,$col_ellipse);
}
// 验证用图象,完整的圆
$x = mt_rand($minArea,$this->width-$minArea);
$y = mt_rand($minArea,$this->height-$minArea);
$r = $this->iconSize/2;
imagearc($this->_img_res,360,$col_ellipse);
// 记录圆心坐标及半径
$this->captcha_session($this->sess_name,array($x,$r));
// <a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a>图象
Header("Content-type: image/PNG");
ImagePNG($this->_img_res);
ImageDestroy($this->_img_res);
exit();
}
/** 检查验证码
-
@param String $captcha 验证码
-
@param int $flag 验证成功后 0:不清除session 1:清除session
-
@return boolean
*/
public function check($captcha,$flag=1){
if(trim($captcha)==''){
return false;
}if(!is_array($this->captcha_session($this->sess_name))){
return false;
}list($px,$py) = explode(',',$captcha);
list($cx,$cy,$cr) = $this->captcha_session($this->sess_name);if(isset($px) && is_numeric($px) && isset($py) && is_numeric($py) &&
isset($cx) && is_numeric($cx) && isset($cy) && is_numeric($cy) && isset($cr) && is_numeric($cr)){
if($this->pointInArea($px,$py,$cx,$cr)){
if($flag==1){
$this->captcha_session($this->sess_name,'');
}
return true;
}
}
return false;
}
/** 判断点是否在圆中
- @param int $px 点x
- @param int $py 点y
- @param int $cx 圆心x
- @param int $cy 圆心y
- @param int $cr 圆半径
- sqrt(x^2+y^2)<r
/
private function pointInArea($px,$cr){
$x = $cx-$px;
$y = $cy-$py;
return round(sqrt($x$x + $y*$y))<$cr;
}
/** 验证码session处理方法
- @param String $name captcha session name
- @param String $value
- @return String
*/
private function captcha_session($name,$value=null){
if(isset($value)){
if($value!==''){
$_SESSION[$name] = $value;
}else{
unset($_SESSION[$name]);
}
}else{
return isset($_SESSION[$name])? $_SESSION[$name] : '';
}
}
} // class end
?>
demo.PHP示例程序如下:
$obj = new ClickCaptcha();
$obj->create();
exit();
}
if(isset($_POST['send']) && $_POST['send']=='true'){ // submit
$name = isset($_POST['name'])? trim($_POST['name']) : '';
$captcha = isset($_POST['captcha'])? trim($_POST['captcha']) : '';
$obj = new ClickCaptcha();
if($obj->check($captcha)){
echo 'your name is:'.$name;
}else{
echo 'captcha not match';
}
echo ' <a href="demo.php">back';
}else{ // html
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
本文完整源码点击此处。
希望本文所述对大家的PHP程序设计有所帮助。