目錄
回复讨论(解决方案)
首頁 後端開發 php教程 一个超难的问题,关于验证码不显示

一个超难的问题,关于验证码不显示

Jun 23, 2016 pm 01:44 PM

一般验证码不显示有下面几种情况
1、GD库没有开启,2、用记事本打开文件了,结果有BOM头
3、 的前面有空格了
但是我的验证码不显示和上述三种都没有关系,因为我检查了

但还是不显示,前提是我的这个验证码类写是没有问题,实例化也没有问题
但还是不显示,这到底为啥呢,想破头都没有想出来

我这个验证码加载的是一个字库elephant.ttf文件,是不是他的问题呢,如果是怎么解决呢


回复讨论(解决方案)

那就是你验证码文件引入路径错了

那就是你验证码文件引入路径错了


路么没错啊,我是这样引入的
//网站根目录define('ROOT_PATH',dirname(__FILE__));public function __construct() {			$this->font = ROOT_PATH.'/font/elephant.ttf';		}
登入後複製

或者说这个ttf文件不支持win8系统吗,因我的本地环境是win8 64位的

算了,把这个验证码类发上来吧

<?php	//验证码类	class ValidateCode {		private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';	//随机因子		private $code;							//验证码		private $codelen = 4;					//验证码长度		private $width = 130;					//宽度		private $height = 50;					//高度		private $img;								//图形资源句柄		private $font;								//指定的字体		private $fontsize = 20;				//指定字体大小		private $fontcolor;						//指定字体颜色				//构造方法初始化		public function __construct() {			$this->font = ROOT_PATH.'/font/elephant.ttf';		}				//生成随机码		private function createCode() {			$_len = strlen($this->charset)-1;			for ($i=0;$i<$this->codelen;$i++) {				$this->code .= $this->charset[mt_rand(0,$_len)];			}		}				//生成背景		private function createBg() {			$this->img = imagecreatetruecolor($this->width, $this->height);			$color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));			imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);		}				//生成文字		private function createFont() {				$_x = $this->width / $this->codelen;			for ($i=0;$i<$this->codelen;$i++) {				$this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));				imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);			}		}				//生成线条、雪花		private function createLine() {			for ($i=0;$i<6;$i++) {				$color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));				imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);			}			for ($i=0;$i<100;$i++) {				$color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));				imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);			}		}				//输出		private function outPut() {			header('Content-type:image/png');			imagepng($this->img);			imagedestroy($this->img);		}				//对外生成		public function doimg() {			$this->createBg();			$this->createCode();			$this->createLine();			$this->createFont();			$this->outPut();		}				//获取验证码		public function getCode() {			return strtolower($this->code);		}			}	?>
登入後複製

这一问题有几种可能
第一,这个字体文件有问题,即兼容性上的问题,因为我的系统是win8 64位的,我确定是否字体对于操作系统也有兼容性这一说;
第二,路径问题,但是即上面所罗列的设置,应该没有问题吧,常规的写法都是这么写啊。
至于啥GD库开启啥的,这些,都排除了,还有啥BOM头的,也排除了,那是啥原因呢

看这是我的本地环境中的GD库开启,我说的对吧

难道说还是引入 验证码这个文件的路径出错了吗?


字体 elephant 的文件名为 elephnt.ttf 斜体的是 elephnti.ttf 请认真核实
判断是否是字体文件造成的,可以用浏览器直接运行验证码程序


字体 elephant 的文件名为 elephnt.ttf 斜体的是 elephnti.ttf 请认真核实
判断是否是字体文件造成的,可以用浏览器直接运行验证码程序

不是它的原因,再说了,字体的文件名可以任意命名,只要真实的文件名和写在php页面中的文件中一致就可,排除这种可能了。

如果能排除字体文件的原因,那么程序没有问题
我回复中的截图就是你的程序产生的


字体 elephant 的文件名为 elephnt.ttf 斜体的是 elephnti.ttf 请认真核实
判断是否是字体文件造成的,可以用浏览器直接运行验证码程序


运行http://127.0.0.1/config/code.php验证码文件时,页面中啥也不显示,空白一遍。也许你看到这里,嘴里会脱口而出,那肯定验证码有问题,没错!要是没问题,我也不发帖问了。

单独运行的时候,ROOT_PATH 是没有定义的!你得定义一下

单独运行的时候,ROOT_PATH 是没有定义的!你得定义一下


定义了,因为引入定义ROOT_PATH字的系统常量文件了。

但是在你贴出的程序里是看不到这一点的

另外你可打开 php 的错误显示功能,看看是否有错误信息出现
单独运行验证码程序时,如果出现错误且错误显示功能未打开,则会出现空白页(这实际是500错的表现)
如果出现一个叉,则表示程序有非致命错误,此时应注释掉 header 函数。根据夹杂在乱码中的错误信息排错

但是在你贴出的程序里是看不到这一点的

另外你可打开 php 的错误显示功能,看看是否有错误信息出现
单独运行验证码程序时,如果出现错误且错误显示功能未打开,则会出现空白页(这实际是500错的表现)
如果出现一个叉,则表示程序有非致命错误,此时应注释掉 header 函数。根据夹杂在乱码中的错误信息排错




