php验证码类 session问题

WBOY
发布: 2016-06-23 14:23:24
原创
870 人浏览过

<?php	/*	 *类名:验证码类	 *功能:通过该类的对象可以获取验证码图片,和验证码字符集($_SESSION['vericode'])	 *作者:小A、	 *时间:2012-7-3	 */	final class VeriCode	{		private $width;	//验证码宽度		private $height;//验证码高度		private $codenum;//验证码个数		private $image;		private $randttf = false;//是否开启随机字体 true 为开启,默认关闭提供 4 种字体在 ttfs目录中		private $randcolor = true;//是否随机字体颜色 flase 为关闭 默认开启		private $bg = true;//背景底纹		function __construct($widht=60,$height=30,$codenum=4)		{			$this->widht = $widht;			$this->height = $height;			$this->codenum = $codenum;		}		function showcode()		{			$this->createcode();//创建画布			$this->createstring();//创建字符串			$this->createimage();//生成图像		}		private function createcode()//创建画布		{				$this->image = imagecreate($this->widht,$this->height);				$backcolor = imagecolorallocate($this->image,255,255,255);//如需改变背景色请设置这里的RGB				imagefill($this->image,0,0,$backcolor);				if($this->bg == true)				{					$bg = imagecolorallocate($this->image,221,221,221);					for($i = 0; $i < $this->widht / 2;$i++)//画竖线底纹					{						imageline($this->image,$i*2,0,$i*2,$this->height,$bg);					}					for($i = 0;$i < $this->height / 3;$i++)//画横向底纹					{						imageline($this->image,0,$i*3,$this->widht,$i*3,$bg);					}				}					}		private function createstring()//在画布写入字符串		{			$string = $this->codestring();			session_start();			$_SESSION["vericode"] = $string;			for($i = 0;$i < $this->codenum;$i++)			{				if($this->randttf == true)				{					$ttf = 'ttfs/t'.rand(1,9).'.ttf';//随机字体 请保证 ttfs文件夹 在同一目录里中,如改变路径请改变此路径				}else				{					$ttf = 'ttfs/t1.ttf';//9中字体请自己常识,只需要修改t4中数字 1 - 9看看到每种字体的效果,选择自己喜欢的 注:请关掉随机字体测试				}				$fontsize = rand(14,15);//产生随机字体大小				$fontangle = rand(-10,10);//字符倾斜角度  随即倾斜				$x = $i*12+4; 				$y =rand($fontsize,$this->height-8);				if($this->randcolor == true)				{					$textcolor = imagecolorallocate($this->image,rand(0,180),rand(0,180),rand(0,180));				}else				{					$textcolor = imagecolorallocate($this->image,0,0,0);				}				imagettftext($this->image,$fontsize,$fontangle,$x,$y,$textcolor,$ttf,$string[$i]);					}		}		private function codestring()//生成随机字符串		{			$string = '';			for($i=0;$i < $this->codenum;$i++)			{				$num = rand(1,1);				/*				 *	如果想是单一的格式,请参考:				 *				 *	只要需要数字				 *				 *		把上边的 $num = rand(1,3) 改成 $num = rand(2,2)				 *						 *	只需要小写字母				 *				 *		把上边的 $num = rand(1,3) 改成 $num = rand(3,3)				 *				 *	只需要大写字母				 *				 *		把上边的 $num = rand(1,3) 改成 $num = rand(1,1)				 *				 *	只需要 小写字母 和 数字				 *				 *		把上边的 $num = rand(1,3) 改成 $num = rand(3,2)				 *				 */				switch($num)				{					case 1:						$num2 = rand(65,90);	//随机产生小写字母 a - z 所对应的ASCII码的值						break;					case 2:						$num2 = rand(51,57);	//随机产生数字 2 9 所对应的ASCII码的值 如果是rand(48,57):0-9将有0 这样不利于用户判断						break;					case 3:						$num2 = rand(97,122);	//随机产生大写字母 A - Z 所对应的ASCII码的值						break;				}				/*				 *为用用户着想去除了 0 o I i 1 z Z 2				 *				 */				if($num2 == 111 || $num == 105 || $num == 122 || $num2 == 79 || $num2 == 73 || $num == 90)//如果是大写字母中的O,I用P代替				{					$num2 = 112;				}				$tmp = sprintf("%c",$num2);	//用sprintf函数来得到产生ASCII码所对应的字符				$string .=$tmp;			}			return $string;		}		private function createimage()//生成图像		{			if(function_exists("imagegif"))			{				header("Content-type:image/gif");				imagegif($this->image);			}elseif(function_exists("imagejpeg"))			{				header("Content-type:image/jpeg");				imagejpeg($this->image,"",50);//50为图像的品质,0-100 0质量最差,图像文件越小 100质量最好,图像文件越大			}elseif(function_exists("imagepng"))			{				header("Content-type:image/png");				imagepng($this->image);			}elseif(function_exists("imagewbmp"))			{				header("Content-type:image/vnd.wap.wbmp");				imagewbmp($this->image);			}else			{				die('服务器不支持图像,请检查GD库');			}		}		function __destruct()		{			imagedestroy($this->image);				}	}?>
登录后复制

上边的是验证码类

下边是用来测试页面

<?php	session_start();	function __autoload($filename)	{			require  $filename.'.class.php';	}	$code = new VeriCode;	$code->showcode();		if(strtoupper($_GET["code"]) != $_SESSION["vericode"] )	{		echo  '验证码输入错误';	}else	{		echo '验证码正确';	}?>
登录后复制

我在类中已经讲 验证码字符串赋值给了 $_SESSION['vericode'] 但是我在页面测试的时候获取不到 打印session数组也无结果   求解  


回复讨论(解决方案)

太长了, 没看. 

请问, 表单页面和验证码页面是否处于不同二级域名下?

你下面那段测试代码的逻辑有问题

PHP code


    /*
     *类名:验证码类
     *功能:通过该类的对象可以获取验证码图片,和验证码字符集($_SESSION['vericode'])
     *作者:小A、
     *时间:2012-7-3
     */
    final class VeriCode
    {
        private $width;……

没有二级域名,  我大概说下,我是在  验证码类中直接赋值给$_SESSION的,但是在其他页面的我得不到我在类里边赋值的SESSION

太长了, 没看. 

请问, 表单页面和验证码页面是否处于不同二级域名下?
没有二级域名, 我大概说下,我是在 验证码类中直接赋值给$_SESSION的,但是在其他页面的我得不到我在类里边赋值的SESSION

其他页面 session_start(); 了吗?

没初始化类的缘故吧
function __construct($widht=60,$height=30,$codenum=4)

 session_start();

php简单验证码类(字母+数字)
http://3aj.cn/php/27.html

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板