Сейчас: 23:37:56   26-го апреля 2024 г.
UsefulScript.ruСкриптыРазныеСкрипт голосования на PHP
59
233

Скрипт голосования на PHP

Уже несколько раз посетители нашего сайта обращались к нам через форму обратной связи и по внутренней почте форума с просьбой сделать PHP скрипт для голосования посетителей на сайте. Пожелания по функциональности были самые разнообразные. Проанализировав несколько популярных скриптов, имеющихся в сети, мы пришли к выводу, что у них имеются разнообразные недостатки. В связи с этим было принято решение о создании своего собственного скрипта для голосования на PHP.


Пример работы предлагаемого нами скрипта голосования на PHP расположен ниже:


Как Вам данная тема?
Отлично
Нормально
Сойдет
Так себе
Ужасно

Самым простым решением было бы использование MySQL, но не у всех наших посетителей он имеется на хостинге, либо у некоторых хостеров доступен за дополнительную плату.


Самым важным моментом при создании своего собственного скрипта для голосования, как нам кажется, является то, что скриптом должен учитываться только один голос с одного IP адреса для каждого голосования. Следующим важным моментом является защита файла результатов от записи в момент, пока с файлом работает другой процесс (особенно актуально для сайтов с высокой посещаемостью). Это необходимо для предотвращения потери данных. Подробнее можно ознакомиться в другой нашей теме - Блокировка файлов от записи на PHP.


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


Далее приводим полный PHP код для реализации голосования на своем сайте, который получился у нас после добавления в него необходимых функций:

PHP код:
<?php
$file
='';
$file_ip='';
$message='<br>';
$view_res=0;
if (isset(
$_POST['view_res']) and is_numeric($_POST['id'])) $view_res=1;
if (isset(
$_POST['vote']) and is_numeric($_POST['item'])
and 
is_numeric($_POST['id'])) {
 
$f_name="vote".$_POST['id'].".txt";
 
$f_ip="vote".$_POST['id']."_ip.txt";
 
$ip=$_SERVER['REMOTE_ADDR'];

 
$fh_ip=fopen($f_ip,"a+");
 
flock($fh_ip,LOCK_EX);
 
fseek($fh_ip,0);
 while (!
feof($fh_ip)) $file_ip=fread($fh_ip,4096);
 if (
array_search($ip,explode(","$file_ip))!==FALSE) {
     
$message="<b>Вы уже голосовали!</b><br>";
 }
 else if (
file_exists($f_name)) {
    
$fh=fopen($f_name,"a+");
    
flock($fh,LOCK_EX);
    
fseek($fh,0);
    while (!
feof($fh)) $file=fread($fh,4096);
    
$file=explode(","$file);
    if (
$_POST['item']>=and $_POST['item']<count($file)) $file[$_POST['item']]+=1;
    
$file=implode(",",$file);
    
ftruncate($fh,0);
    
fwrite($fh,$file);
    
flock($fh,LOCK_UN);
    
fclose($fh);

    
$file_ip.=$ip.',';
    
fwrite($fh_ip,$ip.',');
    
$message="<b>Ваш голос учтен!</b><br>";
 }
 
$view_res=1;
 
flock($fh_ip,LOCK_UN);
 
fclose($fh_ip);
}

