////////////////////////////////////////////////////////////
//
// poll.php - a voting poll
//
////////////////////////////////////////////////////////////
//
// This script adds votes to a poll and displays the poll.
//
// See readme.txt for more information.
//
// Author: Jon Thomas
// Last Modified: 2/17/03
//
// You may freely use, modify, and distribute this script.
// You may remove this notice.
//
////////////////////////////////////////////////////////////
// DEFINE THE VARIABLES //
// title of this poll
$title = "Clayton's Poll";
// closing date for this poll in MM/DD/YYYY format
$closingDate = "1/1/2010";
// text file that stores vote choices and totals
$pollFile = "poll.txt";
// text file that stores IP addresses
$ipFile = "ips.txt";
// DO NOT EDIT BELOW THIS POINT UNLESS YOU KNOW PHP! //
// DEFINE THE FUNCTIONS //
// check if the poll has closed
function is_closed() {
global $closingDate;
// split the closing date into month, day, and year
$closingDate = explode("/", $closingDate);
// get today's today to test against the closing date
$today = getdate();
$message = date("l, F j", mktime(0,0,0,$closingDate[0],$closingDate[1],$today[year]));
// if today's year is greater than the closing year, return true
if ($today[year] > $closingDate[2]) {
return $message;
}
// if today's year is equal to the closing year
elseif ($today[year] == $closingDate[2]) {
// if today's month is greater than the closing month, return true
if ($today[mon] > $closingDate[0]) {
return $message;
}
// if today's month is equal to the closing month
elseif ($today[mon] == $closingDate[0]) {
// if today is greater than or equal to the closing day, return true
if ($today[mday] >= $closingDate[1]) {
return $message;
}
// if the poll is still open, return false
else {
return false;
}
}
// if the poll is still open, return false
else {
return false;
}
}
// if the poll is still open, return false
else {
return false;
}
}
// check if the user has already voted
function has_voted() {
global $ipFile;
global $REMOTE_ADDR;
// open the IP address file
$ips = fopen($ipFile, "r");
// compare each entry with the user's IP address
while (!feof($ips)) {
$ip = fgets($ips, 20);
if ($ip == $REMOTE_ADDR . "\r\n") {
$match = 1;
break;
}
}
// close the IP address file
fclose($ips);
if (!$match) {
// reopen the IP address file
$ips = fopen($ipFile, "a");
// add the user's IP address
fputs($ips, $REMOTE_ADDR . "\r\n");
// close the IP address file
fclose($ips);
return false;
}
else {
return true;
}
}
// add the user's vote
function addVote($vote) {
global $pollFile;
// get the current votes
$fp_read = fopen($pollFile, "r");
$currentVote = fread($fp_read, filesize($pollFile));
fclose($fp_read);
// create an array with even numbers containing vote choices
// and odds containing vote totals
$votes = split('[|:]', $currentVote);
// update the vote
for ($i = 1; $i < count($votes); $i = $i + 2) {
// get the array index number for the name of this vote
$name = $i - 1;
// if this vote choice is this user's selection, increment it
if ($votes[$name] == $vote) {
$votes[$i]++;
}
// if this vote IS the last choice
if ($i == (count($votes) - 1)) {
$updatedVote .= $votes[$name] . ":" . $votes[$i];
}
// if this vote is NOT the last choice
else {
$updatedVote .= $votes[$name] . ":" . $votes[$i] . "|";
}
}
// save the updated vote
$fp_write = fopen($pollFile, "w");
fputs($fp_write, $updatedVote);
fclose($fp_write);
}
// display the poll
function displayPoll($message) {
global $title, $pollFile, $styleSheet;
echo "\n";
echo "\n";
echo "$title\n";
echo "\n";
echo "\n\n";
echo "\n";
// get the current votes
$fp_read = fopen($pollFile, "r");
$currentVote = fread($fp_read, filesize($pollFile));
fclose($fp_read);
// create an array with even numbers containing vote choices
// and odds containing vote totals
$votes = split('[|:]', $currentVote);
// if a message was sent, print it
if (isset($message)) {
echo "$message
\n\n";
}
echo "\n";
echo "$title\n";
// print the poll table rows
// including vote choice, vote total, and percentage of total votes
for ($i = 1; $i < count($votes); $i = $i + 2)
{
// add together each vote total to find the total number of votes cast
$totalVotes += $votes[$i];
}
for ($i = 1; $i < count($votes); $i = $i + 2) {
// get the array index number for the name of this vote
$name = $i - 1;
// calculate the percentage of total votes for this vote
// rounded to 1 decimal place
if ($totalVotes == 0) {
$percentage = 0;
}
else {
$percentage = $votes[$i] / $totalVotes * 100;
$percentage = round($percentage, 1);
}
echo "\n";
echo "\t| $votes[$name] | \n";
echo "\t$votes[$i] votes | \n";
// if the percentage is 0, don't print a bar
if ($percentage == 0) {
echo "\t$percentage% | \n";
}
// otherwise, print the bar
else {
echo "\t $percentage% | \n";
}
echo "
\n";
}
// print the total number of votes cast
echo "Total Votes: $totalVotes\n";
// finish printing the poll table
echo "
\n";
echo "\n";
echo "\n";
}
// PROGRAM CODE //
// if the poll is closed, display the poll and exit
if ($message = is_closed()) {
displayPoll("The poll closed on " . $message . ".");
exit;
}
// if the user is not voting, display the poll and exit
if (!isset($vote)) {
displayPoll("");
exit;
}
// if the user has already voted, display the poll and exit
if (has_voted()) {
displayPoll("You already voted.");
exit;
}
// add the user's vote
addVote($vote);
// display the poll
displayPoll("");
?>