Anforderungen:
Die meisten h?ufig verwendeten Formularbest?tigungscodes erfordern jetzt eine Benutzereingabe, was jedoch für mobile Benutzer unpraktisch ist.
Wenn mobile Benutzer vorbeikommen, müssen sie diesen nicht eingeben. Stattdessen k?nnen sie auf eine bestimmte Stelle klicken, um den Best?tigungscode zu best?tigen, was viel praktischer ist.
Prinzip:
1. Verwenden Sie PHP imagecreate, um ein PNG-Bild zu erstellen und N B?gen in das Bild zu zeichnen. Einer davon ist ein vollst?ndiger Kreis (zur überprüfung), und die Mittelpunktkoordinaten und der Radius werden in der Sitzung aufgezeichnet.
2. Wenn der Benutzer im Browser auf das Best?tigungscodebild klickt, notieren Sie die Klickposition.
3. Vergleichen Sie die vom Benutzer angeklickten Koordinaten mit den in der Sitzung aufgezeichneten Mittelpunktskoordinaten und dem Radius, um festzustellen, ob sie im Kreis liegen. Wenn ja, ist die überprüfung bestanden.

ClickCaptcha.class.php
<?php
/** Click Captcha 驗證碼類
* Date: 2013-05-04
* Author: fdipzone
* Ver: 1.0
*/
class ClickCaptcha { // class start
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, 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
}
}
/** 創(chuàng)建驗證碼 */
public function create(){
// 創(chuàng)建圖象
$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, $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, $x, $y, $this->iconSize, $this->iconSize, 0, 360, $col_ellipse);
// 記錄圓心坐標及半徑
$this->captcha_session($this->sess_name, array($x, $y, $r));
// 生成圖象
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,$cy,$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, $py, $cx, $cy, $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
<?php
session_start();
require('ClickCaptcha.class.php');
if(isset($_GET['get_captcha'])){ // get captcha
$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</a>';
}else{ // html
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title> Click Captcha Demo </title>
<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
<script type="text/javascript">
$(function(){
$('#captcha_img').click(function(e){
var x = e.pageX - $(this).offset().left;
var y = e.pageY - $(this).offset().top;
$('#captcha').val(x+','+y);
})
$('#btn').click(function(e){
if($.trim($('#name').val())==''){
alert('Please input name!');
return false;
}
if($.trim($('#captcha').val())==''){
alert('Please click captcha!');
return false;
}
$('#form1')[0].submit();
})
})
</script>
</head>
<body>
<form name="form1" id="form1" method="post" action="demo.php" onsubmit="return false">
<p>name:<input type="text" name="name" id="name"></p>
<p>Captcha:Please click full circle<br><img id="captcha_img" src="demo.php?get_captcha=1&t=<?=time() ?>" style="cursor:pointer"></p>
<p><input type="submit" id="btn" value="submit"></p>
<input type="hidden" name="send" value="true">
<input type="hidden" name="captcha" id="captcha">
</form>
</body>
</html>
<?php } ?>
In diesem Artikel wird die Einführung der PHP-Klick-Captcha-Verifizierungscode-Klasse erl?utert. Weitere verwandte Inhalte finden Sie unter PHP-Chinesisch Website.
Verwandte Empfehlungen:
Einführung in die HTML5-Verlaufs-API
über Bubbling, Dichotomie-Einfügung, Schnellsortierungsalgorithmus Einführung
Erkl?rt den zugeh?rigen Inhalt der PHP-Datei-Download-Klasse, die die übertragung von Haltepunkt-Lebensl?ufen unterstützt
Das obige ist der detaillierte Inhalt vonEinführung in die Klasse des PHP-Click-Captcha-Best?tigungscodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!