if (
$view_res==1) {
 
$f_name="vote".$_POST['id'].".txt";
    if (
file_exists($f_name)) {
    
$fh=fopen($f_name,"a+");
    
flock($fh,LOCK_EX);
    
fseek($fh,0);
    while (!
feof($fh)) $file=fread($fh,4096);
    
flock($fh,LOCK_UN);
    
fclose($fh);
    
$file=explode(","$file);
    
$summ=0;
    for (
$n=0$n<count($file); $n++) $summ+=$file[$n];
    if (
$summ==0$summ=1;
    for (
$n=0$n<count($file); $n++) $file[$n]=' - <b>'.$file[$n].
    
'</b> ('.round(($file[$n]*100/$summ), 2).'%)';
 }
}

echo 
'<form method="POST" style="margin:0 0 0 35px;">Как Вам данная тема?
    <input type="hidden" name="id" value="1">'
;
echo 
'<table><tr><td><input type="radio" name="item" value="0" checked>
    Отлично</td><td>'
.$file[0].'</td></tr>';
echo 
'<tr><td><input type="radio" name="item" value="1">Нормально</td><td>'.
    
$file[1].'</td></tr>';
echo 
'<tr><td><input type="radio" name="item" value="2">Сойдет</td><td>'.
    
$file[2].'</td></tr>';
echo 
'<tr><td><input type="radio" name="item" value="3">Так себе</td><td>'.
    
$file[3].'</td></tr>';
echo 
'<tr><td><input type="radio" name="item" value="4">Ужасно</td><td>'.
    
$file[4].'</td></tr>';
echo 
'<tr><td colspan="2"><input type="submit" name="view_res" value="Результат">
    <input type="submit" name="vote" value="Голосовать">'
;
echo 
'</td></tr></table>'.$message.'</form>';
?>

Обращаем Ваше внимание на то, что для работы скрипта голосования, необходимо предварительно создать файл, содержащий начальные значения для каждого из вариантов ответов. Т.е., для голосования с id=1, необходимо создать файл vote1.txt, в котором будет содержаться 0,0,0,0,0 (если предполагается, что ответов будет всего пять). Файл с IP адресами, принявшими участие в данном голосовании, будет создан автоматически (vote1_ip.txt).


На первый взгляд, предлагаемый скрипт немного больше, чем имеющиеся в сети аналогичные, но в данном скрипте, как писалось ранее, есть некоторые преимущества:


Таким образом, просто добавив выше приведенный PHP код на свою страничку, и создав в корневой папке сайта файл vote1.txt, содержащий начальные значения для каждого варианта ответа, Вы получите готовый скрипт голосования.

Дата создания: 17:44:11 01.12.2013 г.
Посещений: 26339 раз(а).

Комментарии посетителей (34 шт.):
dolos
4
# 1653
(16:43:18  08.05.2014 г.)

Ничего. Есть ли такое только с базой данных?
Ответить

Administrator
0
# 1725
(14:49:41  14.06.2014 г.)

Ответить

Дмитрий
3
# 2023
(11:52:41  08.11.2014 г.)

А если я данный скрипт хочу поставить на CMS WP я смогу это сделать, и вывести его в виджетах, если да то можете более подробно написать, куда нужно поместить данный php файл и как его вывести в виджетах WP, заранее спасибо, жду ответа.
Ответить

Administrator
1
# 2024
(17:06:22  08.11.2014 г.)

Вам с данным вопросом лучше обратиться к людям, которые работали с WP, они подскажут, как лучше подключить данный скрипт.
Ответить

Василий
0
# 2148
(17:28:02  20.12.2014 г.)

Привет! А можно ли сделать так, чтобы при просмотре результатов голосования вся страница не перезагружалась, а только сама форма? Или это надо полностью переписывать код?
Ответить

Administrator
1
# 2149
(17:48:24  20.12.2014 г.)

Можно, но тогда потребуется подключать библиотеку jQuery. Предлагаю Вам обратить внимание на другую нашу тему - скрипт опросов на PHP и MySQLi.
Ответить

Вячеслав
0
# 2507
(15:04:11  03.06.2015 г.)

А как сделать несколько опросов на одной странице?
Ответить

Administrator
1
# 2509
(22:27:47  03.06.2015 г.)

Просто добавьте еще несколько форм с вопросами (начинается с echo '<form method="POST"...) с уникальными id.
Ответить

Сергей
0
# 3640
(11:49:32  27.12.2016 г.)

Как я понял, id меняется в <input type="hidden" name="id" value="2"> в атрибуте value. Но результаты все равно выводятся из первого опросника, при том, что в файлы vote...txt и vote..._id.txt создаются и записываются. Подскажите, что может быть не так?
Ответить

Игорь
-1
# 3920
(11:41:10  23.05.2017 г.)

Поддерживаю вопрос с толкнулся с тем же, делая несколько опросов на страничке с своим id, результат выводится по последнему нажатому.
Ответить

Иван
-2
# 2601
(22:33:52  27.07.2015 г.)

А возможно отключить голосование по IP адресу?
Ответить

Administrator
1
# 2602
(22:48:37  27.07.2015 г.)

Возможно, но для этого придется удалить часть кода. Я бы не рекомендовал этого делать, т.к. в таком случае один и тот же посетитель сможет оставлять неограниченное количество голосов, что повлечет за собой искажение реального мнения аудитории сайта.
Ответить

александр
0
# 3247
(23:37:08  29.05.2016 г.)

Я всё сделал как описано, но скрипт не работает и ничего не записывается в vote1.txt, пожалуйста подскажите в чём проблема, может мне надо что-нибудь изменить/добавить в скрипт?

И насчёт vote1.txt я правильно понял, что в файл надо написать только "0,0,0,0,0"?
Ответить

Administrator
2
# 3248
(23:47:55  29.05.2016 г.)

Скрипт рабочий и не раз проверялся. Скопируйте код заново, возможно, Вы что-то в нем изменили.
0,0,0,0,0 нужно прописывать, если у Вас будет пять вариантов ответа.
Ответить

Вадим
0
# 3250
(23:42:21  30.05.2016 г.)

А можно ли этот опрос распространить на несколько страниц одновременно с учётом того, что страницы находятся в разных папках?
Просто когда я запускаю этот скрипт в одной папке, а файл vote1.txt находится в другой, то скрипт не работает т.е. не записывает данные в этот файл.
Ответить

Administrator
1
# 3251
(00:10:33  31.05.2016 г.)

Как вариант, поместите файл vote1.txt в корневую папку сайта и пропишите путь к нему в переменных $f_name (в двух местах) и $f_ip:
$f_name=$_SERVER["DOCUMENT_ROOT"]."vote".$_POST['id'].".txt";
$f_ip=$_SERVER["DOCUMENT_ROOT"]."vote".$_POST['id']."_ip.txt";
Ответить

Муким
0
# 3276
(21:05:28  18.06.2016 г.)

Скрипт у меня что-то не правильно работает. На сервере много ошибок появляется. Можете сказать с чем это связанно?
Ответить

Administrator
0
# 3277
(21:47:26  18.06.2016 г.)

Какие ошибки? Вы бы хоть для примера привели, что за ошибки и что не работает. Попробуйте в самом начале добавить error_reporting(0);
Ответить

Вадим
0
# 3282
(13:29:57  22.06.2016 г.)

Здравствуйте, у меня Ваш скрипт тоже не работает, ничего не записывает в файлы, создавать то он создает, но в них ничего нет и не читает с файла, где стоят 0,0,0,0,0...Не знаю почему, и еще с кодировкой беда, русские буквы не отображаются.
Ответить

Administrator
0
# 3284
(20:51:32  23.06.2016 г.)

Странно, проверил - все работает. Видать проблема в Вашем хостинге. На этой же страничке данный скрипт работает и в голосование приняло участие уже более 1300 человек.
Ответить

Александр
0
# 3308
(12:50:42  05.07.2016 г.)

Добрый день. Скрипт работает просто отлично.
Подскажите, пожалуйста, как на одной страничке сделать несколько вопросов так, чтобы было не к каждому вопросу кнопка голосовать, а ко всем вопросам сразу?
Ответить

Administrator
0
# 3309
(20:08:48  05.07.2016 г.)

Поместите все опросы внутрь одной формы с одной кнопкой. Но я бы не стал так делать, т.к. это усложнит разбор отправленных результатов.
Ответить

Дмитрий
0
# 3524
(17:29:30  25.10.2016 г.)

Создал страницу с голосованием (путём открытия кода этой страницы и копирования нужного мне участка кода), прицепил к ней скрипт. После нажатия кнопки "Голосовать" выводит страницу с текстом скрипта. В чём моя ошибка?
Ответить

Administrator
0
# 3525
(17:44:51  25.10.2016 г.)

Не нужно открывать код данной страницы и копировать оттуда участки кода. Скопируйте код из темы и выполните все действия, указанные в теме. PHP код не должно быть видно в браузере, т.к. он выполняется на сервере, а в браузер отдаются уже результаты его выполнения.
Ответить

Дмитрий
0
# 3526
(09:14:58  26.10.2016 г.)

Пробовал. Он корректно выводит только радиокнопки. Весь текст скрипта на странице теперь сразу, а не после нажатия кнопки. В чём может быть причина?
P.S. Другие php-скрипты на сайте подключены и работают (правда, не мной подключены были, поэтому и не знаю, как правильно заставить их работать).
Ответить

Максим
0
# 3765
(13:09:26  03.03.2017 г.)

Здравствуйте!
Код понравился!
Есть возможность доделать код, чтобы было несколько вопросов с вариантами ответов, и голосование с результатом можно было выбрать после всех отвеченных вопросов?
Ответить

Игорь
0
# 3919
(11:34:48  23.05.2017 г.)

Один опрос на страничке работает отлично. Но если поставить два и более, то после нажатия кнопки Результат, результаты меняются по последнему нажатому опросу.
Ответить

Игорь
0
# 4085
(17:09:48  02.10.2017 г.)

Подскажите, пожалуйста! Как вытащить только проценты, в отдельное место?
За ранние Благодарен!
Ответить

Administrator
1
# 4086
(18:16:57  02.10.2017 г.)

Только проценты и никакого текста? Тогда можно обойтись таким кодом:
$id_test=1;
$summ=0;
$f_name="vote".$id_test.".txt";
if (file_exists($f_name)) {
$fh=fopen($f_name,"a+");
flock($fh,LOCK_EX);
fseek($fh,0);
while (!feof($fh)) $file=fread($fh,4096);
flock($fh,LOCK_UN);
fclose($fh);
$file=explode(",", $file);
for ($n=0; $n<count($file); $n++) $summ+=$file[$n];
if ($summ==0) $summ=1;
for ($n=0; $n<count($file); $n++) $file[$n]=round(($file[$n]*100/$summ), 2).'%';
}
Где $id_test - номер теста, проценты которого требуется получить.
Ответить

Дмитрий
0
# 4208
(02:41:29  28.12.2017 г.)

Подскажите почему в файл записывается только последний голос и не суммируется общее количество голосов?
Ответить

Administrator
-1
# 4210
(13:40:44  30.12.2017 г.)

Вероятно Вы проверяете работу скрипта с одного IP адреса. А в файле с IP адресами сколько записей?
Ответить

Алексей
0
# 4634
(23:35:41  15.04.2020 г.)

Админ еще тут отвечает? Как сделать добавление через админку, точнее как ее сделать? Чтобы добавлять визуально, а не редактировать в файлах, как дела с php7?
Ответить

Александр
0
# 5007
(21:49:59  11.10.2023 г.)

Здравствуйте. Пробовал скрипт посещения без mysql не работает. Пробую этот не работает. Что только не делаю не работает. Засыпает разными ошибками и ничего больше. Создал папку в опен сервере vote.u в ней index.php, и тут же файл vote1.txt, там основные теги html и за тем сам код с вашей страницы и вот результат Parse error: syntax error, unexpected T_STRING in E:\OpenServer\domains\vote.u\index.php on line 20 Что делать куда рыть? Было бы не плохо если бы вы под вашими вариантами укладывали архив с рабочим готовым вариантом, а то так рукожопиш а толку мало. Так взял бы архив и сразу было бы понятно, что вы хотели донести до нубов вроде меня, а со страницы берёшь и начинается танец с бубном протяжённостью в несколько часов и результат 0 с дыркой.
Ответить

Александр
0
# 5008
(22:56:50  11.10.2023 г.)

Ещё раз всем приветы. Инфа для незрячих. Для того чтобы скопировать код не нужно выделять его и копировать, так не работает. Нажмите кнопку копировать код и выгрузите jaws или nvda. Код выделяется, но со скринридерами не копируется. Поэтому выгрузив скринридер нажмите комбинацию контрол c, а за тем можете загрузить ваш скринридер. Далее вставить код в нужное место страницы и всё будет работать.
Ответить

Закрыть
Ваше имя:
279 + 18 =
Добавить комментарий:
Ваше имя:
279 + 18 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 5

Какой браузер Вы используете?