Голосование на РНР!
Речь пойдет о практической работе, которую мы
с Вами вместе проведем и усвоим. Голосование - это
средство узнать мнение Ваших посетителей по
разным вопросам. Сами вопросы могут быть как
полезными так и бесполезными - эту тему мы
рассматривать не будем. А для нашего примера
возьмем простой вопрос - Ваше мнение о сайте?
Предположим, у Вас например появилось желание
узнать, что думает большинство посетителей
Вашего сайта. Варианты ответов предоставим
следующие:
1 Круто!
2 Нормально.
3 Мне все равно.
4 Это что-то страшное.
Продолжить список Вы можете уже сами... Для работы
нам понадобится некоторое знание основ HTML, РНР
версии 3 или выше и три файла. Три - потому что в
первом будем спрашивать посетителя о его мнении,
во втором хранить результаты, и в третьем -
выводить их и обрабатывать. Собственно говоря,
нет надобности разносить все эти функции в
разные файлы, но для простоты и удобства мы
сделаем так. Первый файл будет иметь имя index.phtml,
второй - golos.txt и третий - golos.phtml. Создать их для Вас
не составит особого труда, и это то, с чего мы и
начнем. Когда Вы все сделаете и зальете готовые
файлы к себе на сервер, не забудьте установить
атрибуты файла golos.txt таким образом, что бы он был
доступен для записи. Обычно, это атрибуты 666 или
777. Сделать это можно как
правило с помощью Вашего FTP менеджера. Если нет,
воспользуйтесь IE 5.0 и выше в режиме FTP, тогда нужно
просто посмотреть свойства уже залитого на
сервер файла и установить все галочки.
Index.phtml
Вы можете обозвать этот и другие наши файлы так,
как Вам угодно, только не меняйте расширений (кроме,
конечно, txt). Это необходимо для работы РНР, на
котором и будет реализован алгоритм голосования.
Дизайн и оформление предлагаю Вам сделать
самостоятельно, я не буду в статье обращать на
это внимание. Прежде всего сделаем нужную форму.
Можно было бы воспользоваться любым редактором
HTML, они неплохо делают сами формы, но я привожу
уже готовый и работоспособный код.
<FORM METHOD="POST" action="golos.phtml">
<TABLE BORDER=1><TR><TD><TABLE BORDER=0>
<TR><TD>Ваше мнение о сайте?</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=1>Круто!</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=2>Нормально</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=3>Мне все равно</TD></TR>
<TR><TD><INPUT TYPE=radio NAME=answer VALUE=4>Это что-то
страшное!</TD></TR>
<TR><TD><INPUT TYPE=Submit NAME=vote VALUE=" отправить
"></TD></TR>
<TR><TD><INPUT TYPE=Submit NAME=result VALUE=" смотреть
результат
"></TD></TR></TABLE></TD></TR></TABLE></FORM>
Пока это все. Тут нет и строчки кода РНР, но на
будущее полезно иметь возможность вставить сюда
что-то, так что расширение файла выбрано
правильно, тем более что оно больше ни на что не
влияет. В коде все просто, и сделать подобное или
похожее легко в любом редакторе. Мы просто
предлагаем указать с помощью переключателя
нужный вариант ответа и нажать на кнопку
Отправить. Этот
код можно легко интегрировать в любые странички
и править так, как только вздумается. Только
нужно обращать внимание на соответствие имен и
значений переменной в форме. И что самое главное -
данные формы должны передаваться в скрипт РНР с
обработкой результатов, поэтому имя файла в action
должно соответствовать имени файла с скриптом.
Напомню, все имена форм, присвоенные в этом файле,
станут соответствующими переменными в скрипте
РНР, куда отправляются данные формы. Так как тут
ничего сложного больше не предвидится, пойдем
дальше.
Golos.txt
Здесь надо определиться, в каком формате мы будем
хранить вводимую информацию. Проще всего
организовать четыре строки (по количеству
вариантов ответов) и считать их номера
соответствующими номеру выбранного варианта
ответа. Все это безобразие можно считывать с
помощью команды РНР ввода файла в массив, при
этом не забывайте, что массив всегда начинается с
индекса ноль. Соответственно - первая строка
нашего файла не будет использована, и ввести туда
можно все что угодно. Например - информацию о
файле: Результаты голосования. Если это сделано,
введите еще четыре строки с нулями. Не забывайте
нажимать ввод для перевода
строки. Это - готовые результаты (пока только
начальные) нашего голосования. Так как пока никто
не проголосовал :-) они нулевые.
Golos.phtml
Вот и дошли мы до самого главного и интересного. С
самого начала я приведу весь код скрипта, а
дальше дам пояснения в его применении и работе.
<?php
$file = "golos.txt";
$a = file($file);
$i = 1; $fi = Count($a);
$n = 0;
while ($i <= $fi):
$a[$i] = trim(str_replace ("n","", $a[$i]));
$n = $n+$a[$i];
$i++;
endwhile;
if ($answer != "") {
echo "<br>Спасибо, Ваше мнение учтено:";
$a[$answer]++; $n++;
$rez = "Результаты голосования!n".$a[1].
"n".$a[2]."n".$a[3]."n".$a[4];
$fp = @fopen($file,"w");
if ($fp) { $counter=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><br>Всего проголосовало: ".$n;
?>
Опять же хочу предупредить, что код не самый
лучший и простой, но зато логичный и
работоспособный. Вариантов реализации масса, но
мне не хотелось брать что-то уже готовое, и
поэтому я, не особо заботясь об удобочитаемости и
дизайне (это Вы и сами можете сделать :-), написал
свой собственный код, что заняло вместе с
настройкой и отладкой буквально полчаса. Скрипт
ориентирован на конкретно поставленную задачу,
но Вам ничего не стоит переделать его под свое
количество ответов на вопрос. Напомню - наша
главная задача на практическом примере
научиться создавать свои собственные системы
опроса и голосования. Теперь о том,
как все работает.В первых строчках мы
определяемся с именем файла результатов и
считываем результаты голосования в массив
данных с именем $a. Дальше идет цикл, в котором мы
обрабатываем полученный массив таким образом,
что бы он не содержал символов перевода каретки (ввод
строки) и пробелов: $a[$i] = trim(str_replace ("n","",
$a[$i])); Параллельно ведем подсчет количества
проголосовавших, что не сложно так как это просто
сумма значений нашего массива. Удалять символы
ввода и пробела необходимо для преобразования
считанных данных из символьной строки в целое
число. Это можно сделать разными методами, но в
этом случае просто удаляются символы "n" (что
в РНР соответствует переводу строки) и
обрезаются пробелы с начала и с конца строки
функцией trim ( ). Результаты заносятся обратно в
массив, но уже в виде целочисленного значения,
которое можно сложить, увеличить, делить и т.д.
Нас будет интересовать увеличение на единицу
определенного элемента массива, номер которого (его
индекс) хранится в
переменной $answer, которая в свою очередь, пришла к
нам по наследству из формы.
После обработки полученного массива скрипт
должен принять решение относительно выбранного
посетителем режима - или просто показать
результаты, или добавить голос в соответствующую
позицию. Достигается это проверкой переменной
$answer, в которой сохраняется значение выбранного
посетителем сайта варианта голосования. Если эта
переменная пуста, значит была нажата кнопка
показа результатов, и скрипт пропустит блок
подсчета голоса. Если переменная $answer не пуста, в
ней содержится номер выбранного варианта
голосования, а значит, мы можем просто увеличить
на единицу значение нужной ячейки массива:
$a[$answer]++; Кроме того
нужно увеличить значение количества
проголосовавших для того, что бы учесть голос
только что проголосовавшего человека.
Когда нужная ячейка массива увеличена, пришла
пора записать результаты в файл. Для этого
сначала открывается соединение с файлом: $fp =
fopen($file,"w"); Символ w указывает на
необходимость очистки содержимого файла перед
записью. Если соединение не установлено,
выводится сообщение об ошибке, если установлено -
предварительно отформатированное значение
переменной $rez записывается в файл. Переменная $rez
формируется следующим образом: значение всех
ячеек массива (кроме самой первой - нулевой,
которая не используется) склеивается таким
образом, что бы разделителем был символ перевода
строки. Это позволит в дальнейшем корректно
считать полученный таки образом файл. Для
склейки строк в РНР применяется разделитель -
точка. Обратите внимание, что наш массив из
целочисленного перешел в разряд символьных, и
может использоваться и обрабатываться любым
доступным РНР способом.
И наконец - пришла пора вывести результаты на
экран. Не нужно забывать о переводе строки в HTML,
что несколько иное, чем в РНР. Делается это
простым выводом на экран (а значит и в код HTML) тега
<BR>. Когда отформатированные результаты
выведены, скрипт заканчивает свою работу. Этот
блок можно организовать тоже по-разному, а
примененный тут метод самый простой. Лучше всего
вложить результаты и пункты в табличку, тогда
выведенная информация будет смотреться более
красиво. Если Вы обратили внимание, эта часть
скрипта выполняется в любом случае, как и
считывание данных из файла. Таким образом
достигается гарантированный вывод результатов
на экран.
Вот и вся работа. Надеюсь, что Вы теперь без труда
сможете организовывать опросы своих посетителей
на различные темы. Кроме того, голосование можно
оснастить другими полезными функциями –
например, подсчетом процентного соотношения
голосов, графическим представлением результатов,
памятью на IP опрошенного, чтобы дважды не
голосовали. Да мало ли… Только тут придется Вам
проявить собственную фантазию и знание
элементарной алгебры (вот где оно аукнулось :-). А
узнать более подробно о функциях и операторах
РНР Вы всегда сможете в Интернете. Например тут: //virtual.brest.by/phpї
Если Вы хотите посмотреть в Интернете на
рабочий пример голосования - воспользуйтесь
адресом //virtual.brest.byї
- на похожем алгоритме там реализован опрос
мнения посетителей. Кроме того, там Вы так же
найдете пример голосования с графическим
выводом результатов. Если возникнут затруднения
или вопросы, с большим удовольствием отвечу Вам
по электронной почте.
Андрей Кухарчик @ июнь 2001
//virtual.brest.by/php/ ( http://webscript.ru///virtual.brest.by/php/ ) virtualphp@tut.by( mailto:virtualphp@tut.by )
|