Голосование на РНР.
(окончание в следующих номерах).
Речь пойдет о практической работе, которую мы с Вами вместе проведем и усвоим.
Голосование - это средство узнать мнение Ваших посетителей по разным вопросам.
Сами вопросы могут быть как полезными так и бесполезными - эту тему мы
рассматривать не будем. А для нашего примера возьмем простой вопрос - Ваше
мнение о сайте? Предположим, у Вас например появилось желание узнать, что
думает большинство посетителей Вашего сайта. Варианты ответов предоставим
следующие:
Круто!
Нормально.
Мне все равно.
Это что-то страшное.
Продолжить список Вы можете уже сами... Для работы нам понадобится некоторое
знание основ 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>
Пока это все. Тут нет и строчки кода РНР, но на будущее полезно иметь
возможность вставить сюда что-то, так что расширение файла выбрано правильно,
тем более что оно больше ни на что не влияет. В коде все просто, и сделать
подобное или похожее легко в любом редакторе. Мы просто предлагаем указать с
помощью переключателя нужный вариант ответа и нажать на кнопку Отправить.
Этот код можно легко интегрировать в любые странички и править так, как только
вздумается. Только нужно обращать внимание на соответствие имен и значений
переменной в форме. И что самое главное - данные формы должны передаваться в
скрипт РНР с обработкой результатов, поэтому имя файла в action должно
соответствовать имени файла с скриптом. Напомню, все имена форм, присвоенные в
этом файле, станут соответствующими переменными в скрипте РНР, куда отправляются
данные формы. Так как тут ничего сложного больше не предвидится, пойдем дальше.
Golos.txt
Здесь надо определиться, в каком формате мы будем хранить вводимую
информацию. Проще всего организовать четыре строки (по количеству вариантов
ответов) и считать их номера соответствующими номеру выбранного варианта ответа.
Все это безобразие можно считывать с помощью команды РНР ввода файла в массив,
при этом не забывайте, что массив всегда начинается с индекса ноль.
Соответственно - первая строка нашего файла не будет использована, и ввести туда
можно все что угодно. Например - информацию о файле: Результаты
голосования. Если это сделано, введите еще четыре строки с нулями. Не
забывайте нажимать ввод для перевода строки. Это - готовые результаты (пока
только начальные) нашего голосования. Так как пока никто не проголосовал :-) они
нулевые.
Golos.phtml
Вот и дошли мы до самого главного и интересного. С самого начала я приведу
весь код скрипта, а дальше дам пояснения в его применении и работе.
Опять же хочу предупредить, что код не самый лучший и простой, но зато
логичный и работоспособный. Вариантов реализации масса, но мне не хотелось брать
что-то уже готовое, и поэтому я, не особо заботясь об удобочитаемости и дизайне
(это Вы и сами можете сделать :-), написал свой собственный код, что заняло
вместе с настройкой и отладкой буквально полчаса. Скрипт ориентирован на
конкретно поставленную задачу, но Вам ничего не стоит переделать его под свое
количество ответов на вопрос. Напомню - наша главная задача на практическом
примере научиться создавать свои собственные системы опроса и голосования.
Теперь о том, как все работает.
В первых строчках мы определяемся с именем файла результатов и считываем
результаты голосования в массив данных с именем $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) тега . Когда отформатированные
результаты выведены, скрипт заканчивает свою работу. Этот блок можно
организовать тоже по-разному, а примененный тут метод самый простой. Лучше всего
вложить результаты и пункты в табличку, тогда выведенная информация будет
смотреться более красиво. Если Вы обратили внимание, эта часть скрипта
выполняется в любом случае, как и считывание данных из файла. Таким образом
достигается гарантированный вывод результатов на экран.
Вот и вся работа. Надеюсь, что Вы теперь без труда сможете организовывать
опросы своих посетителей на различные темы. Кроме того, голосование можно
оснастить другими полезными функциями – например, подсчетом процентного
соотношения голосов, графическим представлением результатов, памятью на IP
опрошенного, чтобы дважды не голосовали. Да мало ли… Только тут придется Вам
проявить собственную фантазию и знание элементарной алгебры (вот где оно
аукнулось :-). А узнать более подробно о функциях и операторах РНР Вы всегда
сможете в Интернете.