div.main {margin-left: 20pt; margin-right: 20pt}
Голосование на
РНР!
Речь пойдет о практической работе, которую
мы с Вами вместе проведем и усвоим. Голосование — это средство узнать мнение
Ваших посетителей по разным вопросам. Сами вопросы могут быть как полезными,
так и бесполезными — эту тему мы рассматривать не будем. А для нашего примера
возьмем простой вопрос: Ваше мнение о сайте? Предположим, у Вас появилось
желание узнать, что думает большинство посетителей Вашего сайта. Варианты
ответов предоставим следующие: 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 опрошенного, чтобы дважды не голосовали. Да мало ли... Только
тут придется проявить собственную фантазию и знание элементарной алгебры (вот
где оно аукнулось:-). А узнать более подробно о функциях и операторах РНР Вы
всегда сможете в Интернете. Например, тут: http://virtual.bresttelecom.by/php.
Если Вы хотите посмотреть в Интернете на рабочий пример голосования —
воспользуйтесь адресом http://virtual.bresttelecom.by/
— на похожем алгоритме там реализован опрос мнения посетителей. Кроме того,
там Вы также найдете пример голосования с графическим выводом результатов.
Если возникнут затруднения или вопросы, с большим удовольствием отвечу Вам по
электронной почте.
Андрей Кухарчик @ июнь 2001 virtualbrest@tut.by
|