php登录验证码-php实现验证码功能

2023-08-26 0 2,643 百度已收录

验证码之类的功能可以说是无处不在php登录验证,然后利用php来实现验证码之类的功能。 这里我把验证码实现提取到一个类中,单独出来,所以如果再次使用验证码功能,直接导入这个类文件并创建这个类的实例,就可以使用验证码了,代码如下:

验证码类文件vcode.class.php

<?php
/**
  *验证码类
  */
  class Vcode{
	private $width;//图片宽度
	private $height;//图片高度
	private $num;//验证码个数
	private $img;//图片资源
	private $code;//验证码
	private $pointNum;//干扰点个数
	private $lineNum;//干扰线个数
	private $fontFile;//字体文件
	
	//构造函数初始化相关数据
	function __construct($width=85,$height=34,$num=4){
		$this->width=$width;
		$this->height=$height;
		$this->num=$num;
		$this->code=$this->createCode();
		$this->pointNum=100;
		$this->lineNum=10;
		$this->fontFile="STLITI.TTF";
	}
	
	/**
	  *用于设置成员属性
	  *@param string $key 成员属性名
	  *@param mixed $value 成员属性值
	  *@return object 返回自己对象$this,可用于连贯操作
	  */
	public function set($key,$val){
		//get_class_vars() 获取类中的属性组成的数组
		//get_class() 返回对象的类名
		if(array_key_exists($key,get_class_vars(get_class($this)))){
			$this->setOption($key,$val);
		}
		return $this;
	}
	//设置参数
	private function setOption($key,$value){
		$this->$key=$value;
	}
	
	//获取验证码
	public function getCode(){
		return $this->code;
	}
	
	//输出图像
	public function outImg(){
		//创建图像
		$this->createImage();
		//画验证码
		$this->drawCode();
		//画干扰元素
		$this->drawDisturbColor();
		//输出图像
		$this->printImg();
	}
	
	//画验证码
	private function drawCode(){
		$this->fontFile="./font/".$this->fontFile;
		for($i=0;$inum;$i++){
			//设置随机颜色
			$randColor=imagecolorallocate($this->img,rand(0,128),rand(0,128),rand(0,128));
			//字体大小
			$fontSize=rand(20,23);
			//字体水平位置
			$x=($this->width/$this->num)*$i;
			//水平方向的位置
			$y=rand($fontSize,imagefontheight($fontSize)+3);
			//画字体
			imagettftext($this->img,$fontSize,0,$x,$y,$randColor,$this->fontFile,$this->code{$i});
		}
	}
	//画干扰元素
	private function drawDisturbColor(){
		//画干扰点
		for($i=0;$ipointNum;$i++){
			//设置随机颜色
			$randColor=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
			//画点
			imagesetpixel($this->img,rand(1,$this->width-2),rand(1,$this->height-2),$randColor);
		}
		
		//画干扰线
		for($i=0;$ilineNum;$i++){
			//设置随机颜色
			$randColor=imagecolorallocate($this->img,rand(0,200),rand(0,200),rand(0,200));
			//画线
			imageline($this->img,rand(1,$this->width-2),rand(1,$this->height-2),rand(1,$this->height-2),rand(1,$this->width-2),$randColor);
		}
	}
	
	//创建图像
	private function createImage(){
		//创建一个真彩色图像
		$this->img=imagecreatetruecolor($this->width,$this->height);
		//设置背景色
		$bgColor=imagecolorallocate($this->img,rand(200,255),rand(200,255),rand(200,255));
		//填充背景色
		imagefill($this->img,0,0,$bgColor);
		//设置边框颜色
		$borderColor=imagecolorallocate($this->img,0,0,0);
		//画一个边框
		imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$borderColor);
	}
	
	//输出图像
	private function printImg(){
		if(imagetypes() & IMG_PNG){
			//针对png
			header("Content-Type:image/png");
			imagepng($this->img);
		}else if(imagetypes() & IMG_JPG){
			//针对jpg
			header("Content-Type:image/jpeg");
			imagejpeg($this->img,null,100);
		}else if(imagetypes() & IMG_GIF){
			//针对Gif
			header("Content-Type:image/gif");
			imagegif($this->img);
		}else if(imagetypes() & IMG_WBMP){
			// 针对 WBMP
			header('Content-Type: image/vnd.wap.wbmp');
			imagewbmp($this->img);
		}else{
			die('No image support in this PHP server');
		}
	}
	
	//创建验证码
	private function createCode(){
		//默认字符串
		$codes="123456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY";
		//生成验证码
		$code="";
		for($i=0;$inum;$i++){
			$code.=$codes{rand(0,strlen($codes)-1)};
		}
		return $code;
	}
	
	//析构函数用于销毁图像资源
	function __destruct(){
		imagedestroy($this->img);
	}
  }

这里我用来绘制字体的函数是imagettftext(),因为这个函数可以自定义字体样式,而且从代码中可以看出,输入参数有一个字体文件属性。 如果不喜欢用这个函数php登录验证码,可以用imagestring()函数也可以,但是我个人认为这个函数默认的字体大小不太好看。 或者自定义字体看起来更舒服。下一步就是调用验证码类

getCode();
	//$vcode->set("pointNum",10);//自定义干扰点个数
	//$vcode->set("lineNum",10);//自定义干扰线个数
	//$vcode->set("fontFile","wawa.ttf");//自定义字体文件
	//输出图像
	$vcode->outImg();

这里就实现了验证码,直接调用文件也可以看到验证码。 下面使用一个简单的登录表单来使用验证码

<?php
	//开启Session
	session_start();
	//判断是否提交
	if(isset($_POST['dosubmit'])){
		//获取session中的验证码并转为小写
		$sessionCode=strtolower($_SESSION['code']);
		//获取输入的验证码
		$code=strtolower($_POST['code']);
		//判断是否相等
		if($sessionCode==$code){
			echo "alert('验证码正确!');";
		}else{
			echo "alert('验证码错误!');";
		}
	}
?>


	
		
		
		
			*{margin:0px;padding:0px;}
			ul{
				width:400px;
				list-style:none;
				margin:50px auto;
			}
			
			li{
				padding:12px;
				position:relative;
			}
			
			label{
				width:80px;
				display:inline-block;
				float:left;
				line-height:30px;
			}
			
			input[type='text'],input[type='password']{
				height:30px;
			}
			
			img{
				margin-left:10px;
			}
			
			input[type="submit"]{
				margin-left:80px;
				padding:5px 10px;
			}
		
	
	
		
			

取得的疗效:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php登录验证码-php实现验证码功能 https://www.wkzy.net/game/157035.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务