главная - Статьи - WWW (HTML, PHP и др.)
Как создать голосование на PHP
Ниже приведена простая для понимания и реализации функция создания интернет-голосования на сайте.
Вызывается функция следующим образом:
<?php
// Создаем новую функцию С 3-мя параметрами:
// $name - название опроса;
// $variants - массив вариантов ответа;
// $dir - имя директории для файлов опроса (папка создается скриптом).
function voting($name, $variants, $dir){
GLOBAL $REQUEST_URI;
// Если пользователь уже проголосовал
if(isset($_POST['vote'])){
// Массив ошибок
$errors = array();
// Массив содержимого директории
$indir = array();
$dh = opendir('./');
while($file = readdir($dh)){
if($file == '.' || $file == '..') continue;
$indir[] = $file;
}
closedir($dh);
// --------------------------------------------------------
// Если у вас PHP5, вместо получения содержимого дериктории
// вручную, вы можете воспльзоваться функцией scandir():
// $indir = scandir('./');
// --------------------------------------------------------
// Если директория для файлов опроса отсутсвует,
// Значит еще никто не голосовал, следовательно,
// Нужно создать эту директорию и необходимые файлы,
// Чтобы избежать ошибки
if(in_array($dir, $indir) == FALSE){
mkdir($dir, 0770);
$cr1 = fopen($dir.'/base.txt', 'w');
for($i=0; $i<sizeof($variants); $i++){
fputs($cr1, '0');
}
fclose($cr1);
$cr2 = fopen($dir.'/ip_list.txt', 'w');
fclose($cr2);
}
// Понеслась... Проверяем, голосовал ли пользователь
// Массив уже проголосовавших IP-адресов
$ip_list = file($dir.'/ip_list.txt');
// Если IP юзера совпал с одним из базы, значит юзер
// Уже голосовал
if(in_array($_SERVER['REMOTE_ADDR']." ", $ip_list) == TRUE){
$errors[] = "Вы уже голосовали!";
}else{
$answers = file($dir."/base.txt");
$fh = fopen($dir."/base.txt", "w");
flock($fh, LOCK_EX);
for($i=0; $i<sizeof($answers); $i++){
// Удаляем переводы строк
$answers[$i] = trim($answers[$i]);
// Пишем
if($i == $_POST['vote']){
fputs($fh, ($answers[$i]+1)." ");
}else{
fputs($fh, $answers[$i]." ");
}
}
flock($fh, LOCK_UN);
fclose($fh);
// Записываем IP юзера в базу проголосовавших
$fb = fopen($dir."/ip_list.txt", "a+");
fputs($fb, $_SERVER['REMOTE_ADDR']." ");
fclose($fb);
}
if(isset($errors[0])){
echo "Ваш голос не был учтен, т.к. были обнаружены следующие ошибки: <br>";
for($i=0; $i<sizeof($errors); $i++) echo $errors[$i]."<br>";
}else{
echo "Ваш голос учтен! Результаты:<br>";
// Обновляем базу
$answers = file($dir."/base.txt");
// Выводим результаты, и заодно считаем общее количество
// Для этого складываем существующие голоса
$summ = 0;
for($i=0; $i<sizeof($answers); $i++){
echo $variants[$i].": ".$answers[$i]."<br>";
// Пересчет голосов
$summ += $answers[$i];
}
// Вывод общего количества голосов
echo "Всего: ".$summ;
}
}else{
echo "<b>".$name."</b><br>";
echo "<form action=./ method=POST>";
for($i=0; $i<sizeof($variants); $i++){
echo "<input type=radio name=vote value=".$i;
if($i==0) echo " checked";
echo ">".$variants[$i]."<br>";
}
echo "<input type=submit value=Голосовать>";
echo "</form>";
}
}
?>
// Создаем новую функцию С 3-мя параметрами:
// $name - название опроса;
// $variants - массив вариантов ответа;
// $dir - имя директории для файлов опроса (папка создается скриптом).
function voting($name, $variants, $dir){
GLOBAL $REQUEST_URI;
// Если пользователь уже проголосовал
if(isset($_POST['vote'])){
// Массив ошибок
$errors = array();
// Массив содержимого директории
$indir = array();
$dh = opendir('./');
while($file = readdir($dh)){
if($file == '.' || $file == '..') continue;
$indir[] = $file;
}
closedir($dh);
// --------------------------------------------------------
// Если у вас PHP5, вместо получения содержимого дериктории
// вручную, вы можете воспльзоваться функцией scandir():
// $indir = scandir('./');
// --------------------------------------------------------
// Если директория для файлов опроса отсутсвует,
// Значит еще никто не голосовал, следовательно,
// Нужно создать эту директорию и необходимые файлы,
// Чтобы избежать ошибки
if(in_array($dir, $indir) == FALSE){
mkdir($dir, 0770);
$cr1 = fopen($dir.'/base.txt', 'w');
for($i=0; $i<sizeof($variants); $i++){
fputs($cr1, '0');
}
fclose($cr1);
$cr2 = fopen($dir.'/ip_list.txt', 'w');
fclose($cr2);
}
// Понеслась... Проверяем, голосовал ли пользователь
// Массив уже проголосовавших IP-адресов
$ip_list = file($dir.'/ip_list.txt');
// Если IP юзера совпал с одним из базы, значит юзер
// Уже голосовал
if(in_array($_SERVER['REMOTE_ADDR']." ", $ip_list) == TRUE){
$errors[] = "Вы уже голосовали!";
}else{
$answers = file($dir."/base.txt");
$fh = fopen($dir."/base.txt", "w");
flock($fh, LOCK_EX);
for($i=0; $i<sizeof($answers); $i++){
// Удаляем переводы строк
$answers[$i] = trim($answers[$i]);
// Пишем
if($i == $_POST['vote']){
fputs($fh, ($answers[$i]+1)." ");
}else{
fputs($fh, $answers[$i]." ");
}
}
flock($fh, LOCK_UN);
fclose($fh);
// Записываем IP юзера в базу проголосовавших
$fb = fopen($dir."/ip_list.txt", "a+");
fputs($fb, $_SERVER['REMOTE_ADDR']." ");
fclose($fb);
}
if(isset($errors[0])){
echo "Ваш голос не был учтен, т.к. были обнаружены следующие ошибки: <br>";
for($i=0; $i<sizeof($errors); $i++) echo $errors[$i]."<br>";
}else{
echo "Ваш голос учтен! Результаты:<br>";
// Обновляем базу
$answers = file($dir."/base.txt");
// Выводим результаты, и заодно считаем общее количество
// Для этого складываем существующие голоса
$summ = 0;
for($i=0; $i<sizeof($answers); $i++){
echo $variants[$i].": ".$answers[$i]."<br>";
// Пересчет голосов
$summ += $answers[$i];
}
// Вывод общего количества голосов
echo "Всего: ".$summ;
}
}else{
echo "<b>".$name."</b><br>";
echo "<form action=./ method=POST>";
for($i=0; $i<sizeof($variants); $i++){
echo "<input type=radio name=vote value=".$i;
if($i==0) echo " checked";
echo ">".$variants[$i]."<br>";
}
echo "<input type=submit value=Голосовать>";
echo "</form>";
}
}
?>
Вызывается функция следующим образом:
<?php
voting("Выбираем самый популярный антивирус", Array("Kaspersky", "Eset NOD32", "Symantec", "DrWeb", "McAfee"), "vote2");
?>
voting("Выбираем самый популярный антивирус", Array("Kaspersky", "Eset NOD32", "Symantec", "DrWeb", "McAfee"), "vote2");
?>
Ну вот и все.
Автор: Mostom, http://cngroup.ru/
Авторизуйтесь для добавления комментариев!