Простое голосование на сайт


Задача:

Сделать простое голосование на сайте, не используя базы данных.
Нам потребуется три файла: test.php, in.php и vote.txt. Первый - это своеобразный "фронтэнд", второй - "бэкенд", третий - "заместитель" базы данных. Ниже приведены их полные тексты с построчными комментариями, но перед этим немного предварительной информации, общей, так сказать. Итак, в test.php имеется форма, в которой пользователь и выбирает вариант ответа. Поле нажатия "Голосовать", выбранный вариант ответа по поводу нашего сайта upread.ru отправляется в файл in.php. Заметьте, что перезагрузки страницы не происходит - мы применяем технологию ajax. В in.php обрабатывается ответ и перезаписывается файл vote.txt, который по совместительству является нашей базой данных. Чтобы посетители сайта не могли узнать результаты голосования без вашего ведома, поставьте права доступа к файлу - 644.

test.php:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Голосование upread.ru</title>

<!--  Подключаем   jquery    !-->
<script type="text/javascript" language="javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>  
<body>
<!-- элемент form2 не виден изначально !-->
<style>
#form2{
	display:none;
}
</style>
<div name="form2" id="form2">Вы уже проголосовали.</div>

<!-- форма голосования, обработка производится с помощью скрипта !-->
<form action="" method="post" name="form1" id="form1">
Вам нравится наш сайт upread.ru?
<input type="radio" name="name" value="one" checked/> Да<br />
<input type="radio" name="name" value="two" /> Нет<br />
<input name="submit" type="submit" value="Голосовать" onClick="saveform (this.form);return false;">
</form>
<div id="enter_name"></div>
 
<!-- функция saveform получает данные из формы и передает их с помощью ajax в файл in.php, а после получения ответа скрывает форму, выводит form2 и показывает алерт с сообщением !-->
<script type="text/javascript">
function saveform (data)
{
    var name = data.name.value;
    $.post('in.php',{name:name},function(data){
        $('#enter_name').html(data);
    },'json');
	
	document.getElementById('form1').style.display="none";
    document.getElementById('form2').style.display="block";
	window.alert('Спасибо, ваш голос учтен.');
}
</script>
</body> 
</html>
in.php:

<?php
$fn = $_POST['name']; //Получаем именно ту радиокнопку, которая выбрана
$mass = array(); //Инициализируем массив для строк файла
$fp = fopen("vote.txt", "r"); // Открываем файл нашу "базу данных" в режиме чтения
$i=0;

//заполняем циклом массив из файла
while (!feof($fp)) 
{
$mass[$i]=fgets($fp);
$i++;
}
fclose($fp); //закрываем файл

//в зависимости от выбранного ответа, увеличиваем первое или второе значение массива на единицу
if ($fn=="one") {
	$mass[0] = $mass[0] + 1;
	$text = $mass[0]."\r\n".$mass[1];
}
else {
	$mass[1] = $mass[1] + 1;
	$text = $mass[0].$mass[1];
	}

$fp = fopen("vote.txt", "a"); //снова открываем файл-базу, теперь для записи
truncate($fp, 0);  //очищаем его
fwrite($fp, $text); //пишем новые значения
fclose($fp);  //закрываем

die (json_encode ($name));
?>
vote.txt:

0
0
Напоследок заметим, что здесь никакой защиты не стоит - это действительно самое простое голосование. Чтобы избежать накрутки, есть немало разных способов защиты:

  • Определение по ip адресу - это приходит в голову самым первым. Способ не самый лучший, так как сейчас множество провайдеров интернета выделяют по умолчанию своим клиентам динамические ip адреса. Однако, в сочетании с другими методами защиты использовать его можно.

  • Куки. Этот способ защиты от накрутки голосования позволяет однозначно вычислить голосовавшего... если он не почистил их. Однако, идентифицировать уже проголосовавшего можно и с помощью других параметров - истории браузера, его кеша, куки флеш (Local Storage - они будут даже других браузерах), html5 - даже по разрешению экрана!

  • Заглушка прокси, тора - пользователи не смогут голосовать и оставаться анонимными.

  • Социальные сети - идентификация с помощью их хороший способ запретить накрутку, но довольно сложно реализуемый.

  • Проверка электронной почты, создание своей базы пользователей, проверка телефона (смс подтверждение) - это уже для серьезных голосований.

Есть и другие способы защиты, но разработчики справедливо не разглашают их. Да и они нередко строго индивидуальны для каждого проекта. Если вам требуется реализовать голосование на сайте, то вы можете обратиться к автору статьи по координатам, указанным на блоге.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Перехватываем нажатия клавиш в C#
IDE NetBeans: возможности, советы и будущее
Урок 1. HelloWorld