干脆我把源码发上,你自己看能显示吗,文件不大http://115.com/lb/5lbdn1thp19o

看得到,下不下了
你换个网盘看看

看得到,下不下了
你换个网盘看看


本来想传到百度云了,没想到百度云网盘出问题了,这一扫黄,百度云一直不好用了。把正常人使用的环境也破坏了
传到360网盘中了
http://yunpan.cn/cAkyJ6ddksXJJ (提取码:a62a)

很正常。

define('ROOT_PATH', dirname(__FILE__));//验证码类    class ValidateCode {        private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';    //随机因子        private $code;                            //验证码        private $codelen = 4;                    //验证码长度        private $width = 130;                    //宽度        private $height = 50;                    //高度        private $img;                                //图形资源句柄        private $font;                                //指定的字体        private $fontsize = 20;                //指定字体大小        private $fontcolor;                        //指定字体颜色                 //构造方法初始化        public function __construct() {            $this->font = ROOT_PATH.'/font/elephant.ttf';        }                 //生成随机码        private function createCode() {            $_len = strlen($this->charset)-1;            for ($i=0;$i<$this->codelen;$i++) {                $this->code .= $this->charset[mt_rand(0,$_len)];            }        }                 //生成背景        private function createBg() {            $this->img = imagecreatetruecolor($this->width, $this->height);            $color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));            imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);        }                 //生成文字        private function createFont() {               $_x = $this->width / $this->codelen;            for ($i=0;$i<$this->codelen;$i++) {                $this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));                imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);            }        }                 //生成线条、雪花        private function createLine() {            for ($i=0;$i<6;$i++) {                $color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));                imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);            }            for ($i=0;$i<100;$i++) {                $color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));                imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);            }        }                 //输出        private function outPut() {            header('Content-type:image/png');            imagepng($this->img);            imagedestroy($this->img);        }                 //对外生成        public function doimg() {            $this->createBg();            $this->createCode();            $this->createLine();            $this->createFont();            $this->outPut();        }                 //获取验证码        public function getCode() {            return strtolower($this->code);        }             }$obj = new ValidateCode();$obj->doimg();
登入後複製
登入後複製




如果出现空白,可以看看apache error log,看看有什么错误提示。

如果是elephant.ttf文件问题,可以下载一个新的elephant.ttf文件试试。
我测试的是用 http://www.font5.com.cn/font_download.php?id=8944&part=1279954173这个的,可以换这个试试。

很正常。

define('ROOT_PATH', dirname(__FILE__));//验证码类    class ValidateCode {        private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';    //随机因子        private $code;                            //验证码        private $codelen = 4;                    //验证码长度        private $width = 130;                    //宽度        private $height = 50;                    //高度        private $img;                                //图形资源句柄        private $font;                                //指定的字体        private $fontsize = 20;                //指定字体大小        private $fontcolor;                        //指定字体颜色                 //构造方法初始化        public function __construct() {            $this->font = ROOT_PATH.'/font/elephant.ttf';        }                 //生成随机码        private function createCode() {            $_len = strlen($this->charset)-1;            for ($i=0;$i<$this->codelen;$i++) {                $this->code .= $this->charset[mt_rand(0,$_len)];            }        }                 //生成背景        private function createBg() {            $this->img = imagecreatetruecolor($this->width, $this->height);            $color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));            imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);        }                 //生成文字        private function createFont() {               $_x = $this->width / $this->codelen;            for ($i=0;$i<$this->codelen;$i++) {                $this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));                imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);            }        }                 //生成线条、雪花        private function createLine() {            for ($i=0;$i<6;$i++) {                $color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));                imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);            }            for ($i=0;$i<100;$i++) {                $color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));                imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);            }        }                 //输出        private function outPut() {            header('Content-type:image/png');            imagepng($this->img);            imagedestroy($this->img);        }                 //对外生成        public function doimg() {            $this->createBg();            $this->createCode();            $this->createLine();            $this->createFont();            $this->outPut();        }                 //获取验证码        public function getCode() {            return strtolower($this->code);        }             }$obj = new ValidateCode();$obj->doimg();
登入後複製
登入後複製




如果出现空白,可以看看apache error log,看看有什么错误提示。



提示这个:
[Sun Nov 23 11:07:43 2014] [error] [client 127.0.0.1] PHP Fatal error: Call to a member function fetch_object() on a non-object in D:\\APMServ5.3.0\\www\\htdocs\\model\\Model.class.php on line 43

如果是elephant.ttf文件问题,可以下载一个新的elephant.ttf文件试试。
我测试的是用 http://www.font5.com.cn/font_download.php?id=8944&part=1279954173这个的,可以换这个试试。


用你这个也不能显示,路径是没有问题的,我试了,都正常,比如我把code.php换一个图片就能显示,说明路径是正确的.
字体文件也没 有坏,能打开。

http://yunpan.cn/cAkZubfk5Ikte (提取码:03d7)

我把我用的服务器集成环境发上来吧,里面也有源码,你们在你们的操作系统环境中能正常显示验证吗,也许是我的系统有问题?

