php模块之投票系统

投票模块是一个非常实用的的功能,特别是在做一些网上调查时,通过投票来完成是一个非常不错的方法,并且能够真实地的反映出投票结果,做出正确的判断。本模块介绍一些投票的实现方法和分析投票实现方法,以及在投票中如何限制重复投票。

  • 动态生成投票主题及选项。
  • E-mail地址激活。
  • 通过3D饼形图分析投票结果。
  • 通过柱形图分析投票结果。

一、投票系统模块概述

投票系统模块主要功能是根据一个主题,已提供的投票选项为条件,选出正确、合理的一项或多项内容。为了使投票系统的功能更加完善、合理,可以增加注册用户,控制一个IP的投票次数,控制IP权限,对投票结果进行分析等辅助功能,其设计的流程图如下图1:

投票系统设计思路如下:
(1)创建数据库,通过数据库来存储投票主题、内容信息以及投票的结果;透过数据库来存储用户注册信息,以及控制同一个IP的投票次数。
(2)创建用户注册和登录模块。通过E-mail地址来激活注册用户只有已经是成功激活的用户才可以进行投票。
(3)创建投票主题和投票内容浏览模块。其中通过IP地址来控制用户不能够重复投票。GD2图像来分析投票结果。
(4)后台管理模块。添加投票主题,内容和说明,并且将投票分为单选和多选两种,支持图片上传功能,还支持投票结果刷新功能。

二 、投票关键技术

1、动态生成投票主题及选项
第一步添加投票主题及投票选项,除了可以直接在数据库中添加外,还可以创建一个动态添加主题和选项的程序,通过动态页实现主题和选项的添加
动态 添加投票主体和投票选项的页面运行结果如图2所示。
动态添加 投票主题及选项属于后台管理操作,其关键是数据表的合理运用。首先要在数据库中创建投票主题数据表,单选投票选项数据表和多选投票选项数据表创建
的 投票主题数据表说明如下所示:
投票主题数据表的结构说明(tb_vote_subject):

字段名

数据类型

说明

tb_vote_subject_id

int10

投票主题

tb_vote_subject_name

varchar(80)

投票名称

tb_vote_subject_text

text

投票说明

单选投票选项数据表的结构说明(tb_vote_odd):

字段名

数据类型

说明

tb_vote_id

int10

单项投票选项的id

tb_vote_subject

varchar(80)

投票主题

tb_vote_content

varchar(80)

投票选项

tb_vote_counts

varchar(50)

投票次数

tb_vote_type

varchar(50)

投票类型(单选)

tb_vote_photo

varchar(80)

上传图片

tb_vote_explain

mediumtext

投票说明

单选投票选项数据表的结构说明(tb_vote_more):

字段名

数据类型

说明

tb_vote_id

int10

多项投票选项的id

tb_vote_subject

varchar(80)

投票主题

tb_vote_content

varchar(80)

投票选项

tb_vote_counts

varchar(50)

投票次数

tb_vote_type

varchar(50)

投票类型(多选)

tb_vote_photo

varchar(80)

上传图片

tb_vote_explain

mediumtext

投票说明




完成以上三个数据表的创建以后,动态创建投票主题和选项就完成了一半。
接下来要做的就是创建网页,通过form表单奖投票主题和选项添加到对应数据表中,完成投票主题和选项的动态创建。
(1)创建form表单,实现单选和多选投票选项的动态添加,并且支持图片上传。关键代码如下:
<form method="post" action="vote_content_message_ok.php" enctype="multiparty/form-data"name="form2">
<tr bgcolor="#167BE3">
<td height="25" valign="middle"class="style1"> 投票主题~~~
<!--从数据表中选择投票主题-->
<select name="tb_vote_subject" size="1"id="tb_vote_subject">
<?php
$query="select * from tb_vote_subject";
$result=mysql_query($query);
while($myrow=mysql_fetch_array($result)){
?>
<option value="<?php echo $myrow[tb_vote_subject_name]?>"></option>
<?php } ?>
</select></td>
<tr brcolor="#ECF6FF">
<td height="30">    
<input type="submit"name="submit1"value="单选">  
<input type="submit"name="submit2"value="多选">
</td>
</tr>
</form>

