Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP обучение на примерах - Кухарчик А..pdf
Скачиваний:
139
Добавлен:
24.05.2014
Размер:
24 Мб
Скачать
☆

Голосованиенасайте

125

Голосование на сайте

Голосование — это средство узнать мнение ваших посетителей по разным вопросам. Сами вопросы могут быть как полезными, так и бесполезными, но эту тему мы рассматривать не будем

идля нашего примера возьмем простой вопрос: «Ваше мнение

осайте?» Варианты ответов предоставим следующие:

•Отлично!

•Нормально.

•Мне все равно.

•Это что-то страшное.

Можете сами продолжить список.

Для работы нам понадобятся три файла. В первом файле будем спрашивать посетителя о его мнении, во втором — хранить результаты и в третьем — выводить их и обрабатывать.

Острой необходимости сохранять все эти функции в разные файлы нет, но для простоты и удобства сделаем именно так. Первый файл будет иметь имя index.phtml, второй — golos.txt и третий — golos.phtml (вы, конечно, можете называть свои файлы, как хотите, только расширения должны быть такими, как я указал). Создайте эти три пустых файла.

Файл Index.phtml. Вы можете назвать этот и другие наши файлы так, как вам угодно, только не меняйте расширений. Дизайн и оформление предлагаю вам сделать самостоятельно, я не буду обращать на это внимание.

Прежде всего сделаем форму. Можно воспользоваться любым редактором HTML, они неплохо делают сами формы, но я привожу уже готовый и работоспособный код:

<form method="POST" action="golos.phtml"> <table border="l"><tr><td><table border="0"> <tr><td>Baшe мнение о сайте?</td></tr>

126

 

 

 

Программирование на РНР

<tr><td><input

type="radio"

name="answer"

value="l">

Отлично!</td></tr>

 

 

 

<tr><td><input

type="radio"

name="answer"

value="2">

Hopмaльнo</td></tr>

 

 

 

<tr><td><input

type="radio"

name="answer"

value="3">

Мне все paвнo</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="Cмотреть результат"> </td></tr></tablex/td></tr></table></ form>

Здесь нет ни строчки кода РНР, но мы задали файлу расширение PHTML, чтобы в дальнейшем в этот файл можно было вставить РНР-код. Получилась такая форма (рис. 22).

Рис. 22. Полученная форма для голосования

Голосованиенасайте

127

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

Этот код можно легко вставить на любую страницу и внести в него нужные изменения. И самое главное — данные из формы должны передаваться РНР-скрипту, обрабатывающему результаты, поэтому имя файла, присваиваемое атрибуту action, должно соответствовать имени файла со скриптом.

Все имена форм, присвоенные в этом файле, станут соответствующими переменными в скрипте РНР, в который отправляются данные формы.

Файл golos.txt. В этом файле необходимо определиться, в каком формате мы будем хранить вводимую информацию. Проще всего организовать четыре строки (по количеству вариантов ответов), номера которых будут соответствовать номеру выбранного варианта ответа. Информацию из файла golos.txt можно считывать с помощью команды РНР ввода файла в массив — f i l e ( $ a r r a y ) . Массив всегда начинается с нулевого индекса, поэтому первая строка нашего файла не будет использована и в нее можно ввести все, что угодно, например строку «Результаты голосования».

Далее введите еще четыре строки с нолями. Не забывайте нажимать ввод для перевода строки. Это — результаты (начальные) нашего голосования и, пока никто не проголосовал, они нулевые.

Файл golos.phtml. Мы дошли до самого главного и интересного. Сначала приведу весь код скрипта, а потом поясню его.

1<?php

2$file = "golos.txt";

3$а = file($file) ;

4$i = 1; $fi = count($a) ;

5$n = 0;

6while ($i <= $fi):

7$a[$i] = trim(str_replace ("\n","", $a[$i]));

8$n = $n + $a[$i];

9$i++;

10 endwhile;

128

Программирование на РНР

11 if ($answer != "") {

 

12

echo "<br>Спасибо, Ваше мнение учтено";

13

$a[$answer]++; $n++;

 

14$rez = "Результаты голосования\n".$а[1]. "\n".$а[2]."\n".$а[3]. "\n".$а[4];

15$fp = @fopen($file,"w");

16if ($fp) { $counter = fputs{$fp,$rez); fclose($fp); }

17else { echo "Произошла ошибка записи результатов!"; }

18} else { echo "<br>Результаты голосования"; }

19echo "<br>Отлично! - <b>".$а[1]."</b>";

20echo "<br>Нормально - <b>".$a[2]."</b>";

21echo "<br>Мне все равно - <b>".$a[3]."</b>";

22echo "<br>Это что-то страшное! - <b>".$a[4]."</b>";

23echo "<br><br>Bcero проголосовало: ".$n;

24?>

Этот код не самый лучший и эффективный, зато логичный, простой и работоспособный. Вариантов реализации много, но мне не хотелось использовать что-то готовое, и поэтому я, не особо заботясь о дизайне (это вы и сами можете сделать), написал свой код, что заняло вместе с настройкой и отладкой около получаса.

Скрипт ориентирован на конкретно поставленную задачу, но вам ничего не стоит переделать его для своего количества вариантов ответов на вопрос. Теперь о том, как все работает.

Сначала мы задаем имя файла результатов (строка 2) и считываем результаты голосования в массив данных с именем $а (строка 3). Дальше идет цикл (строки 6—10), в котором мы обрабатываем полученный массив таким образом, чтобы он не содержал символов перевода строки и пробелов (строка 7). Удалять символы ввода и пробела необходимо для преобразования считанных данных из символьной строки в целое число. Это можно сделать разными методами, но в этом случае просто удаляются символы "\n" (что в РНР соответствует переводу строки) и обрезаются пробелы с начала и с конца строки функцией trim (). Результаты заносятся назад в массив, но уже в виде целочисленного значе-

Голосованиенасайте

129

ния, которое можно суммировать, увеличить на единицу, делить и т.д. Нас будет интересовать увеличение на единицу определенного элемента массива, индекс которого хранится в переменной $answer, которая пришла к нам по наследству из формы. Параллельно ведем подсчет количества проголосовавших, что несложно, так как это просто сумма значений нашего массива (строка 8).

После обработки полученного массива скрипт должен принять решение в соответствии с действиями посетителя — или показать результаты, или добавить голос в соответствующую позицию. Достигается это проверкой переменной $answer (строка 11), в которой сохраняется значение выбранного посетителем сайта варианта голосования. Если эта переменная пуста, значит была нажата кнопка показа результатов, и скрипт пропустит блок подсчета голоса (строки 14—16). Если переменная $answer не пуста, в ней содержится номер выбранного варианта голосования, а значит, мы можем просто увеличить на единицу значение нужной ячейки массива (строка 13). Кроме того, нужно увеличить значение количества проголосовавших, чтобы учесть голос только что проголосовавшего человека (строка 13).

Когда нужная ячейка массива увеличена, нужно записать результаты в файл. Для этого сначала открывается соединение с файлом (строка 15). Символ w указывает на необходимость очистки содержимого файла перед записью. Если соединение с файлом установлено, в файл записывается предварительно отформатированное значение переменной $rez (строка 16), а если не установлено — выводится сообщение об ошибке (строка 17).

Переменная $rez формируется следующим образом: значение всех ячеек массива (кроме самой первой — нулевой, которая не используется) объединяется таким образом, чтобы разделителем был символ перевода строки. Это позволит в дальнейшем корректно считать полученный таким образом файл.

Для объединения строк в РНР применяется точка. Обратите внимание, что наш массив из целочисленного перешел в разряд символьных.

Соседние файлы в предмете Программирование