Table des matières
回复讨论(解决方案)
Maison développement back-end tutoriel php PHP验证码图片显示不了

PHP验证码图片显示不了

Jun 23, 2016 pm 02:09 PM

PHP验证码图片显示不了,显示的是一个红色的叉叉。代码如下:



image.php

<?php	session_start();	if(isset($_POST['submit'])){		if(trim($_POST["test"])==$_SESSION['validationcode']){			echo '提交成功<br>';		}else{ 			echo '<font color="red">验证码输入错误!!</font><br>';		}	}?><html>	<head>		<title>Image</title>		<meta http-equiv="content-type" content="text/html;charset=gb2312">		<script>			function newgdcode(obj,url) {				//后面传递一个随机参数,否则在IE7和火狐下,不刷新图片				obj.src = url+ '?nowtime=' + new Date().getTime();			}		</script>	</head>	<body>		<img src="/static/imghw/default1.png"  data-src="imgcode.php"  class="lazy"   alt="看不清楚,换一张"   style="max-width:90%" onClick="javascript: newgdcode(this,this.src);" />		<form method="POST" action="image.php">			<input type="text" name="test"><br>			<input type="submit" name="submit" value="提交">		</form>	</body></html>
Copier après la connexion



imgcode.php
<?php	session_start();	require_once('ValidationCode.php');	$image = new ValidationCode(60,20,4);    	$image->showImage();	$_SESSION['validationcode'] =$image->getCheckCode(); ?>
Copier après la connexion



ValidationCode.php
<?php     /* 类ValidationCode声明在文件名为Validationcode.php中    */     /* 通过该类的对象可以动态获取验证码图片,和验证码字符串 */	class ValidationCode {		private $width;                               //验证码图片的宽度		private $height;                               //验证码图片的高度		private $codeNum;                            //验证码字符的个数		private $checkCode;                           //验证码字符		private $image;                               //验证码画布		/* 构造方法用来实例化验证码对象,并为一些成员属性初使化        */		/* 参数width: 设置验证码图片的宽度,默认宽度值为60像素        */		/* 参数height: 设置验证码图片的高度,默认高度值为20像素        */		/* 参数codeNum: 设置验证码中字母和数字的个数,默认个数为4个  */		function __construct($width=60, $height=20, $codeNum=4) {			$this->width=$width;                     //为成员属性width初使化			$this->height=$height;                     //为成员属性height初使化			$this->codeNum=$codeNum;               //为成员属性codeNum初使化			$this->checkCode=$this->createCheckCode();  //为成员属性checkCode初使化		}		function showImage(){                       //通过访问该方法向浏览器中输出图像			$this->getCreateImage();                 //调用内部方法创建画布并对其进行初使化			$this->outputText();                     //向图像中输出随机的字符串			$this->setDisturbColor();                 //向图像中设置一些干扰像素			$this->outputImage();                    //生成相应格式的图像并输出		}		function getCheckCode(){                     //访问该方法获取随机创建的验证码字符串			return $this->checkCode;                 //返回成员属性$checkCode保存的字符串		}		private function getCreateImage(){              //用来创建图像资源,并初使化背影			$this->image=imageCreate($this->width,$this->height);			$back=imageColorAllocate($this->image, 255, 255, 255);			$border=imageColorAllocate($this->image, 0, 0, 0);			imageRectangle($this->image,0,0,$this->width-1,$this->height-1,$border);		}		private function createCheckCode(){           //随机生成用户指定个数的字符串			for($i=0;$i<$this->codeNum;$i++) {				$number=rand(0,2);				switch($number){					case 0 : $rand_number=rand(48,57);break;    //数字					case 1 : $rand_number=rand(65,90);break;    //大写字母					case 2 : $rand_number=rand(97,122);break;   //小写字母				}				$ascii=sprintf("%c",$rand_number);				$ascii_number=$ascii_number.$ascii;			}				return $ascii_number;			}			private function setDisturbColor() {    //设置干扰像素,向图像中输出不同颜色的100个点			for ($i=0;$i<=100;$i++) {				$color = imagecolorallocate($this->image, rand(0,255), rand(0,255), rand(0,255));   				 imagesetpixel($this->image,rand(1,$this->width-2),rand(1,$this->height-2),$color);			}		}		private function outputText() {       //随机颜色、随机摆放、随机字符串向图像中输出			for ($i=0;$i<=$this->codeNum;$i++) {   				 $bg_color = imagecolorallocate($this->image, rand(0,255), rand(0,128), rand(0,255));   				 $x = floor($this->width/$this->codeNum)*$i+3;   				 $y = rand(0,$this->height-15);				 imagechar($this->image, 5, $x, $y, $this->checkCode[$i], $bg_color); 			  }		}		private function outputImage(){              //自动检测GD支持的图像类型,并输出图像			if(imagetypes() & IMG_GIF){          //判断生成GIF格式图像的函数是否存在				header("Content-type: image/gif");  //发送标头信息设置MIME类型为image/gif				imagegif($this->image);           //以GIF格式将图像输出到浏览器			}elseif(imagetypes() & IMG_JPG){      //判断生成JPG格式图像的函数是否存在				header("Content-type: image/jpeg"); //发送标头信息设置MIME类型为image/jpeg				imagejpeg($this->image, "", 0.5);   //以JPEN格式将图像输出到浏览器			}elseif(imagetypes() & IMG_PNG){     //判断生成PNG格式图像的函数是否存在				header("Content-type: image/png");  //发送标头信息设置MIME类型为image/png				imagepng($this->image);          //以PNG格式将图像输出到浏览器			}elseif(imagetypes() & IMG_WBMP){   //判断生成WBMP格式图像的函数是否存在				 header("Content-type: image/vnd.wap.wbmp");   //发送标头为image/wbmp				 imagewbmp($this->image);       //以WBMP格式将图像输出到浏览器			}else{                              //如果没有支持的图像类型				die("PHP不支持图像创建!");    //不输出图像,输出一错误消息,并退出程序			}			}		function __destruct(){                      //当对象结束之前销毁图像资源释放内存 			imagedestroy($this->image);            //调用GD库中的方法销毁图像资源		}	}?>
Copier après la connexion




回复讨论(解决方案)

哭,没有大虾帮小弟一下吗?

是因为class ValidationCode这个类的析构函数出了问题,
请把function __destruct()这个函数作这样的改写,就可以正常显示了。

        function __destruct(){                      //当对象结束之前销毁图像资源释放内存        	if($this->image)             imagedestroy($this->image);            //调用GD库中的方法销毁图像资源        }
Copier après la connexion

我这边写了个测试用例,请确保在运行之前你的服务器上安装了GD库,否则是无法正常显示的。

$a  = new ValidationCode();$a->showImage();
Copier après la connexion

还是不行,你说的测试代码放哪里?

经测试,你的代码没有问题,所有表现都正常

如果你的程序文件是保存成 utf-8 编码的,请检查是否有 BOM 头

已经改了,还是不行,还有,我把代码发给别人,别人可以看到验证码,为什么我的机子看不到。

<?phprequire_once('ValidationCode.php');$image = new ValidationCode(60,20,4);    $image->showImage();
Copier après la connexion

执行上述代码,看有什么结果

结果是只显示一个红色叉叉,就是HTML找不到图片那种样子。

很简单的问题,肯定是你本机上的环境是将报错提示全部打开的,因为你的代码有使用未定义变量的情况,如$ascii_number=$ascii_number.$ascii;这里,所以在输出时有系统的未定义提示信息也跟着一起输出了,这样生成的图片肯定就不正常了,方法有两,在ValidationCode.php开头加上ini_set('display_errors', 'Off');  或者就根据提示将那些未定义的变量全一个个初始化一下就OK了,

楼主我以前也用到过验证码使用不了的情况!
看了下,您的验证码貌似用session,如果是虚拟主机的话,请确认下,主机是否支持seesion!

完了,分数给错了,应该给9楼的。。。。

哎,看来我是捡了便宜,改天我把分再还给九楼好了!

太感谢九楼了,我也遇到同样的问题,现在解决了。。。。。

我也是啊,解决了
还得谢谢楼主,让学了不少知识阿

9楼乃神人也!
我的问题也解决了!!

经测试,你的代码没有问题,所有表现都正常

如果你的程序文件是保存成 utf-8 编码的,请检查是否有 BOM 头
多谢,我忙了一个小时在你这找到答案~

请问楼主你是怎样修改这个代码,究竟是什么出错了~~~

9楼解决问题了。

有人在吗?我按上面的代码执行,为什吗还是出现不了图片?

检查php.ini配置文件,是否开启了GD2,extension=php_gd2.dll,前面的;号去掉。

经测试,你的代码没有问题,所有表现都正常

如果你的程序文件是保存成 utf-8 编码的,请检查是否有 BOM 头


哎,用记事本编写代码的同志们,伤不起啊

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Mar 28, 2025 pm 05:12 PM

L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Mar 28, 2025 pm 05:11 PM

L'article traite des fonctionnalités de sécurité essentielles dans les cadres pour se protéger contre les vulnérabilités, notamment la validation des entrées, l'authentification et les mises à jour régulières.

See all articles