(2)将表单的数据提交到vote_content_manage_ok.php根据提交按钮的值进行判断,执行将数据添加到单选还是多选的数据表中,并且判断是否上传图片,如果有图片上传将图片存放到服务器指定文件夹下。程序关键代码如下:
<?php session_start(); include("../conn/conn.php"); 
if ($_POST[Submit]=="单选" and $_FILES['tb_vote_photo']['name']==""){		//判断是单选,并且没有图片上传
	//执行将数据添加到单选数据表中
	$query="insert into tb_vote_odd(tb_vote_subject,tb_vote_content,tb_vote_counts,tb_vote_type,tb_vote_explain)values('".$_POST[tb_vote_subject]."','".$_POST[tb_vote_content]."','0','".$_POST[Submit]."','".$_POST[tb_vote_explain]."')";
	$result=mysql_query($query);
	if ($result){
		echo "<script>alert('投票内容提交成功!');window.location.href='index.php?admin_title=管理投票内容';</script>";
	}else{echo "失败!";}
}

if ($_POST[Submit]=="单选" and $_FILES['tb_vote_photo']['name']!=""){	//判断是单选,并且有图片上传
	$tb_vote_photo=$_FILES['tb_vote_photo']['size'];		//获取图片大小
	$tb_vote_photo_name=$_FILES['tb_vote_photo']['name']; //获取客户端机器原文件的名称
	$tb_vote_photo_type=strtolower(strstr($tb_vote_photo_name,".")); //获取从"."到最后的字符,并将字符转换成小写
	if($tb_vote_photo>2000000){		//判断图片是否超过指定大小
		echo "<script>alert('对不起,您上传的图片超过2M!');history.back();</script>";
	}else{
		//判断上传图片的后缀名是否符合
		if($tb_vote_photo_type!=".jpg" & $tb_vote_photo_type!=".gif" & $tb_vote_photo_type!=".bmp" & $tb_vote_photo_type!=".jpeg"){
			echo "<script>alert('对不起,您上传的图片的格式不正确!');history.back();</script>";
		}else{
			//定义图片在服务器中的存储路径
			$tb_vote_photo_path='../images/photo/'.date("YmdHis").mt_rand(1000000,9999999).$_FILES['tb_vote_photo']['name'];
			//应用move_uploaded_file函数,将图片存储到指定的文件夹下
			if(move_uploaded_file($_FILES['tb_vote_photo']['tmp_name'],$tb_vote_photo_path)){
				//执行添加语句,将数据添加到单选表中
				$query="insert into tb_vote_odd(tb_vote_subject,tb_vote_content,tb_vote_counts,tb_vote_type,tb_vote_explain,tb_vote_photo)values('".$_POST[tb_vote_subject]."','".$_POST[tb_vote_content]."','0','".$_POST[Submit]."','".$_POST[tb_vote_explain]."','$tb_vote_photo_path')";
				$result=mysql_query($query);
				if ($result){
					echo "<script>alert('投票的内容提交成功!');window.location.href='index.php?admin_title=管理投票内容';</script>";
				}else{
					echo "失败!";
				}
				
			}			
		}
	}
}

if ($_POST[Submit2]=="多选" and $_FILES['tb_vote_photo']['name']==""){	//判断提交按钮的值是多选,并且无图片上传
	$query="insert into tb_vote_more(tb_vote_subject,tb_vote_content,tb_vote_counts,tb_vote_type,tb_vote_explain)values('".$_POST[tb_vote_subject]."','".$_POST[tb_vote_content]."','0','".$_POST[Submit2]."','".$_POST[tb_vote_explain]."')";
	$result=mysql_query($query);
	if ($result){
		echo "<script>alert('投票内容提交成功!');window.location.href='index.php?admin_title=管理投票内容';</script>";
	}else{echo "失败!";}
}


if ($_POST[Submit2]=="多选" and $_FILES['tb_vote_photo']['name']!=""){
	$tb_vote_photo=$_FILES['tb_vote_photo']['size'];
	$tb_vote_photo_name=$_FILES['tb_vote_photo']['name']; //获取客户端机器原文件的名称
	$tb_vote_photo_type=strtolower(strstr($tb_vote_photo_name,".")); //获取从"."到最后的字符,并将字符转换成小写
	if($tb_vote_photo>2000000){
		echo "<script>alert(对不起,您上传的图片超过2M!);history.back();</script>";
	}else{
		if($tb_vote_photo_type!=".jpg" & $tb_vote_photo_type!=".gif" & $tb_vote_photo_type!=".bmp"){
			echo "<script>alert(对不起,您上传的图片的格式不正确!);history.back();</script>";
		}else{
			$tb_vote_photo_path='../images/photo/'.date("YmdHis").mt_rand(1000000,9999999).$_FILES['tb_vote_photo']['name'];
			if(move_uploaded_file($_FILES['tb_vote_photo']['tmp_name'],$tb_vote_photo_path)){
				$query="insert into tb_vote_more(tb_vote_subject,tb_vote_content,tb_vote_counts,tb_vote_type,tb_vote_explain,tb_vote_photo)values('".$_POST[tb_vote_subject]."','".$_POST[tb_vote_content]."','0','".$_POST[Submit2]."','".$_POST[tb_vote_explain]."','$tb_vote_photo_path')";
				$result=mysql_query($query);
				if ($result){
					echo "<script>alert('投票内容提交成功!');window.location.href='index.php?admin_title=管理投票内容';</script>";
				}else{
					echo "失败!";
				}
				
			}			
		}
	}
}
?>

2、通过3D饼形图分析投票结果
为了更好的展示出投票结果,使其更加直观,下面介绍一种通过3D饼形图分析投票结果的方法。
通过 3D 饼形图分析投票结果关键是3D饼形图的创建和如何奖投票结果传递到3D饼形图。3D饼形图的创建使用的是jpgraph类库,在讲解饼形图的创建之前先来了解一下
jpgraph类库。
jpgraph 是一个强大的绘图组件,能根据用户的需要绘制任意图形。只要提供数据,就能自动调用绘图函数把处理的数据自动填进去自动绘制。jpgraph提供了多种方法创建各种统计图,包括折线图、柱形图、饼图等,jpgraph是一个完全使用PHP语言编写的类库,可以应用在任何PHP环境中。
jpgraph 需要GD哭的支持。如果用户希望jpgraph类库仅对当前站点有效,只需将jpgraphp压缩包下的src文件夹中的全部文件复制到网站所在的文件夹即可
在使用时调用src下的指定文件下的指定文件即可。
下面介绍 如何使用jpgraph创建饼形图,其操作步骤如下。
(1)连接数据库
(2)应用include_once语句应用指定文件,包括jpgraph.php、jpgraph_pie.php、jpgraphp_pie3d.php文件。其中jpgraphp_pie.php文件是饼形图对象所在文件,jpgraphp_pie3d.php是3D饼图PiePlot3D对象所在的类文件。
(3)编写PHP语句,从数据库中统计出投票数量。
(4)将获取的投票数据写入一个数组中,。
(5)创建Graph对象,生成一个550*260像素大小的画布,设计统计图所在画布的位置以及画布阴影。
(6)设置标题字体以及图例字体。
(7)设置饼形图所在画布位置。
(8)将绘制的3D饼形图添加到图像中。
(9)最后输出图像。
关键代码如下:
<?php include("conn/conn.php");
include_once ("jpgraph/jpgraph.php");
include_once ("jpgraph/jpgraph_pie.php");
include_once ("jpgraph/jpgraph_pie3d.php");			//引用3D饼图PiePlot3D对象所在的类文件
//统计投票的总量
$query=mysql_query("select sum(tb_vote_counts) as vote_gross from tb_vote_more where tb_vote_subject='".$_GET[vote_subject]."'");  
$vote_counts=mysql_result($query,0,"vote_gross");				//获取总的投票数量
if($vote_counts>0){
$querys=mysql_query("select * from tb_vote_more where tb_vote_subject='".$_GET[vote_subject]."' ");
while($myrow=mysql_fetch_array($querys)){
	$vote_content[]=$myrow[tb_vote_content];		
	$resultes[]=$myrow[tb_vote_counts];			//将获取的值写入到数组中
}
$graph = new PieGraph(540,260,'auto');				//创建画布
$graph->SetShadow();								//设置画布阴影
$graph->title->Set("应用3D饼形图统计优秀负责人");			//创建标题
$graph->title->SetFont(FF_SIMSUN,FS_BOLD);			//设置标题字体
$graph->legend->SetFont(FF_SIMSUN,FS_NORMAL);			//设置图例字体
$p1 = new PiePlot3D($resultes);							//创建3D饼形图对象
$p1->SetLegends($vote_content);
$p1->SetCenter(0.4,0.5);					//设置饼形图所在画布的位置
$graph->Add($p1);							//将3D饼图形添加到图像中
$graph->StrokeCSIM();						//输出图像到浏览器
}
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值