简单的PHP投票/投票系统

分享于 

11分钟阅读

Web开发

  繁體

Sample Image - phpoll.gif

介绍

本文将演示如何使用 PHP 5.0和DOMDocument对象模型创建一个非常简单。干净的轮询或者投票系统。 这使得轮询系统可以读取并将轮询结果写入 XML,而不是像许多传统的轮询系统那样使用MySQL数据库。

背景

我运行一个本地音乐网站,每个月,我想让我的会员投票他们最喜欢的本地乐队。 问题是,在 Cookies 中默认的joomla轮询应用程序记录了 ip。 所以,所有人都要做的是 delete 他们的Cookies,他们可以再次投票。 这是个非常不公平的系统,可以用来装选票箱。 因这里,我开始在搜索第三方组件的网络上搜索 ip,并且保持人们每天不止一次投票。

我发现有超过 10投票项目,无法在数据库中找到任何实体组件,也可以在数据库或者文件中找到超过1 个投票项,以确保用户每天不能进行一次投票。 那些我能发现的那些都是非常慢的,需要一个电子邮件签名( 阅读): 将我添加到垃圾邮件列表中,或者,有所有与他们的组件相关的弹出广告。

我选择了很多 chagrinned,我选择把 Rust 从我的PHP技能中去掉,并编写自己的。 现在,读过我最后一篇文章的人认识到我是一个微软的男人,专门用于 ASP.NET 和 C#。 不是 PHP 但是,我对语言( 没错,我确实喜欢PHP的简单/强大) 有一些体验,因这里,在阅读这个时,请记住我不是一个主题。

这个轮询很简单部署和配置,希望能够在很短的时间内为你提供安全轮询。

入门

幸运的是,你所需要运行的投票系统就是 PHP 5.0. 因为DOMDocument对象是 PHP 5的新特性,所以这是一个需求。 你不需要任何类型的数据库系统,因为该轮询系统使用简单的文件IO和 XML。

如果你想跳过本教程,我将给你快速入门指令 below。 如果你想知道程序中到底发生了什么,请继续阅读 !

快速安装

  • 为投票创建一个目录。 如果需要,这可以是你的root 网络目录。
  • 将. zip 文件中包含的文件解压到 上面 目录中。
  • chmod addresses.xml 和 results.xml 到 777 ( 在/xml 目录中)
  • 打开 results.xml 文件,并添加投票问题,以及每个投票项的条目。
  • 将 results.xml 文件中的投票计数设置为零( 或者,无论你想从什么地方开始)。
  • 可选:修改 poll.css 文件以适合你的网站主题。
  • 在 http://www.yoursite.com/yourpolldirectory/poll.php 访问轮询
  • 就是这样请注意 addresses.xml 文件中至少应该有 1个地址条目( 127.0.0.1的环回很好) !

访问投票后,poll.php 屏幕将类似如下所示:

The PHPoll Voting Page

投票后,结果屏幕将显示如下所示:

The PHPoll Results Page

概述

PHP轮询系统很简单。 它有 4个php文件。2 xml文件和一个样式表。 技术上讲,用户只能看到其中的两个页面。 下面列出了它们。

  • Poll.php
    • 调用 loadpoll.php 以显示投票选项
  • Results.php
    • 调用 savevote.php 以显示投票结果

Loadpoll.php 处理投票的显示。 它如何处理这个问题很简单。

  • 使用DOMDocument加载 results.xml 文件
  • 循环遍历所有PollItem节点以获取轮询的条目
  • 为每个项创建一个radiobutton控件,并将该值分配给特定项

$doc = new DOMDocument();


$doc->load("xml/results.xml");


$root = $doc->getElementsByTagName("results")->item(0);


$question = $root->getAttribute("question");


$pollitems = $doc->getElementsByTagName("pollitem");


foreach( $pollitems as $pollitem )


{


 //Create a radio button...


}



我们基本上只使用for对象中可以用的方法循环循环,然后发出一些HTML来解决我们的tftp控件。 最后一位是在radiobutton的onclick 事件中设置一个 JavaScript。 这样做是用投票的值填充字段的隐藏输入文本。 这样,我们就可以有一个简单的JavaScript confirm() 对话框来确保我们有一个值集。 如果没有,我们将不提交投票。 设置该值并单击"投票",表单( action="savevote。php")的值将显示隐藏值,该值将显示为。





function setVote(voteName)


{


 document.getElementById("votefor").value = voteName;


}



function confirmSubmit() 


{ 


 if (document.getElementById("votefor").value == "")


 {


 var agree=confirm("Please select an entry before voting."); 


 return false; 


 }


}



在PHP中,POST和获取变量被加载到 $_REQUEST 全局。 我们将在 savevote.php 中请求"votefor"值,我们在 poll.php 页面中设置了这个值。





