说明:
近日研究PHP的图形函数,有一些心得,制作一个网上投票与统计程序与大家共同探讨。本程序由poll_counter.php与count_image.php两个文件组成,总共代码91行。程序执行后还会产生两个文件poll_count.txt和poll_addr.txt,程序带有控制投票功能,同一IP在一定时间内不能反复投票。程序最多可有七个投票项目,具体请修改poll_counter.php文件开始处的“初始化”部分,程序不足之处请大家指正。

1.poll_counter.php-----------------------------------------------------------

<script language='JavaScript'><!--
function MM_openBrWindow(theURL,winName,features)
{window.open(theURL,winName,features);}
--></script>
<?
echo "<style type='text/css'><!-- .dkj { font-size: 9pt} --></style>";
//初始化
$title="你怎么看待台湾问题?";
$content="武力解决,和平解决,让台湾独立,民主投票解决";
$counter_file="poll_count.txt";
$addr_file="poll_addr.txt";
$content=split(",",$content);
$color=split(",","#0080ff,#ff0000,#008000,#ff80ff,#ff8040,#080000,#808080");
if (file_exists($counter_file)) // 如果存放计数器文件已经存在,读取其中的内容
{
$fp=fopen($counter_file,"r");
$count=split(",",fgets($fp,40));
fclose($fp);
}
else
{$count=split(",","0,0,0,0,0,0,0");}
if ($submit) //统计投票
{
//控制投票
if (file_exists($addr_file)) // 如果存放投票地址的文件已经存在,读取其中的内容并进行检验
{
$fp=fopen($addr_file,"r");
$addr=split(",",fgets($fp,200));
fclose($fp);
}
else
{
$addr=split(",","1,0,0,0,0,0,0,0,0,0,0");
}
$q=1;
for ($i=1;$i<=10;$i++){if ($addr[$i]==$REMOTE_ADDR){$q=0;}}
if ($q)
{
$count[$radiobutton]++;
$fp=fopen($counter_file,"w");
fputs($fp,implode(",",$count));
fclose($fp);
$addr[$addr[0]]=$REMOTE_ADDR;
$addr[0]++;
if ($addr[0]>10){$addr[0]=1;}
$fp=fopen($addr_file,"w");
fputs($fp,implode(",",$addr));
fclose($fp);
}
}
//产生投票界面
$i=0;
echo "<form method='post' action='$PHP_SELF'><table width='20%' border='0' cellspacing='0' cellpadding='0'><tr><td><div align='center' class='dkj'><b>$title</b></div></td></tr>";
while (($content[$i]!="")and($i<7))
{
echo "<tr><td><div align='left'><table width='100%' border='0' cellspacing='0' cellpadding='0'><tr><td width='80%'><input type='radio' name='radiobutton' value='$i'><font color='$color[$i]' class='dkj'>$content[$i]</font></div></td><td class='dkj' width='20%'><div align='right'>$count[$i]</div></td></tr></table></tr>";
$i++;
}
$i--;
echo "<tr><td><div align='center'><input type='submit' name='submit' value='投票'>&nbsp;&nbsp<a href='#' onClick=\"MM_openBrWindow('count_image.php?count=".implode(",",$count)."&t=$i','查看投票结果','scrollbars=no,width=150,height=150')\"><input type='button' name='submit' value='结果'></a></div></td></tr></table></form>";
?>

2. count_image.php-----------------------------------------------------------

<?
Header("Content-type: image/gif");
//显示投票结果的子程序
$x=0;
$count=split(",",$count);
$im=imagecreate(140,120); //显示图形区域
//配置颜色
$color[0]=imageColorallocate($im, 0,128,255);
$color[1]=imageColorallocate($im, 255,0,0);
$color[2]=imageColorallocate($im, 0,128,0);
$color[3]=imageColorallocate($im, 255,128,255);
$color[4]=imageColorallocate($im, 255,128,64);
$color[5]=imageColorallocate($im, 128,128,0);
$color[6]=imageColorallocate($im, 128,128,128);
$color[7]=imageColorallocate($im, 255,255,255);
imagefill($im, 5, 5, $color[7]); //填充颜色
for ($i=0;$i<=$t;$i++) //统计总投票人数
{$total=$total+$count[$i];}
for ($i=0;$i<=$t;$i++)
{
if ($total==0)
{$y=0;}
else
{$y=Ceil($count[$i]/$total*100);}
imagefilledrectangle($im, $x+$i*20, 100-$y, $x+$i*20+10, 100, $color[$i]); //画距型
imagestring($im, 2, $x+$i*20, 104, "$y%", $red); //输出内容
}
imagegif($im); //完成图形
imagedestroy($im); //释放内存
?>