一般に、次の状況では検証コードは表示されません
1. GD ライブラリが開かれていない、 2. メモ帳でファイルを開いた結果、BOM ヘッダーが表示されました
3. < の前にスペースがある;?
しかし、私の検証コードは表示されません
をチェックしましたが、それでも表示されないため、表示は上記の 3 つとは何の関係もありません。インスタンス化には問題ありません。
でも、まだ表示されません。考えてもわかりません。
私の検証コードが elephant.ttf ファイルをロードするのは問題ですか?それで、それを解決する方法
ディスカッションに返信(解決策)
つまり、間違ったパスで検証コード ファイルを導入したことになります
そうです、このようにインポートしました
//网站根目录define('ROOT_PATH',dirname(__FILE__));public function __construct() { $this->font = ROOT_PATH.'/font/elephant.ttf'; }
<?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); } } ?>
いくつかの可能性がありますこの問題
次に、パスの問題です。 , ですが、上記の設定で問題ありません、従来の書き方はこのように書きます。
GD ライブラリのオープンなどについては、BOM ヘッダーも含めて除外されていますが、その理由は何ですか?
これが私のローカル環境での GD ライブラリのオープンであることを見ると、そうです
。
検証コードを導入したファイルへのパスがまだ間違っている可能性がありますか?
フォント elephant のファイル名は elephnt.ttf です。斜体のものは elephnti.ttf です。フォント ファイルが原因かどうかを慎重に確認してください
。ブラウザを使用して検証コード プログラムを直接実行できます
フォント elephant のファイル名は elephnt.ttf です。斜体のファイル名は elephnti.ttf です。フォントが原因であるかどうかを確認してください。ブラウザを使用して検証コード プログラムを直接実行できます
それが原因ではありません。実際のファイル名が書き込まれたファイルと一致している限り、フォント ファイル名は任意に付けることができます。 php ページでは、この可能性は排除されます。
フォントファイルの原因を取り除くことができれば、プログラムに問題はありません
フォント ファイルが原因であるかどうかの判断は、ブラウザを使用して確認コード プログラムを直接実行できます
確認コード ファイルを実行するときは http://127.0.0.1/config/ code.php では、ページには何も表示されず、空白になります。おそらくこれを見たら、認証コードに何か問題があるに違いないと口走ってしまうでしょう。問題がなければ、質問は投稿しません。
単独で実行する場合、ROOT_PATH は定義されていません。定義する必要があります
ROOT_PATH という単語を定義するシステム定数ファイルが導入されているため、定義されています。
ただし、投稿したプログラムではこれが表示されません
検証コードプログラムを単独で実行する場合、エラーが発生した場合が発生し、エラーが表示されます 機能がオンになっていない場合は、空白のページが表示されます (これは実際には 500 エラーの現れです)
バツ印が表示された場合は、プログラムに致命的ではないエラーがあることを意味し、この時点で header 関数をコメントアウトする必要があります。文字化けに混ざったエラーメッセージを元にトラブルシューティング
ただし、投稿したプログラムではこれが表示されません
また、エラーメッセージがあるかどうかを確認するには、phpのエラー表示機能をオンにすることもできます
実行してくださいコードプログラムを検証する際、エラーが発生し、エラー表示機能がオンになっていない場合、空白のページが表示されます (これは実際には 500 エラーの現れです)
バツ印が表示される場合は、プログラムにエラーがあることを意味します致命的ではないエラーなので、この時点でヘッダー関数をコメントアウトする必要があります。文字化けしたコードに混ざったエラーメッセージを基にトラブルシューティングを行います
看得到,下不下了
你换个网盘看看
很正常。
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();
如果是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();
如果是elephant.ttf文件问题,可以下载一个新的elephant.ttf文件试试。
我测试的是用 http://www.font5.com.cn/font_download.php?id=8944&part=1279954173这个的,可以换这个试试。
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();?>
//拦截器(__set) private function __set($_key, $_value) { $this->$_key = Tool::mysqlString($_value); } //拦截器(__get) private function __get($_key) { return $this->$_key; }
define('PREV_URL',$_SERVER["HTTP_REFERER"]);
我把你的 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();?>
次のようにプロンプトを出します:
[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 行目のオブジェクト
ここで解決する方法がわかりません
いいえ、私はあなたのプログラムを使用しており
、あなたのパッケージでカバーしただけなので
できますまずステップバイステップで実行してください。表示されるすべてのエラーメッセージを変更してください
いいえ、私はあなたのプログラムを使用しています
あなたのパッケージでそれをカバーしただけです
まずステップバイステップですべてのエラーを変更できます変更後はメッセージが表示されます
なんとも奇妙な状況です
を変更してください。ネットワークディスクを見て見てください