Голосование на PHP своими руками

Один из самых частых вопросов начинающих веб-программистов является вопрос «А как сделать онлайн голосование?». Очень просто! И даже если сейчас Вам так не кажется, уверяю Вас, стоит лишь вдумчиво прочитать данную статью, и Вы забудете про вопросы о голосования раз и навсегда.

Предисловие: если вдруг Вы являетесь не новичком в PHP, советую не кидать статью дочитав до середины, чертыхаясь на автора, а прочитать данный небольшой материальчик полностью.

Для начала давайте определимся, что нам нужно для создания голосования.

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

Местом для хранения данных спокойно может быть обычный файл. Чего-то не хватает? Ах, да! Нам же нужно еще отображать результаты голосования. Эту функцию можно спокойно исполнить в нашем едином скрипте.

Ну что же, приступим. Начнем, конечно же, с формы для отображения пунктов голосования и передачи данных на сервер. В нем нет ничего сложного:

<FORM METHOD="POST" action="golos.php">
<TABLE BORDER=1><TR><TD>
<TABLE>
<TR><TD>Как Вам мой сайт?</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=otvet VALUE=1>Супер!</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=otvet VALUE=2>Хорошо</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=otvet VALUE=3>Нормально</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=otvet VALUE=4>Слабо</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=otvet VALUE=5>Лажа!</TD></TR>
<TR><TD>
<INPUT TYPE=Submit NAME=golos VALUE="Голосовать">
<INPUT TYPE=Submit NAME=result VALUE="Результаты">
</TD></TR>
</TABLE>
</TD></TR></TABLE>
</FORM>

Как Вы видите, обычная форма, которая передает данные методом POST скрипту golos.php, имеется 5 вариантов ответа, кнопка Голосовать — для голосования и Результаты — просмотр результатов голосования без участия в самом голосовании.

Что дальше? Скрипт? Нет, в начале нужно определиться как мы будим хранить данные. Первое что приходит в голову — в каждой строчке по значению. Довольно удобно — все сразу можно считать в массив. Однако, не стоит забывать что при этом первая строка примет индекс 0 — тут начинающие программисты часто путаются. Я советую не использовать первую строку для хранения результатов голосования, а написать там какой-нибудь комментарий, например, что это файл для хранения результатов такого-то голосования.

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

<?php
//имя файла с результатами голосования:
$file = "golos.dat";
//считываем данные голосования в массив:
$a = file($file);
//инициализируем переменные:
$i = 1;
$n = 0;
//получаем количество элементов в массиве голосований:
$fi = Count($a);
//в цикле обрабатываем каждый элемент массива:
while ($i <= $fi):
//удаляем переносы строк:
$a[$i] = trim(str_replace ("n","", $a[$i]));
//считаем количество голосов:
$n = $n+$a[$i];
$i++;
endwhile;

//если был дан голос:
if ($otvet!= "")
{
   //выводим соотв. сообщение:
   echo "<br>Спасибо, Ваш голос принят";
   //увеличиваем на 1 соотв. пункт голосования:
   $a[$otvet]++;
   //и общее количество голосов:
   $n++;

   //подготавливаем данные для записи в файл:
   $rez = "Опрос на сайте - это комментарий в файлеn".$a[1]."n".$a[2]."n".$a[3]."n".$a[4];
   //открываем файл для записи:
   $fp = @fopen($file,"w");
   //если успешно:
   if ($fp)
   {
      //записываем данные в файл:
      fputs($fp,$rez); //и закрываем его:
      fclose($fp); }
      //если произошла ошибка:
      else { echo "Ошибка при открытии файла"; }
}
//выводим результаты:
else { echo "<br>Результаты голосования"; }
echo "<br>Супер! — <b>".$a[1]."</b>";
echo "<br>Хорошо — <b>".$a[2]."</b>";
echo "<br>Нормально — <b>".$a[3]."</b>";
echo "<br>Слабо — <b>".$a[4]."</b>";
echo "<br>Лажа! — <b>".$a[5]."</b>";
echo "<br><br>Всего голосов: ".$n;
?>

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

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

Я уже молчу про недоработанный алгоритм скрипта — посмотрите в первой части мы очень неплохо используем цикл, который не зависит от количества пунктов голосования, а вот при выводе результатов — мы жестко привязаны к этому числу. А вывод результатов? Куда это годиться…

В общем, продолжать перечислять недостатки скрипта можно долго.

Подписывайтесь на наши группы в социальных сетях
Подписаться
Уведомить о
7 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
diman

$resvn = mysql_query ("SELECT ip FROM ddb_vote WHERE ip='$logon'");
$rowvn = mysql_fetch_array($resvn);
$temprow = $rowvn['ip'];
if ($temprow)
{
echo "
<div style="color:red;font-size:13pt;">Вы уже проголосовали</div>
<div style
";
}ELSE{

Фантом

@petkr: по сути твоего вопроса: голоса не учитываются, так как не выполняется условие if ($otvet!= ""). Говорить как нужно и почему условие не выполняется я не буду, ибо так думать и анализировать вы точно не научитесь а это важно! В общем удачи, подсказка довольно весомая, можно даже сказать носом ткнула, где косяк )

Set
6 лет назад
Ответить на  Фантом

у меня так получилось, голосование на 2 значения if ($otvet= "1" or $otvet= "2")

petkr

Блин...почему у меня голоса не учитываютя???((((
голосую, а голоса не учитываются!!!

Данил

@FAP:
используй куки оч просто и эфективно. ели это голосование не очень очень важное то ни кто ради этого куки чистить не будет

Creator

Уважаемый FAP, пожалуйста используйте форум для решения вопрос, которые могут возникнуть при прочтении той или иной статьи.

FAP

Блин одна и та же статья по всему инету.

А мне надо найти инфу по тому как отличить того кто голосовало от того кто не голосовал.