Простое голосование на сайт
Задача:
Сделать простое голосование на сайте, не используя базы данных.Нам потребуется три файла: 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты