再谈直接在HTML或JS中可以引用的PHP图形计数器

首先,我先说明此计数器是直接在HTML或JavaScript中调用的,如果您主程序是
PHP脚本,那请您离去,因为那样可行的方法太多了。

有人会问了,我去申请一个免费计数器不就得了,如果你觉得这样很爽,那也请
你离开了,其实我们自己做一个计数器不是很好吗,况且现在支持PHP的很多,
无任他服务器性能如何,运行一个计数器的代码应该绰绰有余吧。

我觉得比较好的有以下两种方法,其实这样用的许多人也是这样做的,我要再提的
原因一是总结一下,二是我发现有点小地方,他们好像没有注意到。

一种是在PHP中返回JavaScript语言脚本,就相当
于直接用JS书写的一样,只不过借用PHP的文件读写等功能。在HTML中这样调用<Script
 SRC=\\\".../xxx.php?...\\\"></Script>,JS中document.write(\\\'<Script
 SRC=\\\".../xxx.php?...\\\"></Script>\\\');
 
 另外是PHP脚本返回图象。HTML中<img src=\\\".../xxx/php?...\\\">,在JS中
 document.write(\\\'<img src=\\\".../xxx/php?...\\\">\\\') ;

(下面两种方法例程代码均是本人的计数器源码稍作修改) 
对于第一种方法,不需要图形(GD)的支持,对于不知是否支持GD的PHP免费空间是挺好的,
基本实现方法如下: 
<?php
//用来Session来保证正确计数
session_start();
$sid=session_id();

//计数位数
if (!$size or $size<or $size>15)
$size=8;

$user="mycounter\\\";

if (!file_exists($user.
\\\".dat\\\"))
{
$counter=fopen($user.
\\\".dat\\\",\\\"w\\\");
fputs($counter,
\\\"0\\\");
fclose($counter);
}
else
{
$counter=fopen($user.
\\\".dat\\\",\\\"r\\\");
$data=trim(fgets($counter,15));
fclose($counter);
}

if(! session_is_registered($sid))
{
    $data++;
    $counter=fopen($user.
\\\".dat\\\",\\\"w\\\");
    fputs($counter,$data);
    fclose($counter);
    session_register($sid);
}
if (strlen($data)>$size) 
$data=substr($data,strlen($data)-$size,$size);

while (strlen($data)<$size )
$data=
\\\"0\\\".$data;

//0-9图片
$digi
[0]=\\\"counter/images/0.gif\\\";
$digi
[1]=\\\"counter/images/1.gif\\\";
$digi
[2]=\\\"counter/images/2.gif\\\";
$digi
[3]=\\\"counter/images/3.gif\\\";
$digi
[4]=\\\"counter/images/4.gif\\\";
$digi
[5]=\\\"counter/images/5.gif\\\";
$digi
[6]=\\\"counter/images/6.gif\\\";
$digi
[7]=\\\"counter/images/7.gif\\\";
$digi
[8]=\\\"counter/images/8.gif\\\";
$digi
[9]=\\\"counter/images/9.gif\\\";

//输出JS代码document.write(
\\\'<table align=center width=100%><tr><td align=center>\\\');
echo 
\\\"document.write(\\\'<table align=center width=100%><tr><td align=center>\\\');\\\\r\\\\n\\\" ;
for($i=0;$i<$size;$i++)
{
$number=substr($data,$i,1);
echo 
\\\"document.write(\\\'\\\".\\\'<img border=\\\"0\\\" src=\\\'.$digi[$number].\\\' width=\\\"15\\\" height=\\\"20\\\" >\\\'.\\\"\\\');\\\\r\\\\n\\\" ;
//如果你直接用数字来显示
//echo 
\\\"document.write(\\\'\\\".$number.\\\"\\\');\\\" ;
}
echo 
\\\"document.write(\\\'</td></tr></table>\\\');\\\\r\\\\n\\\" ;

?>

这种办法按理说,应该工作正常,一开始我在奥索的个人主页就是这代码,工作的非常棒,
我也以为没问题了。

然而,当我把此代码放到51.net上,它的免费空间始终弹出广告窗口,这下我的代码出错了,
计数器始终不能工作,后来看看页面源代码,发现51会加代码来弹出广告窗口,这代码
肯定是动态加入的,也就是说,我们的HTML文件经过51的某个程序过滤后再给客户端,
本来嘛,你加就加吧,干嘛搞得我脚本不能正常执行呢。没办法,用微软的脚本调试来最终,
哈哈,真搞不懂,51要加的语句被紧跟我们的PHP输出一块来了,浏览器当然搞不懂在<Script>
还有<Script>的语句了,也就会说脚本运行错误了。

最好的解决就是不要让51加代码了,正途上的方法也就是交钱了。

当然也可以用GD库来解决,也就是第二种办法了。

这种办法要注意的是gif在新的GD里已经不支持了,恰恰这一点许多人都没注意。
这也是我要重点提示的地方。
那,我又不知道服务器是否支持GD,怎么办?做个判断吧,怎么做呢。

我在现在的程序里,就自动选择gif、jpeg、png格式的图形。
(JPEG、PNG基本上都支持)

<?php
define(
\\\"IMG_GIF\\\",1);
define(
\\\"IMG_JPG\\\",2);
define(
\\\"IMG_PNG\\\",4);

//判断可支持的格式
if (ImageTypes() & IMG_GIF) 
{
$doimg=
\\\"gif\\\";
}

elseif (ImageTypes() & IMG_PNG) 
{
$doimg=
\\\"png\\\";
}
elseif (ImageTypes() & IMG_JPG) 
{
$doimg=
\\\"jpg\\\";
}
else
{
//上面三种都不支持,那也没办法了
$doimg=
\\\"\\\" ;
}

//根据支持的类型,输出相应的文件格式
if ($doimg==
\\\"gif\\\"{
Header(
\\\"Content-type: image/gif\\\");
}
elseif ($doimg==
\\\"jpg\\\"{
Header(
\\\"Content-type: image/jpeg\\\");
}
elseif ($doimg==
\\\"png\\\"{
Header(
\\\"Content-type: image/png\\\");
}

session_start();
$sid=session_id();

if (!$size or $size<6 or $size>15)
$size=8;

$user=
\\\"mycounter\\\";

if (!file_exists($user.
\\\".dat\\\"))
{
$counter=fopen($user.
\\\".dat\\\",\\\"w\\\");
fputs($counter,
\\\"0\\\");
fclose($counter);
}
else
{
$counter=fopen($user.
\\\".dat\\\",\\\"r\\\");
$data=trim(fgets($counter,15));
fclose($counter);
}
if(! session_is_registered($sid))
{
    $data++;
    $counter=fopen($user.
\\\".dat\\\",\\\"w\\\");
    fputs($counter,$data);
    fclose($counter);
    session_register($sid);
}

if (strlen($data)>$size) 
$data=substr($data,strlen($data)-$size,$size);

while (strlen($data)<$size )
$data=
\\\"0\\\".$data;

$border=2;

//根据支持的类型,处理相应的文件格式
if ($doimg==
\\\"gif\\\"{
$digisize=getimagesize(
\\\"images/0.gif\\\");
}
elseif ($doimg==
\\\"jpg\\\"{
$digisize=getimagesize(
\\\"images/0.jpg\\\");
}
elseif ($doimg==
\\\"png\\\"{
$digisize=getimagesize(
\\\"images/0.png\\\");
}

$totalheight=$digisize
[0]*$size+$border*2;
$totalweight=$digisize
[1]+$border*2;

if ($doimg==
\\\"gif\\\"{
$digi
[0]=imagecreatefromgif(\\\"images/0.gif\\\");
$digi
[1]=imagecreatefromgif(\\\"images/1.gif\\\");
$digi
[2]=imagecreatefromgif(\\\"images/2.gif\\\");
$digi
[3]=imagecreatefromgif(\\\"images/3.gif\\\");
$digi
[4]=imagecreatefromgif(\\\"images/4.gif\\\");
$digi
[5]=imagecreatefromgif(\\\"images/5.gif\\\");
$digi
[6]=imagecreatefromgif(\\\"images/6.gif\\\");
$digi
[7]=imagecreatefromgif(\\\"images/7.gif\\\");
$digi
[8]=imagecreatefromgif(\\\"images/8.gif\\\");
$digi
[9]=imagecreatefromgif(\\\"images/9.gif\\\");
}
elseif ($doimg==
\\\"jpg\\\"{
$digi
[0]=imagecreatefromjpeg(\\\"images/0.jpg\\\");
$digi
[1]=imagecreatefromjpeg(\\\"images/1.jpg\\\");
$digi
[2]=imagecreatefromjpeg(\\\"images/2.jpg\\\");
$digi
[3]=imagecreatefromjpeg(\\\"images/3.jpg\\\");
$digi
[4]=imagecreatefromjpeg(\\\"images/4.jpg\\\");
$digi
[5]=imagecreatefromjpeg(\\\"images/5.jpg\\\");
$digi
[6]=imagecreatefromjpeg(\\\"images/6.jpg\\\");
$digi
[7]=imagecreatefromjpeg(\\\"images/7.jpg\\\");
$digi
[8]=imagecreatefromjpeg(\\\"images/8.jpg\\\");
$digi
[9]=imagecreatefromjpeg(\\\"images/9.jpg\\\");

}
elseif ($doimg==
\\\"png\\\"{
$digi
[0]=imagecreatefrompng(\\\"images/0.png\\\");
$digi
[1]=imagecreatefrompng(\\\"images/1.png\\\");
$digi
[2]=imagecreatefrompng(\\\"images/2.png\\\");
$digi
[3]=imagecreatefrompng(\\\"images/3.png\\\");
$digi
[4]=imagecreatefrompng(\\\"images/4.png\\\");
$digi
[5]=imagecreatefrompng(\\\"images/5.png\\\");
$digi
[6]=imagecreatefrompng(\\\"images/6.png\\\");
$digi
[7]=imagecreatefrompng(\\\"images/7.png\\\");
$digi
[8]=imagecreatefrompng(\\\"images/8.png\\\");
$digi
[9]=imagecreatefrompng(\\\"images/9.png\\\");

}

$dyna=imagecreate($totalheight,$totalweight);
$backgroundcolor=imagecolorallocate($dyna,255,255,255);

if (!$bordercolor)
$bordercolor=imagecolorallocate($dyna,240,230,0);
else
{
$rgb=split(
\\\",\\\",$bordercolor);
$bordercolor=imagecolorallocate($dyna,$rgb
[0],$rgb[1],$rgb[2]);
}

$gray=imagecolorallocate($dyna,200,200,200);

for($i=0;$i<$border;$i++)
imagerectangle($dyna,$i,$i,$totalheight-$i-1,$totalweight-$i-1,$bordercolor);

imageline($dyna,$border-1,$border-1,$totalheight-$border-1,$border-1,$gray);
imageline($dyna,$border-1,$border-1,$border-1,$totalweight-$border-1,$gray);
imageline($dyna,$totalheight-1,0,$totalheight-1,$totalweight-1,$gray);
imageline($dyna,0,$totalweight-1,$totalheight-1,$totalweight-1,$gray);

for($i=0;$i<$size;$i++)
imagecopyresized($dyna,$digi
[substr($data,$i,1)],$border+$i*$digisize[0],$border,0,0,$digisize[0],$digisize[1],$digisize[0],$digisize[1]);

if ($doimg==
\\\"gif\\\"{
imagegif($dyna);
}
elseif ($doimg==
\\\"jpg\\\"{
imagejpeg($dyna);
}
elseif ($doimg==
\\\"png\\\"{
imagepng($dyna);
}

imagedestroy($dyna);

?>
现在我把这代码,放到51上,哈哈出来了。(当然了,其实51支持GIF)
其实如果我们拥有自己的收费或不会给你加这加那的空间,我还是偏重
第一种,因为我一开始就说明了,我用PHP仅仅是为了有自己的Counter,
因为有可能我的内容会放在不支持PHP等脚本的空间呢。(重点还是靠HTML、
JS)
以上涉及到的图片均可到 http://leafred.51.net/ 上找