首先来看下,在网上搜索出来的解决方案有如下几条:

1、修改一下评论表单,然后重新提交就可以了这个方法我确实第一次试了,管用,但是后面就不行了,具体是为什么我在后面会讲

2、空间不支持GD库,让服务商解决一下

3、去掉前面的空格

4、由编码引起的

5、由BOM头引起的

再运行,看下 /e/showkey/index.php 文件

我们知道当A页面include B页面的时候,A页面可以直接使用B页面里面的函数和变量,当B页面include C页面的时候,A页面即使没有include C页面,但是include B页面,也同样能在A页面中使用C页面里的函数和变量,发现connect.php页面引用了config.php,用NotePad++打开e/class/config.php页面,发现config.php页面并不是无BOM的UTF-8编码格式,而是带了BOM的,忽然想到,之前使用了记事本打开并修改过参数的,就是这个时候记事本默认添加了BOM头,使用NotePad++将config.php将其转换成无BOM的文件然后上传,刷新一下,OK!验证码出来了!真是一个小BOM浪费了半天的时间。

现在来说一下如何快速判断是什么原因不显示验证码

1、GD库没有打开

一般的虚拟主机都会将GD库打开的,如果GD库没有打开,那么访问http://你的域名/e/showkey/index.php就会出现一堆乱码,可以告知空间提供商让他们帮助开启,如果是自己的主机,那么打开php.ini找到extension=php_gd2.dll将前面的“;”号去掉,重启APACHE或IIS就可以,以前的PHP版本是extension=php_gd.dll。或者你可以将以下代码另存为php文件传到你空间里,如果有GD标题就说明开启了GD库。

-------------------------

<?php
  phpinfo();
?>

-------------------------

如果访问http://你的域名/e/showkey/index.php,显示的不是乱码,是红叉,那么直接跳到第二步

2、批量去掉BOM头代码

将以下代码保存为PHP文件并放置根目录下运行,则可以批量去掉BOM头

-------------------

<?php
  if (isset($_GET['dir'])){ //设置文件目录
  $basedir=$_GET['dir'];
  }else{
  $basedir = '.';
  }
  $auto = 1;
  checkdir($basedir);
  function checkdir($basedir){
  if ($dh = opendir($basedir)) {
  while (($file = readdir($dh)) !== false) {
  if ($file != '.' && $file != '..'){
  if (!is_dir($basedir."/".$file)) {
  echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
  }else{
  $dirname = $basedir."/".$file;
  checkdir($dirname);
  }
  }
  }
  closedir($dh);
  }
  }
  function checkBOM ($filename) {
  global $auto;
  $contents = file_get_contents($filename);
  $charset[1] = substr($contents, 0, 1);
  $charset[2] = substr($contents, 1, 1);
  $charset[3] = substr($contents, 2, 1);
  if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
  if ($auto == 1) {
  $rest = substr($contents, 3);
  rewrite ($filename, $rest);
  return ("<font color=red>BOM found, automatically removed._<a href=http://www.yeetech.com>http://www.yeetech.com</a></font>");
  } else {
  return ("<font color=red>BOM found.</font>");
  }
  }
  else return ("BOM Not Found.");
  }
  function rewrite ($filename, $data) {
  $filenum = fopen($filename, "w");
  flock($filenum, LOCK_EX);
  fwrite($filenum, $data);
  fclose($filenum);
  }
  ?>

-------------------

运行之后,我们来看页面,如下

拉动,右侧滚动条,直至看到红色字样,则表示有的文件包含了bom,此时,我们把文件下载下来,然后用dw打开,存储为UTF-8编码,然后上传至服务器,重新运行 bom.php 在看测试结果,如果没有红色字样,那么此时,验证码应该可以正常显示了。

站长提示:我们经常会改的文件有以下文件:

config.php connect.php t_functions.php user.php等,修改完之后,注意把这些文件存储为utf-8模式,并取消bom签名!