На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

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


Задача:

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





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




IP отправителя письма в Thunderbird, яндекс, mail.ru и gmail.com
Проверка параметров SSL вашего сервера


© upread.ru 2013-2020
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.