$votefor = $_REQUEST["votefor"];



Savevote.php 是最大的文件,并且执行最多的工作。 操作的顺序如下所示:

  • 请求 votefor""
  • 如果 $votefor,的值为空,我们只显示结果。
  • 使用 $_SERVER["REMOTE_ADDR"] 全局获取提交者的IP
  • 加载 addresses.xml 文件,然后循环查看是否有匹配的IP地址
    • 如果我们有 MATCH 我们会检查最后一次投票的日期
      • 如果日期是今天,我们不计算投票( 用户已经投票)
      • 如果不是今天,我们将一个添加到投票计数( 在 results.xml 中),并将上次投票的日期设置为今天
    • 如果我们没有 MATCH,我们将添加新地址节点,它的IP和日期为今天
  • 现在,我们已经计算了投票( 或者不是这样的),我们显示了结果。

Getting

显示结果可能是简单的。 具有"条目"的单行项目: xx投票"足够 sufficed。 但是我想聪明点。 我喜欢显示线图的思想,它的百分比是 inside 图的比例。 现在,你不必这样做,但如果你感兴趣的话,请阅读。

显示线条图

图中我们需要的第一件事是总的投票数。 在代码中,我得到了这样的结果:


// Get max vote count


$doc = new DOMDocument();


$doc->load("xml/results.xml");


$maxvotes = 0;


$pollitems = $doc->getElementsByTagName("pollitem");


foreach( $pollitems as $pollitem )


{


 $votes = $pollitem->getElementsByTagName("votes");


 $vote = $votes->item(0)->nodeValue;


 $maxvotes = $maxvotes + $vote;


}



现在我们有了最大值,我们将循环遍历 results.xml 文件来计算百分比。





// Generate the results table


$doc = new DOMDocument();


$doc->load("xml/results.xml");


$pollitems = $doc->getElementsByTagName("pollitem");


foreach( $pollitems as $pollitem )


{


 $entries = $pollitem->getElementsByTagName("entryname");


 $entry = $entries->item(0)->nodeValue;


 $votes = $pollitem->getElementsByTagName("votes");


 $vote = $votes->item(0)->nodeValue;


 $tempWidth = $vote/$maxvotes;


 $tempWidth = 300 * $tempWidth;


 $votepct = round(($vote/$maxvotes) * 100);


 echo "<tr><td width="30%" class="polls">$entry</td>";


 echo "<td width="50%" class="resultbar"><div class="bar" 


 style="background-color:";


 getRandomColor();


 echo "; width: $tempWidth px;">$votepct%</div></td><td width="20%"


 ($vote votes)</td></tr>";


}



我这样做的方法是创建一个包含三个列的table。 第一列将保存入口 NAME,第二列将具有百分比 inside,最后一列将保持总数。

创建图形

创建图的所有方法是为每个条目创建一个DIV对象。 我进行了基础,这个DIV的最大宽度为 300像素。 你可以将它设置为你喜欢的任何内容,只需确保它适合 table 和页面 ! 我们将以( $vote )的最大数为目标,除以( $maxvote )的最大数量,然后将这个百分比乘以 300. 那么,假设我们有 30选票超出 100,30/100 =。 3,3 * 300 =,该DIV需要 90像素宽。 然后,为了获得( 放在DIV的中间)的百分比,我们只需要取 $vote/$maxvote,的值,然后乘以 100. 使用 上面 示例,这将为我们提供 30%。

着色图形

现在,当我们创建每个DIV时,我们都知道每个 %age的宽度,以及在DIV中间放置的值。 我想为每个div创建单独的颜色是很好的,因这里我编写了 getRandomColor() 函数并将div样式的background-color 设置为。





// Returns a random RGB color (used to color the vote bars)


function getRandomColor()


{


 $r = rand(128,255); 


 $g = rand(128,255); 


 $b = rand(128,255); 


 $color = dechex($r). dechex($g). dechex($b);


 echo "$color";


}



在使用PHP函数的情况下,我们为红色( $r )。绿色( $g ) 和蓝色( $b ) 值获取随机值,然后使用函数将十进制值转换为十六进制值。 这将返回一个格式化为十六进制的颜色值,background-color 将喜欢。

结束语

因此,在几个快速文件中,你可以在自己的PHP 5.0启用的web服务器上拥有定制的轮询系统。 我能够在 IIS 5.1和Apache中执行这个命令,没有任何问题。 最妙的是,你不需要数据库来保存已经登录的ip。 根据我的经验,这个系统在 PHP 5中使用DOMDocument对象运行得非常快。 你可以在 www.jaxrock.com/poll/poll.php的实际应用程序中看到这里轮询的功能演示。

祝你好运,快乐编码 !


PHP  SYS  系统  Polling  
相关文章