提示这个:
[Sun Nov 23 11:07:43 2014] [error] [client 127.0.0.1] PHP Fatal error: Call to a member function fetch_object() on a non-object in D:\\APMServ5.3.0\\www\\htdocs\\model\\Model.class.php on line 43

单独运行验证码的页面,会有这个提示?
代码中根本就没有调用Model.class.php

好奇怪的情况

把你的 config/code.php 改成这样

<?phprequire substr(dirname(__FILE__),0,-7).'/init.inc.php';ob_clean(); //加上这句$_vc = new ValidateCode();$_vc->doimg();$_SESSION['code'] = $_vc->getCode();?>
登入後複製
登入後複製

这样可以使其他任何输出都不会影响到图片
当然错误显示还是要打开的(php.ini 中 display_errors = On),这个开关很重要,他可以帮助你写出健壮的程序

你的这个系统有很多毛病,比如
model/NavModel.class.php 中的
		//拦截器(__set)		private function __set($_key, $_value) {			$this->$_key = Tool::mysqlString($_value);		}				//拦截器(__get)		private function __get($_key) {			return $this->$_key;		}
登入後複製
魔术方法是不能设为私有的,不然就无效了,并且会报错

config/profile.inc.php (用于系统初始化设定)中有
	define('PREV_URL',$_SERVER["HTTP_REFERER"]);
登入後複製

这就导致直接浏览器访问时会有使用未定义下标的警告

另外 include/Tool.class.php 至少有两处因参数不合法引起的非致命错误

这都是在直接浏览器访问 config/code.php 时能看到的错误
想必其他部分都会有类似错误

我把你的 CMS 项目改名为 CMS_1
并按 #25 修改了 code.php

我把你的 CMS 项目改名为 CMS_1
并按 #25 修改了 code.php



改成这样
<?phprequire substr(dirname(__FILE__),0,-7).'/init.inc.php';ob_clean(); //加上这句$_vc = new ValidateCode();$_vc->doimg();$_SESSION['code'] = $_vc->getCode();?>
登入後複製
登入後複製
还是不行,打开code.php页面时还是空白;
错误日志中提示 [Sun Nov 23 15:31:45 2014] [error] [client 127.0.0.1] PHP Fatal error:  Call to a member function fetch_object() on a non-object in D:\\APMServ5.3.0\\www\\htdocs\\model\\Model.class.php on line 43

看来还是Model.class.php这个类没有加载进来,那么怎么加载呢

提示这个:
[Sun Nov 23 11:07:43 2014] [error] [client 127.0.0.1] PHP Fatal error:  Call to a member function fetch_object() on a non-object in D:\\APMServ5.3.0\\www\\htdocs\\model\\Model.class.php on line 43

单独运行验证码的页面,会有这个提示?
代码中根本就没有调用Model.class.php


这里如何解决呢

我在php.ini中 开启错误提示后,进入127.0.0.1/config/code.php页面有这一提示
Notice: Undefined index: HTTP_REFERER in D:\APMServ5.3.0\www\htdocs\config\profile.inc.php on line 26 Warning: The magic method __set() must have public visibility and cannot be static in D:\APMServ5.3.0\www\htdocs\model\NavModel.class.php on line 12 Warning: The magic method __get() must have public visibility and cannot be static in D:\APMServ5.3.0\www\htdocs\model\NavModel.class.php on line 17 Fatal error: Call to a member function fetch_object() on a non-object in D:\APMServ5.3.0\www\htdocs\model\Model.class.php on line 43
这里也不知如何解决呢

不会的,因为我用的就是你的程序
并且刚才又用你的包覆盖了一下

你可先一步一步来,把提示的错误信息全部改完

不会的,因为我用的就是你的程序
并且刚才又用你的包覆盖了一下

你可先一步一步来,把提示的错误信息全部改完


算了不改了,这是一个叫李炎恢的人做的一个php教程的原码,没想到错误百出,本来想装上学一下他的源码结构,没想到这样的教程也敢卖,不知误了多少人。这还没学呢,先给他纠错,呵呵。

好奇怪的情况



通过这事发一下感慨,中国人搞啥都是胡弄,本来这个源码是一个叫李炎恢的人出的php教程,叫什么php第二季,他是专门做教程的,并且卖的。本想装上学学,没想到的是,他本身就纯在很多问题,一个存在很多问题的人教别人,然后学习者还没有学呢,先给他纠错,等错误全纠正了,回头一看,原来自己是搞手,呵呵,
另外发一个感慨是,本来想通过百度云把源码发上去,供大家一块研究交流,没想到今天百度云抽风了,突然不让上传了,大家知道百度云一直被网上扫黄的,但是这种扫黄有意无意的把正常使用百度云的人也给封杀了,这叫宁可错杀一千,不放走一个,在中国搞点事真是不容易啊

看得到,下不下了
你换个网盘看看


结果我现在都不传了,现在检查百度云,又恢复正常了,真让人发指!看来百度云干脆解散算了。

学到东西了,谢谢楼主66666666666666666666666

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

See all articles