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