ホームページ  >  記事  >  バックエンド開発  >  認証コードが表示されないという非常に難しい質問です。

認証コードが表示されないという非常に難しい質問です。

WBOY
WBOYオリジナル
2016-06-23 13:44:451291ブラウズ

一般に、次の状況では検証コードは表示されません
1. GD ライブラリが開かれていない、 2. メモ帳でファイルを開いた結果、BOM ヘッダーが表示されました
3. < の前にスペースがある;?
しかし、私の検証コードは表示されません

をチェックしましたが、それでも表示されないため、表示は上記の 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 ライブラリのオープンであることを見ると、そうです



検証コードを導入したファイルへのパスがまだ間違っている可能性がありますか?



2e1cf0710519d5598b1f0f14c36ba674c69af53bf55d1577af9842fc9e0b8f7e8c1ecd4bb896b2264e0711597d40766c

フォント elephant のファイル名は elephnt.ttf です。斜体のものは elephnti.ttf です。フォント ファイルが原因かどうかを慎重に確認してください

。ブラウザを使用して検証コード プログラムを直接実行できます



フォント elephant のファイル名は elephnt.ttf です。斜体のファイル名は elephnti.ttf です。フォントが原因であるかどうかを確認してください。ブラウザを使用して検証コード プログラムを直接実行できます

それが原因ではありません。実際のファイル名が書き込まれたファイルと一致している限り、フォント ファイル名は任意に付けることができます。 php ページでは、この可能性は排除されます。

フォントファイルの原因を取り除くことができれば、プログラムに問題はありません

私の返信のスクリーンショットはあなたのプログラムによって生成されました


フォント象のファイル名は elephnt.ttf です。 1 つは elephnti.ttf です。慎重に確認してください

フォント ファイルが原因であるかどうかの判断は、ブラウザを使用して確認コード プログラムを直接実行できます


確認コード ファイルを実行するときは http://127.0.0.1/config/ code.php では、ページには何も表示されず、空白になります。おそらくこれを見たら、認証コードに何か問題があるに違いないと口走ってしまうでしょう。問題がなければ、質問は投稿しません。

単独で実行する場合、ROOT_PATH が定義されていません。定義する必要があります

単独で実行する場合、ROOT_PATH は定義されていません。定義する必要があります

ROOT_PATH という単語を定義するシステム定数ファイルが導入されているため、定義されています。

ただし、投稿したプログラムではこれが表示されません
また、エラーメッセージがあるかどうかを確認するには、php のエラー表示機能をオンにすることができます

検証コードプログラムを単独で実行する場合、エラーが発生した場合が発生し、エラーが表示されます 機能がオンになっていない場合は、空白のページが表示されます (これは実際には 500 エラーの現れです)
バツ印が表示された場合は、プログラムに致命的ではないエラーがあることを意味し、この時点で header 関数をコメントアウトする必要があります。文字化けに混ざったエラーメッセージを元にトラブルシューティング


ただし、投稿したプログラムではこれが表示されません

また、エラーメッセージがあるかどうかを確認するには、phpのエラー表示機能をオンにすることもできます

実行してくださいコードプログラムを検証する際、エラーが発生し、エラー表示機能がオンになっていない場合、空白のページが表示されます (これは実際には 500 エラーの現れです)
バツ印が表示される場合は、プログラムにエラーがあることを意味します致命的ではないエラーなので、この時点でヘッダー関数をコメントアウトする必要があります。文字化けしたコードに混ざったエラーメッセージを基にトラブルシューティングを行います


ファイルが大きくないので表示できるか確認してください。見れますが、ダウンロードできません
ネットワークディスクを変更して見てください

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


本来想传到百度云了,没想到百度云网盘出问题了,这一扫黄,百度云一直不好用了。把正常人使用的环境也破坏了
传到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() in a non-object in D:\APMServ5.3.0 \www\htdocs\model\Model.class.php の 43 行目

検証コードを個別に実行すると、このプロンプトが表示されますか?
Model.class.php がコード内でまったく呼び出されません


ここで解決する方法

php.ini でエラー プロンプトをオンにした後、127.0.0.1/config/code.php ページに入りました。これはプロンプトでした
注意: 未定義のインデックス: D:APMServ5.3.0wwwhtdocsconfigprofile.inc.php の 26 行目の HTTP_REFERER 警告: マジック メソッド __set() はパブリック可視性を持つ必要があり、D:APMServ5.3.0wwwhtdocsmodelNavModel.class で静的にすることはできません.php (12 行目) 警告: マジック メソッド __get() はパブリックな可視性を持つ必要があり、D:APMServ5.3.0wwwhtdocsmodelNavModel.class.php の 17 行目で静的にすることはできません。 致命的なエラー: 非インターフェイスでのメンバー関数 fetch_object() の呼び出しD:APMServ5.3.0 wwwhtdocsmodelModel.class.php の 43 行目のオブジェクト
ここで解決する方法がわかりません

いいえ、私はあなたのプログラムを使用しており
、あなたのパッケージでカバーしただけなので

できますまずステップバイステップで実行してください。表示されるすべてのエラーメッセージを変更してください

いいえ、私はあなたのプログラムを使用しています
あなたのパッケージでそれをカバーしただけです

まずステップバイステップですべてのエラーを変更できます変更後はメッセージが表示されます


忘れてください。これは Li Yanhui という人が作成した PHP チュートリアルの元のコードです。当初は彼のソース コードの構造を学ぶふりをしたかったのですが、しかし、このようなチュートリアルが販売されるとは予想していませんでした。どれだけの人を見逃したかわかりません。これはまだ学んでいないので、まず訂正しましょう(笑)。

なんとも奇妙な状況です



この事件を通して私の気持ちを伝えたいのですが、このソースコードは Li Yanhui という人物によって作成された PHP チュートリアルであることが判明しました。それは PHP シーズン 2 と呼ばれます。彼はチュートリアルの作成と販売を専門としています。私は学生のふりをしたかったのですが、予想外だったのは、彼自身が多くの問題を抱えているということでした。すべての間違いが修正されたら、戻って学習することができます。ほら、私が黒幕であることがわかりました (笑)
もう 1 つの感情は、元々は、みんなが一緒に勉強してコミュニケーションできるように、Baidu Cloud を通じてソース コードを投稿したかったということです。 、しかし、今日Baidu Cloudが発作を起こして突然アップロードを停止するとは予想していませんでしたBaidu Cloudがオンライン反ポルノキャンペーンの標的になっていることは誰もが知っていますが、この種の反ポルノキャンペーンは意図的または意図せずに、次のような人々をブロックしました。通常、百度クラウドを使用します。これは、中国で何かをするのは本当に簡単ではありません

を変更してください。ネットワークディスクを見て見てください

その結果、今はもうアップロードしていませんが、Baidu Cloudを確認すると、再び正常に戻りました。百度雲はさっさと解散したほうがいいような気がする。
何かを学びました、ありがとう 66666666666666666666666

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。