Автор: Владислав Путяк
www.docs.com.ru/
Один из самых частых
вопросов начинающих веб-программистов является вопрос "А как сделать
онлайн голосование?". Очень просто! И даже если сейчас Вам так не кажется,
уверяю Вас, стоит лишь вдумчиво прочитать данную статью, и Вы забудете про
вопросы о голосования раз и навсегда.
Бредисловие: если вдруг Вы
являетесь не новичком в 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
//имя файла с
результатами голосования:
= "golos.dat";
//считываем данные
голосования в массив:
= file();
//инициализируем
переменные:
= 1;
= 0;
//получаем количество элементов в
массиве голосований:
= Count();
//в цикле обрабатываем каждый
элемент массива:
while ( <= ):
//удаляем переносы
строк:
= trim(str_replace ("
","", ));
//считаем
количество голосов:
= +;
++;
endwhile;
//если
был дан голос:
if (!= "")
{
//выводим соотв.
сообщение:
echo "<br>Спасибо, Ваш голос принят";
//увеличиваем
на 1 соотв. пункт голосования:
++;
//и общее количество
голосов:
++;
//подготавливаем данные для записи в
файл:
= "Опрос на сайте - это комментарий в
файле
".."
".."
".."
".;
//открываем файл для
записи:
= @fopen(,"w");
//если успешно:
if
()
{
//записываем данные в файл:
fputs(,); //и
закрываем его:
fclose(); }
//если произошла ошибка:
else {
echo "Ошибка при открытии файла"; }
}
//выводим результаты:
else
{ echo "<br>Результаты голосования"; }
echo "<br>Супер! —
<b>".."</b>";
echo "<br>Хорошо —
<b>".."</b>";
echo "<br>Нормально —
<b>".."</b>";
echo "<br>Слабо —
<b>".."</b>";
echo "<br>Лажа! —
<b>".."</b>";
echo "<br><br>Всего голосов:
".;
?>
Сразу скажу, что данный
скрипт я нашел в кодах одного из моих знакомых, считающего себя большим
спецом. Данный скрипт стоит у него на сайте.
Ну что же. Вот и все!
Вы уже побежали ставить себе на сайт голосование? А зря! Ведь данный код
лишь демонстрация алгоритма, слабого алгоритма, я уже молчу про
возможности самого кода. Он даже не сможет обеспечить надежной работы -
при большом количестве обращений файл голосований будет периодически
обнуляться. Или, например, у нас нет абсолютно никакой защиты от
многократных голосований - один человек может голосовать столько раз,
сколько ему захочется. Я уже молчу про недоработанный алгоритм скрипта -
посмотрите в первой части мы очень неплохо используем цикл, который не
зависит от количества пунктов голосования, а вот при выводе результатов -
мы жестко привязаны к этому числу. А вывод результатов? Куда это
годиться...
В общем, продолжать перечислять недостатки скрипта
можно долго.