Поиск

Каковы результаты опроса?

Каждый хочет быть кем-то. Каждый хочет знать, что с его мнением считаются, и — что тоже важно — каждый хочет знать, насколько его мнение соответствует мнениям других. Для этого и проводятся опросы.

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

Файл помешается в каталог на Web-сервере и к его имени добавляется расширение .txt. Содержимое файла выглядит примерно так, как показано ниже, причем в нем не должно быть никаких других знаков препинания или пустых строк.

Первая программа ищет в этом каталоге файл с расширением .txt, выбирая последний, если там есть несколько файлов, и отображает вопросы в виде анкеты, как показано на рис. 24.3.

Преимушество использования простого текстового файла состоит в том, что CGI-программа может его использовать для отображения вопросов, а затем и ответов. Если вы хотите составить новый опрос, то просто поместите еще один .txt-файл в тот же каталог, и тогда CGI-программа начнет использовать его автоматически. Все операции выполняются автоматически без вашего участия.

Когда пользователь выбирает вариант ответа и щелкает на кнопке подачи запроса (Submit), запускается вторая CGI-программа, которая записывает данные опроса в файл, находящийся в том же каталоге, что и вопросы. Если файл вопросов называется foo.txt, то ответы сохраняются в файле с именем foo.answer. Когда CGI-программа закончит запись ответа, она перечитывает все ответы и отображает результаты.

Часть I: постановка вопросов

Ставить вопросы в данном опросе совсем несложно. Самое сложное — это просмотреть каталог, где хранится информация об опросе, и найти в нем последний файл с расширением ,txt. На самом деле, поскольку данный файл нужно найти обеим программам — задающей вопрос и записывающей результаты, — имеет смысл написать этот фрагмент в виде повторно используемой функции, которую можно применить и в том, и в другом случае.

Проведем анализ программы.

  • Строка 6. В переменной $survey_dir задается имя каталога, где должны находиться файлы опроса. Чтобы создать новый опрос, вы можете просто поместить текстовый файл с расширением .txtв этот каталог, как было описано в начале данного раздела. Этот каталог должен быть доступным для записи процессам Web-сервера. Доступность для записи обычно означает наличие у пользователя прав доступа 0755 в системе UNIX или разрешение на запись в данный каталог для учетной записи guest в системе Windows NT.
  • Строка 8. Функции find_last file{) в качестве параметра передается расширение файла (либо . txt, либо .answer). Она находит в каталоге $survey_ dir последний по алфавиту файл заданного типа. Эта функция общего назначения впоследствии используется функцией get file_contents( ), а также программой записи результатов опроса, которую мы рассмотрим в следующем разделе. Если в данном каталоге нет файлов такого типа, то функция find_last_file(} возвращает значение. undef.
  • Строка 20. Функции get_file_contents(} в качестве параметра также передается расширение файла (опять-таки .txtлибо .answer). Она возвращает содержимое последнего файла указанного типа из каталога опроса. Чтобы найти имя этого файла, она вызывает функцию find last file().

Оставшаяся часть программы, приведенная в листинге 24.5, достаточно проста.

ОСНОВНОЙ КОД программы начинается со строки 36. Содержимое последнего .txt - файла загружается в переменную $questionдля первой строки и в ianswers — для остальной части файла функцией get file contents!).

В строке 40 вы должны изменить путь /cgi/writesurvey.cgi к CGI-программе записи данных опроса.

Далее выводится заголовок анкеты и ее вопросы посылаются броузеру. Каждая строка в массиве ^answers оформляется в виде переключателя. Первой по порядку кнопке переключателя присваивается 0, второй — 1 и т.д. до тех пор, пока в массиве ^answers не останется ни одноговарианта ответа. Тело анкеты будет выглядеть примерно так:

После того как пользователь выберет вариант ответа и щелкнет на кнопке подачи запроса, CGI-программе будет передан параметр answer, содержащий номер ответа. CGI-программа /cgi/writesurvey.cgi, обрабатывающая данные формы (полный путь к ней задается в строке 40), запишет ответы в файл. Эта программа рассматривается в следующем разделе.

Часть II: анализ результатов

После того как пользователь щелкнет на кнопке подачи запроса (Submit), начинается настоящая работа. Ответ пользователя (т.е. выбранный им вариант) необходимо записать в файл, а результаты — свести в таблицу, а затем отобразить.

Программа, листинг которой приведен ниже, кажется довольно длинной, но на самом деле большую ее часть составляют подпрограммы, с которыми вы уже встречались. Подпрограммы блокирования файлов get _lock{) и release _lock{), которые использовались на протяжении всей книги, и подпрограммы get file contentsU и find_last_file() из программы отображения опроса также вносят сушественный вклад в увеличение размера данной CGI-программы.

Начало кода программы обработки опроса приведено в листинге 24.6. Повторяю еще раз: пусть ее размер вас не пугает, так как большая часть этой программы вам уже знакома.

5

Пока все в листинге 24.6 должно быть вам понятно и знакомо. Используемые здесь подпрограммы либо взяты из предыдущей программы, как, например, get_file_contents() и find last file(), либо это подпрограммы get_lock() и release_lock(). И опять-таки проверьте, Что Web-сервер может осуществлять запись в каталог, имя которого указанно в переменной $survey_dir).

И поскольку здесь все просто, давайте перейдем к продолжению программы, приведенному в листинге 24.7.

Основная программа начинается со строки 46. В этой строке данные текущего опроса сохраняются в переменных $question и @poss_ answers.

Начиная со строки 50 программа проверяет, дал ли пользователь ответы на вопросы. Не забывайте, что пользователь может просто щелкнуть на кнопке подачи запроса без выбора варианта ответа. Если ответ дан, то в строке 53 выполняется блокировка с помощью функции get lock (), чтобы файл результатов мог в одно и то же время обновлять только один человек (а никак не несколько!).

В строке 56 находится последний в каталоге .txt-файл опроса — скажем, first.txt. Его расширение .txt меняется на .answer, т.е. в итоге получается имя файла first.answer. Далее этот файл открывается для записи, в него вносятся данные текущего опроса, а затем с помощью функции release_lock{ )c файла снимается блокировка. Теперь в него могут спокойно вносить данные другие пользователи.

В строке 66 функция get_file_contents() используется для получения результатов опроса. Создается хэш с именем %results; его ключами являются номера ответов — 0, 1, 2 и т.д., а значениями — количество случаев появления каждого ответа.

Начиная со строки 74 выполняется вывод ответов. Если в хэше %results нет элемента, соответствующего данному конкретному ответу, то результату присваивается значение 0. Сам ответ и количество случаев его появления выводятся в строке 76.

И это все. На рис. 24.4 показаны данные результатов опроса. Если вы хотите улучшить их внешний вид, то можете сделать так, чтобы CGI-программа отображала ответы (и результаты) в виде разноцветных таблиц и со всеми другими характерными особенностями, благодаря которым HTML-странииы выглядят так красиво и привлекательно.

Вообще говоря, чтобы рассмотренная нами CGI-программа работала, каталог, где хранятся данные опроса (в нашем примере это /web/htdocs/poll), должен
быть доступен для записи всем пользователям. В системе Windows NT можно определить свойства этого каталога так, чтобы он был доступен для записи только учетной записи типа guest. В системе UNIX с помощью команды chmod нужно будет установить для каталога значение прав доступа, равное 0777. Кроме того, если вы запускаете программу опроса из командной строки, то она может создать файл типа .answer, который окажется недоступным для записи Web-серверу. В подобном случае для организации нормальной работы программы составления отчета вам, возможно, придется удалить этот файл.