|
再谈直接在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<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;
//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/ 上找
|