This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
УДК ББК Л Рецензент: Петеляк В.Е. – кандидат физико-математических наук, доцент, зав. кафедрой Информатики ГОУ ВПО «Магнитогорский государственный университет»
Измайлов В.Г., Лисьев Г.А. Озерова М.Ю., Трейбач А.Л. Проектирование web-приложений и программных систем в Open Source: учеб. пособие / Под ред. проф. Г.А. Лисьева. – Магнитогорск: МаГУ, 2009. – 96 c.: ил. ISBN В учебном пособии последовательно представлены практические работы, позволяющие самостоятельно и/или под руководством преподавателя построить систему тестирования/опроса на основе web-приложений. В каждой работе даны задания, самостоятельное выполнение которых позволит расширить функционал системы и компетенции студентов. Изложение материала сопровождается большим количеством иллюстраций, в том числе и программными кодами на языках PHP и Java Script. Основание для создания пособия послужили спроектированные и реализованные модули «Автоматизированной системы поддержки научных исследований (АСПНИ)», разрабатываемой в Магнитогорском государственном университете Лабораторией системных исследований, группа Discovery Studio. Пособие ориентирована на студентов очного и заочного отделений, обучающихся по направлениям «Бизнес-информатика», «Прикладная информатика», «Физико-математическое образование (профиль – информатика)».
УДК ББК ISBN Измайлов В.Г., Лисьев Г.А. Озерова М.Ю., Трейбач А.Л., 2009 ГОУ ВПО «Магнитогорский государственный университет», 2009
Содержание ПРЕДИСЛОВИЕ ........................................................................................... 4 ВВОДНЫЙ РАЗДЕЛ..................................................................................... 7 Работа 0-0. Знакомство с возможностями модуля АСПНИ: DS-test ........ 7 Работа 0-1: Система управления контентом (CMS) WordPress.............. 21 РАЗДЕЛ ПРОЕКТИРОВАНИЯ................................................................... 29 Работа 1. Знакомство с инструментами управления СУБД MySQL ...... 29 Работа 2. Подключение к СУБД средствами PHP .................................. 34 Работа 3. Обработка форм....................................................................... 39 Работа 4. Описание структуры анкеты и сохранение структуры анкеты с БД ............................................................................................................ 44 Работа 5. Формирование бланка анкеты................................................. 54 Работа 6. Формирование формы для заполнения анкеты...................... 57 Работа 7. Обработка формы заполненной анкеты .................................. 64 Работа 8. Подсчет процентной статистики по заполненным анкетам.... 70 Работа 9. Построение графиков по статистическим данным ................. 79 Работа 10. Авторизация. Разделение прав пользователей...................... 87 Работа 11. Разработка системы управления проектами ......................... 90
Предисловие Учебное пособие создано по результатам проектирования и программирования модулей «Автоматизированной системы поддержки научных исследований» (АСПНИ) в Магнитогорском государственном университете (МаГУ). Разработка инициирована научными интересами руководителя – проф. Г.А. Лисьева. В процессе реализации проекта решаются научные, организационные технические и дидактические задачи, обусловленные комплексом целей. Научная цель: обеспечение исследователей инструментарием для обработки информации различных типов (структурированной, слабоструктурированной, неструктурированной). Организационная цель: расширение возможностей на факультете информатики и других факультетах (в частности, отделение социологии) МаГУ для совместной работы преподавателей и студентов над научно-техническими проектами. Техническая цель: более эффективно использовать оборудование и программное обеспечение факультета информатики МаГУ. Дидактическая цель: дополнить учебный процесс подготовки IT-специалистов опытно-экспериментальной площадкой; создать возможности для экспериментально-практической работы в обучении специалистов гуманитарных специальностей (педагогика, социология, менеджмент и др., там, где требуется проводить исследования с использованием массовых опросов, анкетирования, экспертной оценки). В течение двух лет для реализации АСПНИ созданием программных модулей, обсуждением идей и результатов, оценкой решений занимались студенты научно-исследовательской группы факультета информатики МаГУ Discovery Studio: Измайлов Вадим, Озерова Мария, Трейбач Анна. В предлагаемой работе (первой в серии) обобщен наш опыт создания одного из модулей системы – DS-test. Ниже приведен список публикаций участников проекта за два года. Пособие состоит из двух частей: Вводный раздел и Раздел проектирования. В первой части описываются возможности DS-test, реализованные в рамках проекта АСПНИ на начало декабря 2009 года (версия 3.0). Также здесь приведена работа по настройке и организации сайта под управлением CMS WordPress. Она необходима для организации web-сервера и активного сайта для размещения учебного модуля в локальной сети. Вторая часть представляет серию работ по проектированию и созданию модуля для проведения опросов и вывода результатов этих опросов. Здесь описываются также особенности работы с СУБД MySQL и создание БД для модуля. Последняя работа второй части – создание системы управления файлами (проектами), которая превращает обычное web-приложение 4
(DS-test) в систему. Распределение работ по созданию пособия: Вадим Измайлов – Работы 1-10, участие в Работе 0-0, дизайн обложки. Мария Озерова – Работа 11. Анна Трейбач – Работа 0-0 и Работа 0-1. Григорий Лисьев – общая редакция и управление проектом. Все мы – идеи, критика, реализация и тестирование. Некоторые публикации по проекту 1. Лисьев Г.А. Автоматизированная система поддержки научных исследований в области экономики образования: опыт проектирования и особенности применения // Открытое образование. - №1. – М.: МЭСИ, 2009. – С. 60 – 66. 2. Лисьев Г.А. Экспертная подсистема автоматизированной системы поддержки научных исследований в области экономики образования // Третья Международная конференция «Системный анализ и информационные технологии» САИТ-2009, Звенигород: Труды конференции. – М.: 2009. – С. 313 – 315. 3. Измайлов В.Г., Озерова М.Ю., Трейбач А.Л. Компьютерная поддержка подготовки социологов и проведения полевых исследований в социологии // "Математика. Компьютер. Образование". Сборник трудов XVI международной конференции. Под общей редакцией Г.Ю. Ризниченко. — Научно-издательский центр "Регулярная и хаотическая динамика". — Ижевск: 2009. 4. Измайлов В.Г., Озерова М.Ю., Трейбач А.Л. Методика «интеллектуальной» обработки социально-экономической информации в автоматизированной системе поддержки научных исследований // "Математика. Компьютер. Образование". Сборник трудов XVI международной конференции. Под общей редакцией Г.Ю. Ризниченко. — Научно-издательский центр "Регулярная и хаотическая динамика". — Ижевск: 2009. 5. Озерова М.Ю. 052.06.01-08.АX Разработка системы информационного обеспечения научного исследования // Конкурс молодежных грантов Правительства Челябинской области 2008 г. 6. Трейбач А.Л. 067.06.01-08.АX Разработка модуля интеллектуальной обработки данных в системе поддержки научных исследований // Конкурс молодежных грантов Правительства Челябинской области 2008 г. 7. Измайлов В.Г. Опыт проектирования и разработки автоматизированной системы поддержки научного исследования для сбора статистической информации //Всероссийская конференция с элементами научной школы для молодежи «Проведение научных исследований в области обработки, хранения, передачи и защиты информации», Россия, Ульяновск: сборник научных трудов. В 4 т. Т.4. – Ульяновск: УлГТУ, 2009. – 598 с. 5
Благодарности: Руководитель и группа DS считают, что АСПНИ не могла реализоваться в текущем виде без: помощи декана факультета Информатики МаГУ проф. Чусавитиной Галины Николаевны в выделении и поддержки физического сервера Dstudios в локальной сети факультета, а также в интернете; заведующего кафедрой информатики МаГУ доц. Владимира Евстахиевича Петеляка, который поддерживает проект организационно и методически (семинары, обсуждения, оценка); доцента кафедры информатики Стащука Петра Владимировича за труд по тестированию модуля DS-test в «боевых» условиях проведения занятий в компьютерных классах факультета; старшего научного сотрудника Институт динамики систем и теории управления Сибирского отделения РАН (ИДСТУ СО РАН) к.т.н. Николайчук Ольги Анатольевны, которая проводит оценку работы модулей на одном из самых «больших» расстояний и задаёт «неудобные» вопросы; студентов отделения социологии исторического факультета МаГУ, которые в весеннем семестре 2009 года оказались перед необходимостью изучения предмета «Анализ данных в социологии» с использованием DS-test. Из замечания и предложения были реализованы в версии 3.0. Руководитель студенческой научно-исследовательской группы Discovery Studio и проекта АСПНИ Проф. Г.А. Лисьев Декабрь 2009 года.
Вводный раздел В данном разделе описываются возможности действующего на момент издания пособия модуля «Автоматизированной системы поддержки научных исследований» (АСПНИ) - DS-test. Также, приводится описание Системы Управления Контентом (Content Management System – CMS), позволяющей создать и поддерживать сайт на web-сервере. РАБОТА 0-0. ЗНАКОМСТВО С ВОЗМОЖНОСТЯМИ МОДУЛЯ АСПНИ: DS-TEST Цель Ознакомиться с возможностями модуля АСПНИ DS-test. Научиться создавать анкеты в модуле, проводить первичную обработку собранной статистической информации. Описание задачи Для достижения цели необходимо: 1. Разработать анкету для проведения социально-экономического исследования. 2. Зарегистрироваться в АСПНИ. 3. Разместить анкету в модуле АСПНИ DS-test. 4. Провести анкетирование. 5. Провести анализ полученных результатов, используя возможности статистической обработки модуля. Алгоритм решения DS-тест – модуль разрабатываемой автоматизированной системы поддержки научных исследований (АСПНИ) в проекте Г.А. Лисьева Discovery Studio. В модуль входит набор инструментов для сбора и первичной обработки неоднородной статистической информации путем анкетирования респондентов. Модуль находится в стадии beta-версии и открыт для тестирования пользователями. Функциональные возможности: Возможность проведения on-line и off-line опроса респондентов. Поддержка нескольких типов вопросов – открытые (ответ в свободном виде), закрытые (выбор вариантов ответа из жестко определенного списка), открыто-закрытые (выбор ответа из жесткого определенного списка с возможностью дополнения собственным ответом), экспертная матрица. Выгрузка информации в различные форматы: бланк анкеты для проведения классических исследований в полевых условиях (RTF, 7
HTML); генерация отчетов (RTF); собранная статистика (файл с разделителем – CSV, XML); экспорт структуры вопросов (XML). Первичная обработка статистической информации: построение графиков; подсчёт распределение вариантов ответов в заполненных анкетах (опросниках). Возможность использования модуля в качестве инструмента для проведения тестирования (проверка «правильности» ответов). Обеспечение регистрации и создание индивидуального профиля пользователя. Перед началом работы с модулем DS-test необходимо зарегистрироваться в АСПНИ, по адресу http://masu-inform.ru:8111/group/, перейдя по ссылке «регистрация» в правом верхнем углу, см. Рис. 1.
Рис. 1. Форма регистрации в DS-test Регистрация в системе (Рис. 2) является обязательным условием работы в ней. Зарегистрированный пользователь получает все доступные функции АСПНИ. Для регистрации необходимо указать следующие данные о себе: Полное имя – будет отображаться на всех документах системе (бланк анкеты, отчеты и так далее); Логин – ваше имя, с помощью которого вы сможете осуществить вход в систему. e-mail – адрес вашей электронной почты. Без указания адреса не возможна регистрация, а так же это единственное средство восстановить забытый пароль. Пароль. 8
Код с картинки, защиты от автоматических регистраций. Регистрация означает согласие с условиями «Лицензионного соглашения». После успешной регистрации вы сразу можете начать использование системы. Зарегистрированный пользователь считается авторизированным, но недоверенным. Это значит, что такой пользователь может создать только одну анкету. Для снятия статуса «недоверенный» нужно обратиться в техническую поддержку и в письме указать причину, по которой вы бы хотели работать больше, чем с одной анкетой. Для работы в системе в браузере на стороне клиента должен быть включен JavaScript и Cookie.
По окончании регистрации в системе, Вы можете создать в системе одну анкету для проведения исследования, перейдя по одной из ссылок: «Добавить анкету: виртуальный редактор» или «станица добавления анкеты».
Рис. 3. Форма «Стартовая страница модуля DS-test» Следующим этапом является загрузка заранее разработанной анкеты в АСПНИ для проведения дальнейшего исследования. На странице добавления анкеты (Рис. 4) необходимо ввести название анкеты, автораразработчика, а также комментарий к анкете. Комментарий должен отражать суть проводимого исследования, цель. С помощью визуального редактора ввести вопросы анкеты и варианты ответов. В DS-test поддерживается 4 вида вопросов: открытый – ответ вводится в произвольной форме респондентом); закрытый – ответ выбирается из жестко заданного списка вариантов; открыто-закрытый – пользователю предлагается список вариантов, который он может дополнить одним собственным вариантом ответа; экспертная матрица – для проведения экспертной оценки методом по-парного сравнения предлагаемых вариантов (альтернатив). Существует два способа создания анкеты: с помощью визуального редактора и с помощью языка специальной разметки, позволяющего описать структуру вопросов анкеты.
Рис. 4. Страница добавления анкеты Описание структуры с помощью разметки Пользователь должен заранее подготовить анкету для ее сохранения в системе. Записываются вопросы и варианты к этому вопросу1. В зависимости от типа вопроса, его формулировка заключается в различные символы: %Открытый вопрос% =Закрытый вопрос= *Открыто-закрытый вопрос* Варианты ответа при этом необходимо заключить в символ «/»: /вариант ответа 1/ /вариант ответа 2/ … /вариант ответа n/ 1
Типа вопроса «Экспертная матрица» - не поддерживается в описываемой версии DS-test с помощью «языка разметки».
Если вопрос подразумевает возможность выбора нескольких вариантов ответа, то перед формулировкой вопроса необходимо поставить символ «@»: @%Ваш любимые фрукты:% /яблоко/ /апельсин/ /банан/ Для создания подзаголовков в теле анкеты применяется символ «^», причем заголовок можно разместить после какого-либо вопроса, записав его таким образом — ^Заголовок^. Если формулировка вопроса подразумевает использование одного из символов @=/*^%, то указанный символ необходимо написать два раза (экранирование символа), тогда он будет распознан корректно. Вопрос
поле «Текст», а так же заполнить все остальные необходимые поля — «Название анкеты», «Автор», «Комментарий». Будьте внимательны, после сохранения анкеты её изменение будет невозможно. Вы только сможете поменять название анкеты и комментарий. Если вы обнаружите ошибку в формулировке какого-либо вопроса или варианта, то нужно удалить ошибочную анкету и создать новую. Перейти на страницу добавления анкеты можно пройдя по ссылке в строке меню Системы, выбрав «текстовый редактор». Создание анкеты с помощью визуального редактора С помощью визуального редактора имеется возможность создать анкету, не прибегая к её текстовому описанию. Пользователю необходимо будет выбрать Тип вопроса, указать, возможен ли выбор нескольких вариантов ответа, так же сформулировать Текст вопроса и последовательно указать варианты ответов, если тип вопроса предполагает их наличие. Для типа вопроса Экспертная матрица так же возможно указать максимальную оценку. Указанное вами в соответствующем поле число будет использоваться для проверки введенных вашими респондентами данных. При создании Экспертной матрицы — варианты, это совокупность объектов, которые будут расположены в матрице в строках и столбцах, а респонденты будут их поочередно сравнивать друг с другом и заносить результат сравнения в соответствующие ячейки. Матрица будет иметь треугольную форму представления. Экспертную матрицу можно создать только через Визуальный редактор. Ограничение визуального редактора — не больше тридцати вопросов и не больше 15 вариантов ответов в каждом из них. Работа с анкетами Для начала отметим, что любая анкета может выступать как средство сбора статистической информации, так и как средство тестирования. Перейдите на Главную страницу, а затем в меню слева страницы выберете пункт меню Мои анкеты. Если вы уже успели создать анкету, то увидите её название. В списке Мои анкеты выводится краткая информации об анкете: название; дата создания; ключевые слова. Если вы кликните на названии анкеты, то попадете на палитру действий с анкетой. Для начала в разделе Действия на палитре действий перейдите на страницу Настройка. Основные параметры, доступные для изменения: Активность – означает, смогут ли заполнить анкету другие пользователи. Если анкета не активна, то никто, включая владельца анкеты, не сможет добавить ответы. Приватность – если владелец анкеты желает скрыть от других 13
пользователей палитру действий своей анкеты, а так же запретить все действия со своей анкетой, кроме возможности её заполнения, то следует включить приватность. Тип анкеты – анкета может выступать как средство сбора статистической информации, так и как средство для проведения тестирования. Все эти параметра анкеты отображаются на палитре действий анкеты сразу под её названием. Так же любая анкета в системе имеет уникальный и не повторяющийся идентификатор. Увидеть его можно на Бланке анкеты. Ссылкой на страницу добавления ответов на вашу анкету для незарегистрированных пользователей будет: www.masu-inform.ru:8111/form/add.php?id_form=идентификатор_анкеты Эту ссылку можно использовать для целевых опросов, проводимых путем рассылки ссылки выбранным респондентам (например, в социальных сетях)2. Результаты проведения анкетирования можно просмотреть, войдя в систему, выбрав анкету, пункт «Статистика», Рис. 5.
Рис. 5. Палитра возможных действий с анкетой На странице «Статистика» модуля DS-test показана статистика по каждому вопросу анкеты и ее графическое представление, Рис. 6.
2
Этот способ проведения опросов был впервые использован студентами 3-го курса отделения социологии МаГУ в начале 2009 года.
Рис. 6. Пример «Статистики ответов» Далее описываются особенности работы с различными типами анкет, а также дополнительные инструменты, расширяющие возможности опросов и статистической обработки. Статистическая анкета В этом типе анкеты доступны действия, описанные ниже. Добавить ответ. Добавление ответов к анкете. Если вы зарегистрированный пользователь и вошли на сайт под своим именем, то при добавлении ответов не потребуется вводить код с изображения для идентификации себя, как человека, а не программного робота. Бланк анкеты. Бланк анкеты для распечатки и заполнения анкет респондентами с последующим внесением в Систему вручную. Доступны два формата HTML и RTF. Идентификация. К каждой анкете автоматически привязываются три дополнительных вопроса: дата заполнения; место проведения; аудитория. Основной список Аудитория и Место проведения определяется администратором системы. Однако каждый владелец анкеты может дополнить этот список собственными значениями. Собственные значения нужно указать в соответствующих полях через запятую. Статистика. Страница, которая отображает статистику по анкете. К каждому вопросу возможно просмотреть график (ссылка Показать график). На странице справа расположен фильтр, с помощью которого возможно просмотреть статистку, выбрав аудиторию и места проведения для подсчета. Обратите внимание, если вы сами или Администратор, удалили из списков Аудитория или Место проведения какое-либо значение, но су15
ществует, по крайней мере, одна анкета, привязанная к удаленному значению, то это значение все равно будет доступно в фильтре. То есть ненужные значения списков Аудитория и Место проведения можно удалять по мере необходимости, на уже заполненных анкетах это никак не отразиться. Обратите внимание, если ваша анкета содержит большое количество ответов (больше 300), то могут наблюдаться задержки при генерации страницы.
Рис. 7. Пример фильтра для вывода статистики по выбранной анкете Используя Фильтр можно просмотреть статистику по выбранным Местам проведения и Аудиториям. Собственные ответы. Позволяют просмотреть списки собственных ответов на открытые и открыто-закрытые вопросы. Сначала будет предложено выбрать вопрос, а потом будет выведен список ответов. Дублирующиеся ответы будут выводиться только один раз, а под ответом будет указано, сколько раз встречается такой ответ. История анкеты. Показывает распределение по заполненным анкетам по спискам Аудитория и Место проведения. Указывается процентное соотношение заполненных анкет. Заполненные анкеты. В таблице выводится таблица, в которой ука16
зываются ответы респондентов на ответы вашей анкеты. Ответы на закрытые вопросы выводят по номерам выбранных вариантов через запятую. Собственные ответы выводятся в отдельном столбце. Файл с разделителем (столбец-вопрос): ответы на каждый вопрос помещаются в отдельный столбец, а ответы на вопросы разделяются символом «точка с запятой», а вариантов ответов (если вопрос подразумевает несколько вариантов ответа) разделяются по умолчанию символом “|”, который можно изменить в соответствующем поле на страницу. Файл с разделителем (столбец вариант) – каждый вариант ответа помещается в свой столбец. То есть в таблице будет столько столбцов, сколько всего вариантов во всех вопросах анкеты. К примеру: Какой фрукт вы любите? Яблоко Апельсин 1 2 2
Банан
Киви
3 3
4 4
Отчет. Отчет может быть сформирован из следующих блоков, которые можно включать и отключать при формировании отчета по мере необходимости. Общая информация: заголовок отчета: название анкеты, автор, комментарий. Бланк анкеты: перечень вопросов анкеты. Статистика анкеты: количество анкет в вопросе и количество заполненных анкет. Статистика ответов: результаты анкетирования по каждому варианту вопросов в процентах от общего количества ответов. Статистика ответов по месту проведения и аудитории: результаты анкетирования по каждому варианту вопросов в процентах от общего количества ответов для каждого места проведения и аудитории. Распределение по месту заполнения и аудитории: количество анкет, которые были заполнены в том или ином месте проведения и той или иной аудиторией. Удалить анкету. Удаление анкеты со всей собранной статистикой. Рекомендуется не удалять анкету, а архивировать. Архивировать. Перемещение анкеты в архив. Заархивированная анкета недоступна для заполнения, но по ней можно вывести статистику и сгенерировать отчет. Экспорт в XML. Создание резервной копии структуры анкеты и ответов на вопросы. Импорт из XML. Восстановление структуры анкеты и статистики из 17
сохраненного XML файла. Определить иерархию вопросов. Вопросы каждой анкеты могут быть выстроены в определенную иерархию. Варианты каждого закрытого вопроса могут иметь по одному зависимому вопросу. При заполнении анкеты пользователями, зависимый вопрос будет показан только тогда, когда пользователь выберет определенный вариант в родительском вопросе. Пример построения иерархии приведен на Рис. 8. В ходе опроса, ответ на первый вопрос анкеты «Да» приведет к выводу 2-го вопроса, и т.д.
Рис. 8. Создание иерархии на вопросах имеющейся анкеты Если вопрос является одновременно и родительским, и зависимым, то при скрытии его родителем, автоматически скроются все зависимые вопросы, вопросы, зависимые от зависимого и так далее. Зависимые вопросы могут быть только у закрытых вопросов. Один и тот же вопрос может зависеть от нескольких вариантов одного вопроса, но не может зависеть от двух разных вопросов. 18
Настройка. Изменение настроек анкеты — приватность, активность, название, комментарий. Описание см. выше. Графика. Необходимо подготовить графические материалы в формате JPEG (расширение файлов, соответственно только *.jpg, *.jpeg) и упаковать их в архив ZIP. Каждый файл должен быть назван по номеру вопроса, с которым он связан (например, 1.jpg относится к первому вопросу), размер архива не может превышать 2 Мб, изображения можно загружать в несколько этапов, однако существующие файлы при совпадении имен будут заменяться. Эта функция позволяет создавать анкеты-опросники, которые содержат графические изображения. Например, опросы на опознавание и/или оценку отношения респондента к чему/кому-либо. Тест Если тип анкеты определён, как тестирование, то для анкеты доступны только следующие действия: Добавить ответы, Бланк теста, Статистика, Удалить тест, Заполненные анкеты, Экспорт в XML, Импорт из XML, Настройки, Графика. Для теста предварительно нужно указать верные ответы на вопросы. Для этого можно воспользоваться ссылкой «Ответы». Нужно будет указать номера верных ответов. Для открытых вопросов, которые не должны участвовать в оценивании, к примеру, поле для ввода ФИО тестируемого или номера группы, в качестве верного ответ нужно ввести символ «*» без кавычек. Результаты анкетирования доступны по ссылке «Результаты» на палитре действий. Ответ считается либо правильным, либо неправильным. Поэтому если это открытый вопрос, то необходимо полное совпадение текста ответа с вопросом. Если вопрос подразумевает выбор из вариантов ответов, то должны быть выбраны все верные варианты. Например, если верные ответы имеют номера <1,3,5>, то ответ с номерами <1,5> считаться верным не будет, так же как и ответ с номерами <1,3,4,5>. Группы анкет (опросов) Анкета может принадлежать к одной или нескольким группам анкет. Для этого на палитре действий воспользуйтесь ссылкой Изменить рядом с заголовком «Относится к группам». Вы можете включить анкету к нескольким группам. Это, в частности, определит в каком разделе(ах) будет отображаться карточка вашей анкете на главной странице для незарегистрированных пользователей. Если в списке вы не находите подходящей группы, то можете создать свою группу. Другие пользователи смогут подключить к созданной вами группе свои анкеты. Удалить группу может любой пользователь, даже если он её не создавал, только при том условии, что в группу не включена ни одна анкета. Включить/отключить анкету от группы может только её вла19
делец. Анкета, не включенная ни в одну группу, на главной странице для незарегистрированных пользователей не отображается. Недоверенные пользователи создавать свои группы не могут. Особенности заполнение анкет в режиме on-line Для заполнения анкеты на стороне клиента должна быть включена поддержка JavaScript. Это обязательное условие. Если анкету заполняет респондент, которые не является зарегистрированным пользователем АСПНИ, то при ошибке в вводе кода с картинки, ввести ответы на анкету придется снова. С одного компьютера в режиме on-line незарегистрированный респондент может заполнить только одну анкету раз в 20 минут. Мой профиль Каждый зарегистрированный пользователь АСПНИ может указать информацию о себе в своем Профиле. Информация, указанная там является общедоступной, в том числе и для незарегистрированных пользователей. Задания 1. 2. 3. 4.
Разработать анкету для проведения социально-экономического исследования. Разместить анкету в АСПНИ, провести анкетирование. Провести анализ статистических результатов. Представить полученные результаты в виде отчета. Ссылки
1. 2. 3.
20
Автоматизированная система поддержки научных исследований. - Режим доступа: http://masu-inform.ru:8111/form/ Официальный сайт научно-исследовательской группы Discovery Studio. – Режим доступа: www.masu-inform.ru:8111 Блог разработчиков. – Режим доступа: www.anceta.blogspot.com
РАБОТА 0-1: СИСТЕМА УПРАВЛЕНИЯ КОНТЕНТОМ (CMS) WORDPRESS Цель Научиться работать с системой управления контентом (CMS) WordPress. Описание задачи Перед началом работы проследите, чтобы был запущен Web - сервер Apache, СУБД MySQL и язык программирования PHP. Данные приложения являются классическим набором инструментов для разработки вебприложений. В рамках данной работы необходимо установить на сервер CMS WordPress и создать собственный сайт. Алгоритм решения CMS – это система управления контентом/содержимым сайта. Под контентом и содержимым сайта понимают: текст, картинки, видео – данные и файлы. Система позволяет в удобном виде создавать и управлять (редактировать, удалять) текстовыми материалами и мультимедиа документами (содержимое или контент) на сайте. Аббревиатура «CMS» появилась от англ. фразы Content Management System, что и переводится, как система управления контентом. Если вы знакомы с разработкой сайтов на html, то понимаете, для того, чтобы добавить новую статью на ваш сайт нужно создавать новый файл html. Чтобы отредактировать статью, нужно открывать html файл и искать в нем тот фрагмент, который нуждается в изменении. На эту работу уходит много времени и необходимо знание html и css. Чтобы облегчить эту работу были придуманы системы, которые позволяли всего один раз создать дизайн сайта и, если нужно написать/отредактировать статью, совсем не нужно создавать/редктровать html файлы. Таким образом, в CMS внутренняя структура и дизайн отделены от контента, и, чтобы управлять сайтом, не нужно каких-то дополнительных знаний в технологиях интернет-разработки. WordPress – CMS с открытым исходным кодом, распространяемая под GNU GPL. Написан на PHP, в качестве базы данных использует MySQL. Сфера применения: от блогов до достаточно сложных новостных ресурсов и даже интернет-магазинов. Встроенная система «тем» и «плагинов» вместе с удачной архитектурой позволяет конструировать практически любые проекты. Рассмотрим процесс установки WordPress на сервер. Для установки CMS необходимо наличие доступа к сайту, текстового редактора, FTP-клиент, если устанавливать WordPress на удаленный сервер, браузер. Также должен быть установлен РНР версии 4.3 и выше, MySQL версии 4.0 и выше. 21
Шаг 1 Скачать установочный дистрибутив WordPress с сайта http://ru.wordpress.org/releases/, распаковать архив в папку на своем компьютере. Шаг 2 Создание базы данных на сервере, в которой будет храниться информация сайта. Рассмотрим создание базы данных на примере MySQL. Для начала необходимо запустить веб-сервер в связке с PHP и MySQL. Перейти по ссылке: http://localhost/Tools/phpMyAdmin/, откроется следующая страница, Рис. 9.
Рис. 9. Страница администрирования баз данных Создадим базу данных, введя ее имя в соответствующее поле и нажав кнопку «Создать», Рис. 10.
Рис. 10. Поле создания новой базы данных Также необходимо создать пользователя базы данных, имеющего доступ к ней. Перейдем с главной страницы администратора баз данных по ссылке «Привилегии» -> «Добавить нового пользователя», заполнить поля «имя пользователя», «хост», «пароль», «подтверждение пароля», определить права нового пользователя (Рис. 11). 22
Рис. 11. Добавление нового пользователя Для ограничения доступа к базе данных сайта, следует установить привилегии для созданного пользователя, Рис. 12.
Рис. 12. Установление привилегий для прав доступа Шаг 3 Переместите разархивированный дистрибутив WordPress на веб-сервер в корневой каталог. Для начала установки перейдите по ссылке: http://имя директории сайта/wp-admin/install.php Ввести в появившуюся форму: имя базы данных, имя пользователя, пароль, которые были созданы на предыдущем шаге. Нажать кнопку «Отправить».
Рис. 13. Установка WordPress В следующем окне введите имя сайта, свой e-mail. В результате системой вам будет выдан логин admin и пароль доступа. Для безопасности удалите файл install.php из папки wp-admin. Шаг 4 Перейдя по ссылке http://имя директории сайта/wp-admin/, введите полученные в результате установки логин и пароль доступа, нажав кнопку «войти» Вы попадете в панель администратора сайта. Рассмотрим основные элементы панели администратора сайта, Рис. 14.
Рис. 14. Панель администратора сайта Панель управления состоит из следующих разделов: Доска объявлений. В этот раздел вы попадаете автоматически после того, как авторизируетесь. В этом разделе вам доступна информация об последней активности на сайте (последние комментарии, статьи, входящий ссылки и т.д.), а также последняя информация с официального сайта WordPress. Благодаря этому разделу вы всегда будете в курсе того, что происходит у вас на сайте, а также что нового появилось в мире WordPress. Написать. Отсюда вы можете создавать новые записи, которые будут опубликованы на главной странице вашего сайта или запрограммировать записи так, что они появятся в определённое время. Здесь же вы сможете создать рубрики для будущих записей. Создание страницы. Здесь вы сможете создать новые страницы для своего сайта и использовать страницы для организации любого типа данных. Управление. Раздел включает в себя все опции по управлению информацией на сайте: записями, страницами, рубриками, комментариями и файлами. Записи. С помощью этого раздела вы можете редактировать или удалить записи, найти нужную запись, просмотреть записи за определённый период времени, комментарии к записям и т.д. и т.п. Страницы. В этом разделе расположены страницы, которые были созданы вами. Как и при работе с записями вы можете создать, удалить и отредактировать страницу, или найти нужную вам страницу.
Рубрики. На этой странице вы можете создать определённый раздел для записей на сайте. Разделы улучшают сортировку записей на сайте. Комментарии. Вы можете просмотреть все комментарии, оставленные на вашем сайте. В этом же разделе есть поиск по всем комментариям, что облегчит ваш поиск, если вам понабиться найти комментарий у себя на сайте. Ожидание модерирования. Все отправленные комментарии на сайте проходят ручную проверку администратором сайта. В этом разделе расположены комментарии, ожидающие своей очереди проверки. Доступны следующие действия при работе с комментариями: удалить, отложить, подтвердить, изменить и пометить как спам. Файлы. Онлайн-редактор для редактирования файлов WordPress. Данный редактор пригодится тем, у кого нет текстового редактора. Ссылки. Здесь вы можете создать и управлять ссылками, которые отображаются на главной странице сайта. Вы также можете создать разделы для ссылок и сделать импорт ссылок на свой сайт. Управление ссылками. В основном большая часть операцией над ссылками происходит в этом разделе. В этом разделе вы можете отредактировать уже существующие или созданные вами ссылки. Добавить ссылку. Этот раздел предназначен для добавления ссылки на сайт. При создании ссылки, ей можно задавать рисунок, видимость, рейтинг и раздел, в котором она будет отображаться. Разделы ссылок. Ссылкам, как и записям можно создать раздел, в котором они будет отображаться на главной странице сайта. Импорт ссылок. Если сайт или программа позволяет экспортировать ссылки в OPML, то вы можете импортировать их в этом разделе, а также задать раздел, куда будут добавлены ссылки. Внешний вид. В этом разделе можно добавить новый шаблон, редактировать установленный шаблон или же изменить цвет шапки и текста шаблона. Темы. Здесь вы можете просмотреть список установленных шаблонов и задать шаблон для отображения на сайте по умолчанию. Редактор тем. Вы можете редактировать любой файл шаблона, в том числе изменять style.css шаблона. Цвет шапки и текста. Данный раздел позволяет изменить цвет шапки и текста стандартного шаблона. В зависимости от шаблона, данный раздел будет заменяться другим названием и содержать в себе разные функции по смене цвета шапки и логотипа. 26
Плагины. Управление плагинами WordPress, которые расширяют и дополняют его возможности. В этом разделе можно включить (активировать), отключить (деактивировать) или редактировать плагин. Плагины. С помощью этого раздела можно включать и выключать установленные на сайте плагины. Редактор плагинов. Практически любой плагин WordPress редактируется, а благодаря этому разделу редактирование плагина происходит специальных текстовых редакторов и использования FTPдоступа. Пользователи. Раздел для управления пользователями вашего сайта, а также изменением своего профиля. Ваш профиль. В этом разделе вы можете изменить информацию своего профиля в системе WordPress. Авторы и пользователи. Здесь вы можете создать нового автора или пользователя, изменить или удалить уже существующего пользователя. Настройки. В этом разделе производиться настройка общих параметров WordPress. Например, включить ЧПУ, изменить название сайта, изменить описание сайта, адрес сайта и многое другое. Общие. С помощью этого раздела можно изменить заголовок сайта, краткое описание, время сайта, адрес сайта и многое другое. Написание. В данном разделе можно настроить размер текстового поля, включить преобразование символов смайлов в картинки, а также включить публикацию при помощи e-mail. Чтение. Здесь можно настроить и изменить количество страниц блога, изменить кодировку для страниц лент, также можно настроить анонс или полный текст для каждой статьи. Обсуждение. Настройки обсуждения стать. Например, вы можете разрешить оставлять комментарии на статью, настроить оповещение по e-mail, когда оставляют комментарий или же комментарий ожидает модерирование, включение и выключение проверки администратором комментариев, и многое другое. Постоянные ссылки (ЧПУ). В этом разделе вы можете включить ЧПУ для своего сайта и выбрать подходящий вид отображения из двух возможных. Разные настройки. С помощью этого раздела вы можете настроить путь сохранения файлов загружаемых в WordPress. RusToLat. Здесь вы можете настроить стандарт, по которому будет производиться транслитерация заголовков в WordPress. Импорт. Благодаря этому разделу вы можете импортировать записи и комментарии из других систем в WordPress. Например, можно импортировать записи из RSS ленты в WordPress. 27
Задания 1. Установить на веб-сервере дистрибутив WordPress. 2. Создать сайт, посвященный статистическим исследованиям в Интернет. Установить для сайта тему, соответствующую направленности сайта. Сайт должен содержать не менее трех страниц, 6 записей. Разместить ссылки на тематические сайты. Добавить плагины к сайту. Ссылки 1. Портал MyWordPress. – Режим доступа: http://mywordpress.ru/ 2. Страница блога WordPress Россия. – Режим доступа: http://ru.wordpress.org/
Раздел проектирования В данном разделе приводится описание работ и задания, выполнив которые, можно построить собственную систему проведения on-line и off-line опросов, первичную обработку статистической информации, экспорт данных во внешние системы статистической обработки. РАБОТА 1. ЗНАКОМСТВО С ИНСТРУМЕНТАМИ УПРАВЛЕНИЯ СУБД MYSQL Цель Научиться работать с приложениями MySQL Administrator и MySQL Query Browser и создавать структуру базы данных будущего webприложения. Описание задачи Перед началом работы проследите, чтобы был запущен сервер СУБД MySQL. Для управления базами данных, их создания или удаления можно использовать командную строку выполнять все действия в ней. При создании достаточно больших информационных моделей могут возникнуть трудности при использовании только такого интерфейса. Для таких целей MySQL предоставляет пакет утилит MySQL GUI Tools, который имеет дружественный графический интерфейс и включает в себя следующие компоненты: MySQL Administrator - графический интерфейс для управления базами данных: создание, удаление таблиц, добавление значений в таблицы; MySQL Query Browser - удобный инструмент для создания SQL запросов; MySQL Migration Toolkit - утилиту для переноса данных из различных БД в MySQL и наоборот. В рамках этой работы рассмотрим создание схем баз данных, таблиц и описания атрибутов этих таблиц. Алгоритм решения Запустите MySQL Administrator. Для подключения к СУБД необходимо указать некоторые данные о подключении. localhost Server Host 3306 Port root Username Password 29
Примечание: пароль суперпользователя root может либо пустым (если вы пользуетесь пакетом Denwer и не устанавливали пароль root), либо при самостоятельной установке СУБД вам было предложено ввести пароль на стадии первоначальной настройки СУБД. Если все было введено правильно, то после нажатия Ок вы увидите главное окно программы. Для начала нужно создать новую базу данных, а потом добавить в нее все необходимые таблицы, после чего создать нового пользователя и настроить его права доступа. В главном меню программы выберите View Catalogs. В нижнем левом углу вы увидите список всех существующих баз данных. Для создания новой БД нажмите Ctrl + N или щелкните правой кнопкой по пустому пространству под списком баз данных и в выпадающем контекстном меню выберите Create New Schema (Рис. 15). В появившемся окне введите form_db. Для дальнейшей работы нам понадобиться только одна БД, поэтому перейдем к созданию таблиц БД. Щелкните по только что созданной БД form_db, в правой части окна будет отображаться список созданных таблиц, пока он пустой. Создадим первую таблицу.
Рис. 15. Создание новой схемы данных Внизу окна есть набор команд для управления таблицами. Для создания новой таблицы щелкните Create Table.
В появившемся окне нужно определить атрибуты таблицы, типы данных, первичные и внешние ключи.
Рис. 17. Окно определения атрибутов таблицы Table Name определяет имя таблицы, что означает что оно может состоять только из латинских символов и некоторых специальных символов. На вкладке Columns and Indices описываются атрибуты для новой создаваемой таблицы. Column Name Datatype Not NULL
Auto Inc
Flags
Default Value Comment
Название атрибута Тип данных Флажок, который запрещает (если флажок установлен) или разрешает пустое значение атрибута в кортеже Счетчик, если значение атрибута не будет передано в запросе, то автоматически подставиться следующее свободное Unsigned – беззнаковый числовой тип; Zerofill – заполнение нулями числа справа до определенного количества разрядов, который определяется типом данных Значение поля по умолчанию Любой комментарий
Column Name Datatype Not NULL Auto Inc Flags Default Value Comment
id_form INTEGER UNSIGNED , ZEROFILL
Примечание: по умолчанию первый добавляемый атрибут считается первичным ключом. Об этом свидетельствует желтый символ ключика около названия атрибута. Чтобы сменить тип атрибута с первичного ключа на обычный атрибут, щелкните мышью по символу ключика. Чтобы сделать атрибут опять первичным ключом, щелкните символ еще раз. Добавьте остальные атрибуты таблицы, пользуясь следующими данными: `author` varchar(100) default NULL, `title` varchar(200) NOT NULL, `comment` text, `active` smallint(5) unsigned NOT NULL default '1', `owner` varchar(100) default NULL, `date` date NOT NULL, `date_archive` date default NULL, `keywords` text, `private` tinyint(1) default '0', `type` varchar(45) default 'stat', `user_qroup` varchar(100) default 'any', `subtype` varchar(100) default NULL, PRIMARY KEY (`id_form`)
Перейдите на вкладку Table Option. Установите значение параметра Charset – cp1251, а значение параметра Collation – cp1251_general_ci. Второе приложение из пакета утилит, это MySQL Query Browser, которое является удобным средством для написания запросов к СУБД и просмотра результата запроса. Задания Создайте в СУБД в базе данных form_db следующие таблицы и укажите все атрибуты (каждое поле описано так же, как и на языке SQL): `answer` ( `id_answer` int(10) unsigned NOT NULL auto_increment, `own_answer` varchar(1000) default NULL, `id_question` int(10) unsigned default NULL, `id_variant` int(10) unsigned default NULL, `id_filled_form` int(10) unsigned default NULL, 32
) `history` ( `id_filled_form` int(10) unsigned NOT NULL auto_increment, `date` date default NULL, `place` varchar(200) default NULL, `audience` varchar(200) default NULL, PRIMARY KEY (`id_filled_form`) ) `question` ( `id_question` int(10) unsigned NOT NULL auto_increment, `q_text` varchar(500) NOT NULL, `number` smallint(5) unsigned NOT NULL, `q_type` enum('o','c','oc') NOT NULL default 'c', `a_few_answer` tinyint(1) NOT NULL default '0', `own_type` varchar(10) default 'text', `id_form` int(10) unsigned NOT NULL, `valide` varchar(45) default '0', PRIMARY KEY (`id_question`) ) `variant` ( `id_variant` int(10) unsigned NOT NULL auto_increment, `variant_text` varchar(500) NOT NULL, `v_number` smallint(5) unsigned NOT NULL, `id_question` int(10) unsigned NOT NULL, PRIMARY KEY (`id_variant`), KEY `v_number` (`v_number`), KEY `id_question` (`id_question`) )
Ссылки 1. 2.
Загрузка MySQL GUI Tools. – Режим http://dev.mysql.com/downloads/gui-tools/5.0.html MySQL GUI Tools Manual. Режим http://downloads.mysql.com/docs/guibook-en.a4.pdf
РАБОТА 2. ПОДКЛЮЧЕНИЕ К СУБД СРЕДСТВАМИ PHP Цель Выполнить подключение к СУБД MySQL, научиться выполнять запросы к СУБД и анализировать ошибки, возвращаемые СУБД. Описание задачи Для успешного выполнения вам потребуется установленная и запущенная СУБД MySQL, web-сервер Apache, установленный PHP. Для установки всех компонентов пакета WAMP (Windows+Apache+MySQL+PHP) обратитесь к Работе 0-1. Алгоритм решения Подключение к СУБД MySQL будет осуществляться через отдельный подключаемый модуль, написанный нами на PHP, который в будущем будет подключаться к каждой странице будущей системы и автоматически выполнять подключение к СУБД. В рабочем каталоге необходимо создать следующую файловую структуру: mysql_pass.php; Подкаталог module; module\connect_mysql.php. Пока эти файлы пустые. Определим содержание каждого из них. mysql_pass.php: Прежде необходимо создать нового пользователя в СУБД с правами доступа только к базе данных form_db. Запустите утилиту MySQL Administrator, далее View → User Administration. Далее выберите Add new user. Таблица 1 MySQL User Password Confirm Password
form fOrM fOrM
Имя пользователя и пароль (который вводится два раза для подтверждения), могут быть любыми (Таблица 1). Для удобства определимся, что они будут такими, как приведено в таблице. После чего перейдите на вкладку Schema Privileges. Здесь определяется перечень доступных этому пользователю баз данных и прав доступа к ним. Найдите созданную вами в лабораторной работе 1 базу данных form_db. Щелкните и назначьте для нее все права доступа, нажав кнопку «<<» (Рис. 18). Сохраните изменения, нажав Apply changes. 34
Рис. 18. Назначение прав доступа к БД Таким образом, файл mysql_pass.php будет содержать имя пользователя, через которого будет осуществляться подключение к СУБД, пароль и название БД (Листинг 1): Листинг 1 form fOrM form_db
В начале файла расположен вызов функции die; - при исполнении эта функция прерывает исполнение кода. Это предотвратит доступ к файлу извне, что предотвратит просмотр пароля и имени пользователя СУБД третьими лицами. module\connect_mysql.php: Модуль будет осуществлять подключение на основании имени пользователя и пароля, который мы сохранили в файле mysql_pass.php (
resource mysql_connect ([string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) Возвращает указатель на соединение с MySQL в случае успешного выполнения, или FALSE при неудаче. mysql_connect() устанавливает соединение с сервером MySQL. Следующие значения по умолчанию установлены для отсутствующих параметров: server = 'localhost:3306', username = имя пользователя владельца процесса сервера и password = пустой пароль. Параметр server может также включать номер порта, к примеру "hostname:port" или путь к сокету, к примеру ":/path/to/socket" для локального сервера. Замечание: При указании параметру server значения "localhost" или "localhost:port" клиентская библиотека MySQL будет пытаться соединиться с локальным сокетом. Если вы всё же хотите использовать 37
TCP/IP, используйте адрес "127.0.0.1" вместо "localhost". Если клиентская библиотека пытается подключиться не к тому локальному сокету, это можно исправить через указание директивы mysql.default_host в конфигурации PHP, после чего можно оставлять параметр server пустым. Поддержка указания порта через ":port" была добавлена в PHP 3.0B4. Поддержка указания локального сокета как ":/path/to/socket" была добавлена в PHP 3.0.10. Подавить вывод ошибок можно добавив @ в начало названия функции (@mysql_connect()) Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто. Параметр client_flags должен быть комбинацией из следующих констант: MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE, MYSQL_CLIENT_INTERACTIVE. Замечание: Параметр new_link добавлен в PHP 4.2.0. Параметр client_flags добавлен PHP 4.3.0. Соединение с сервером будет закрыто при завершении исполнения скрипта, если до этого оно не будет закрыто с помощью функции mysql_close(). Проверьте, в конце и в начале файла не должны быть пустых строк. Для вывода ошибок подключения можно дополнить код следующим фрагментом (Листинг 3): Листинг 3 if (!$db) { echo "
К сожалению, не доступен сервер mySQL
"; exit(); } if (!mysql_select_db($db_db,$db) ) { echo "
К сожалению, не доступна база данных
"; exit(); }
В случае неверного пароля или имени пользователя, на странице в браузере вы увидите ошибку примерно такого вида или при отсутствии прав на доступ к БД (что означает, что вы ошиблись в написании имени пользователя, пароля или назначении прав для доступа к таблица БД): Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'form'@'localhost' (using password: YES) in \module\connect_mysql.php on line 7
При отсутствии соединения с СУБД (на запущен сервер MySQL, проблемы доступа к хосту и так далее): 38
Warning: mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on 'localhost' (10061) in C:\home\localhost\www\form_old\module\connect_mysql.php on line 7
Если из базы выводятся вопросы, то после соединения с сервером выполняем запрос: set names кодировка Параметр "кодировка" должен соответствовать кодировке, в которой выводятся страницы на сайте, например: set names utf8. Задания 1. Создайте в рабочем каталоге файл index.php (Листинг 4). Листинг 4 Система анкетирования <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
2. Проверьте наличие подключения к БД. Убедитесь, что подключение к СУБД успешно осуществляется. 3. Используя функцию mysql_query() и mysql_fetch_array() составьте запросы на получение информации о существующих таблицах в БД form_db и их атрибутах и выведите их на страницу. Ссылки 1. Подключение к PHP расширения для работы с MySQL: - Режим доступа: http://www.softtime.ru/info/apache.php?id_article=98. 2. Установка Apache + MySQL + PHP. – Режим доступа: http://www.php.ru/install/ 3. Информация о функциях mysql_query(); и mysql_fetch_array(); - Режим доступа: http://www.php.ru
РАБОТА 3. ОБРАБОТКА ФОРМ Цель Научиться обрабатывать значения элементов страницы на стороне клиента с помощью JavaScript. Описание задачи Для выполнения дальнейших работ потребуется обрабатывать на стороне клиента в браузере элементы формы, а на сервер передавать для дальнейшей обработки уже готовую строку. Это обусловлено тем, что форма для заполнения анкеты будет носить произвольный характер и заранее будет неизвестно, сколько и каких элементов формы будет на странице. Алгоритм решения Каждый элемент формы имеет атрибут name, через который можно получить значение соответствующего поля или другого элемента формы (Листинг 5). Листинг 5
Приведенный ниже скрипт показывает пример функции, которая получает значение из текстового поля формы, приведенной выше. В первом случае обращение производится через объектную модель документа DOM, когда обращение к значению поля производится следующим образом – document.forms.имя_формы.имя_элемента.value. Второй способ – это обратиться к элементу формы по его уникальному идентификатору (при указании идентификаторов в атрибуте id нужно самостоятельно следить за их уникальностью) (Листинг 6): – document.getElementById(идентификатор_элемента).value. Листинг 6 <script> function get_value() { alert(document.forms.test_form.test.value); alert(document.getElementById(“test_id”).value; } 40
Значения элементов полей будут переданы в php-скрипт, который указан в соответствующей форме в атрибуте action. Если метод (method) был установлен в в get, то значение следует получать из глобального ассоциативного массива $_GET, соответственно для метода post определяется массив $_POST: Листинг 7 $test=$_GET[“test”]; $test=$_POST[“test”];
Допустим, что существует множество форм с разными элементами и необходимо сохранить в отдельное поле на форме test_form3 в поле text_result все значения элементов форм в порядке их следования на форме (Листинг 8). Листинг 8 <script language="JavaScript" type="text/javascript"> function get_value() { // Временная переменная var temp=""; // Получаем значение из элемента temp+=document.getElementById("input_field").value; // Получаем значение из элемента // Добавляем значение если только checkbox выбран 41
if (document.getElementById("checkbox_field").checked==true) temp+=document.getElementById("checkbox_field").value; // Обрабатываем элемент <select> temp+=document.getElementById("select_example").value; //Присваиваем значение временной переменной элементу формы // result_form в текстовое поле text_result document.getElementById("result").value=temp; }
Значения элементов и <select> определяются предварительно определенным значением атрибута value. Начальное значение определяется так же значением атрибута value, однако пользователь может его изменить, в отличие от первого случая, когда оно не может быть изменено пользователем. Значит при обработке необходимо заменять на пробел из введенной пользователем строки все символы «;», чтобы не возникло ошибок в строке, в которой количество «;» должно быть равно количеству значений, полученных с элементов формы. В будущем, понадобится так же разделять значения символом «,» - его тоже нужно будет заменить пробелом. Добавьте в Листинг 8 следующую функцию: Листинг 9 function str_edit(str) { for(var i=0; i<str.length; i++) { // строка str.replace(строка что_заменять, строка на_что_заменять) str=str.replace(';', ' '); str=str.replace(',', ' '); } return str; } 42
Тогда фрагмент функции get_value() (Листинг 8) примет вид: Листинг 10 <script language="JavaScript" type="text/javascript"> function get_value() { var temp=""; temp+=str_edit(document.getElementById("input_field").val ue); … }
JavaScript – далеко не самый быстрый язык, и getElementById - не исключение. Хотя эта функция и является самой эффективной для поиска элемента, она включает дорогостоящие обращения к DOM, объектной модели документа. Поэтому иногда в целях оптимизации вызовы кешируют: var cache = {} function nodeById(id) { return cache[id]?cache[id]:cache[id]=document.getElementById(id) ; }
Т.е, если значение cache[id] и так есть - оно возвращается, а если нет, то присваивается и возвращается. У этого примера есть недостаток: переменная cache засоряет глобальную область видимости. Чтобы этого не происходило, можно, например, обернуть ее в замыкание: (function() { var cache = {} window.nodeById = function(id) { return cache[id]?cache[id]:cache[id]=document.getElementById(id) ; } })()
После выполнения такого кода, никакая функция кроме nodeById, не сможет получить доступ к кешу, и ненароком испортить его значение.
Минусы кеша Эффект сильно зависит от модели браузера. Ряд браузеров имеет собственный кеш getElementById Страница может меняться, например, javascript. При этом кеш автоматически устаревает, и поддерживать его - проблема Плюсы кеша Быстрый доступ к элементу в наихудшем случае. То есть, если у пользователя установлен браузер Opera, то все и без кеша будет выполняться достаточно быстро. Но если браузер IE6 или даже IE5 – кеш поднимет производительность до приемлемого уровня. Задания 1. Дополните последний листинг таким образом, чтобы после значения каждого поля ставился символ «;». Обратите внимание, что если элемент checkbox не выбран, то все равно нужно добавить символ «;». Примечание: если checkbox_field не выбран, то в результате у вас должно получится «string;;1;», если checkbox_field выбран, то «string;1;1;» (Рис. 19).
Рис. 19. 2*. Перепишите Листинг 8, заменив обращение к значениям элементов форм с метода getElementById на обращение через объектную модель документа DOM - document.forms.имя_формы.имя_элемента.value. Ссылки 1. Методы и функции языка JavaScript: Режим http://www.citforum.ru/internet/javascript/jsmethod.shtml. 2. Объекты языка JavaScript. – Режим http://www.citforum.ru/internet/javascript/jsobject.shtml. 3. Информация о getElementById. – Режим http://getelementbyid.ru/.
РАБОТА 4. ОПИСАНИЕ СТРУКТУРЫ АНКЕТЫ И СОХРАНЕНИЕ СТРУКТУРЫ АНКЕТЫ С БД Цель Сформулировать синтаксис языка разметки для создания анкеты, спроектировать и реализовать программный код для сохранения структуры анкеты в БД. Описание задачи Первый этап статистического исследования – это определение вопросов анкеты, типов вопросов, вариантов ответов и так далее. Нужно определиться со способом описания такой структуры, а так же провести сохранение вопросов анкеты в БД. Алгоритм решения Система будет поддерживать вопросы 2 типов — открытый (ответ вводится в произвольной форме респондентом), закрытый (ответ выбирается из жестко заданного списка вариантов). Для последнего типа можно указать, каким образом пользователь выбирает ответ — либо только один вариант ответа, либо возможность выбрать несколько вариантов ответа. Пользователь должен заранее подготовить анкету для ее сохранения в системе. Записываются вопросы и варианты к этому вопросу. В зависимости от типа вопроса, его формулировка заключается в различные символы: %Открытый вопрос% =Закрытый вопрос= Варианты ответа при этом необходимо заключить в символ «/»: /вариант ответа 1/ /вариант ответа 2/ … /вариант ответа n/ Если вопрос подразумевает возможность выбора нескольких вариантов ответа, то перед формулировкой вопроса необходимо поставить символ «@»: @%Ваш любимые фрукты:% /яблоко/ /апельсин/ /банан/ 45
Если формулировка вопроса подразумевает использование одного из символов @=/^%, то указанный символ необходимо написать два раза (экранирование символа), тогда он будет распознан корректно. Такой синтаксис описания назовем, в рамках данного пособия, квазиязыком (Таблица 2). Таблица 2 Вопрос
Ваши любимые фрукты: Вопрос закрытый Можно выбрать несколько вариантов ответа яблоко апельсин банан
%Ваш любимые фрукты:% /яблоко/ /апельсин/ /банан/
Ваши любимые фрукты: Вопрос закрытый Укажите только один вариант ответа! яблоко апельсин банан
=Сколько будет 5**5?=
Сколько будет 5*5? Вопрос открытый
Определим назначение каждого поля таблиц БД (Таблица 3). Таблица 3 Название таблицы, полей и атрибутов полей `answer` `id_answer` int(10) unsigned NOT NULL auto_increment `own_answer` varchar(1000) default NULL 46
Значение Таблица, которая хранит ответы на вопросы анкеты. Каждая запись хранит один ответ на один вопрос. Идентификатор записи Поле для хранения собственного ответа, если ответ был дан на от-
`id_filled_form` int(10) unsigned NOT NULL auto_increment `date` date default NULL `place` varchar(200) default NULL `audience` varchar(200) default NULL `question` `id_question` int(10) unsigned NOT NULL auto_increment `q_text` varchar(500) NOT NULL `number` smallint(5) unsigned NOT NULL `q_type` enum('o','c') NOT NULL default 'c' `a_few_answer` tinyint(1) NOT NULL default '0' `id_form` int(10) unsigned NOT NULL `variant` `id_variant` int(10) unsigned NOT
Значение крытый вопрос Идентификатор вопроса, на который был дан ответ Идентификатор варианта, выбранного пользователем, если вопрос был закрытым Идентификатор заполненной анкеты Таблица, в которой будет хранится информация о заполненных анкетах. Каждая запись хранить информацию о факте заполнения всей анкеты. Позволит связать все ответы, которые были даны одним респондентом при заполнении одной анкеты. Идентификатор заполненной анкеты. Дата заполнения. Место заполнения. Аудитория, к которой относится заполняющий. Таблица, которая будет формулировки всех вопросов. Идентификатор вопроса. Формулировка вопроса. Номер вопроса в анкете. Тип вопроса. Если “o” – то вопрос открытый, если “c”, то вопрос закрытый. Сколько вариантов ответов можно выбрать в случае если вопрос закрытый. 1 – несколько, 0 – только один. Идентификатор анкеты, которой принадлежит вопрос. Таблица, которая будет хранить все варианты для закрытых вопросов. Идентификатор варианта. 47
Название таблицы, полей и атрибутов полей NULL auto_increment `variant_text` varchar(500) NOT NULL `v_number` smallint(5) unsigned NOT NULL `id_question` int(10) unsigned NOT NULL
Значение
Формулировка варианта. Номер варианта. Идентификатор вопроса, к которому привязан вариант.
Теперь, когда мы определились со структурой БД и значением каждого поля, нам нужно преобразовать структуру из квазиязыка в значения соответствующих полей БД. Создайте в рабочем каталоге файл add_form.php (Листинг 11): Листинг 11 Добавить анкету <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
Добавить анкету
Синтаксис
<small> % Открытый вопрос % = Закрытый вопрос = 48
Поставьте @ перед вопросом, если он предполагает более одного варианта ответа.
На странице расположена форма, в которую будут вводиться название анкеты, автор, комментарий к ней и структура анкеты на квазиязыке. Обработка информации будет производиться в скрипте save_form.php. Общий алгоритм: 1. Получение первого символа структуры на квазиязыке. Если это, символ начала вопроса («%» или «=»), то все символы после этого до символа конца вопроса (все те же «%» или «=» соответственно) будут помещаться во временную переменную, которая потом будет сохранена в БД как формулировка вопроса. После сохранения вопроса в БД временная переменная будет очищена. 2. Таким же образом будут обрабатываться формулировки вариантов (которые, как вы помните, ограничены с двух сторон символом «/»). 3. Соответственно, при нахождении символа «@», определенная временная логическая переменная будет принимать истинное значение и при сохранении в БД следующего вопроса это будет учитываться, после чего переменной будет присвоено значение ложь. Рассмотрим обработчик формы save_form.php (Листинг 12): Листинг 12 include("module/connect_mysql.php"); // Принимаем в переменные заголовок анкеты, автора, комментарий // и структуры анкеты на квазиязыке $title=$_POST["title"]; $author=$_POST["author"]; $comment=$_POST["comment"]; $form_text=$_POST["form_text"]; // Так как для языка запросов SQL символ «’» является служебным, // то его, при наличии в строках, нужно экранировать $title=str_replace("'", "\'", $title); $author=str_replace("'", "\'", $author); 49
$comment=str_replace("'", "\'", $comment); // Здесь и далее в этом листинге: структуры анкеты на квазиязыке будем // называть текстом. // Позиция в тексте $i=0; // Логическая переменная, означающая, что текущая позиция в тексте // находится внутри вопроса $in_question=false; // Аналогично, только для варианта $in_variant=false; // Временная переменная для хранения текста варианта $variant=""; // Добавим информацию об анкете в таблицу form // Сначала получим значение идендификатора и увеличим его на 1 $row = mysql_fetch_array(mysql_query("SELECT max(id_form) FROM form")); $id_form=$row["max(id_form)"]+1; // Добавляем в таблицу новую строку mysql_query("INSERT INTO `form` (`id_form`, `author`, `title`, `comment`) VALUES ($id_form, '$author', '$title', '$comment')"); // Временные переменные // Текущий идентификатор вопроса, будет увеличиваться на 1 для каждого // следующего вопроса $current_id_question=""; // Переменная для временного хранения символов текущего вопроса $question=""; // Текущий номер вопроса. Так как вопросы в анкете начинаются с 1, // то первоначальное значение равно 1 $ques_number=1; // Тип текущего вопроса $current_q_type=""; // Может ли текущий вопрос иметь несколько вариантов ответа $current_few_answer=0; // Аналогичные поля для хранения информации о формулировках варианта 50
$current_id_variant=""; $current_variant_text=""; $var_number=1; // Перебираем посимвольно весь текст while ($i<strlen($form_text)) { // Если текущий символ «@» То это значит, что следующий вопрос будет // иметь несколько вариантов ответа if ($form_text[$i]=="@") { $current_few_answer=1; } // ---------------------------------// ОБРАБОТКА ВОПРОСОВ АНКЕТЫ // ---------------------------------// ку // if
Если бы видим символ, который ограничивает формулироввопросу, и мы уже не находимся внутри вопроса ( ($form_text[$i]=="%" || $form_text[$i]=="=") && $in_question==false )
{ // Увеливаем на один, то есть переходи на следующий символ $i=$i+1; // Устанавливаем флаг, что мы внутри вопроса $in_question=true; // Очищаем переменные $current_q_type=""; // Переходим на следующую итерацию цикла continue; } // Если позиция в тексте находится внутри какого-либо вопроса // или варианта, то сохраняем текущий символ в соответствующую // переменную if ($in_question==true) { $question.=$form_text[$i]; } if ($in_variant==true) { $variant.=$form_text[$i]; }
// Если мы не перешли на следующую итерацию цикла // и текущий символ – символ, ограничивающий вопрос, // и флаг указывает на то, что мы уже были внутри вопроса, // то это означает, что формулировка вопроса закончилась if (($form_text[$i]=="%" || $form_text[$i]=="=") && 51
$in_question==true) { // Определяем тип вопроса if ($form_text[$i]=="%"){ $current_q_type="o"; } if ($form_text[$i]=="="){ $current_q_type="c"; } // Объявляем, что мы уже вне вопроса $in_question=false; // Сохраняем вопрос в БД $row = mysql_fetch_array(mysql_query("SELECT max(id_question) FROM question")); $current_id_question=$row["max(id_question)"]+1; $question=str_replace("'", "\'", $question); mysql_query("INSERT INTO `question` (`id_question`, `q_text`, `number`, `q_type`, `a_few_answer`, `own_type`, `id_form`) VALUES ($current_id_question, '$question', $ques_number, '$current_q_type', '$current_few_answer', '$current_own_type', '$id_form')"); // Очищаем переменные $current_few_answer=0; // Увеличиваем номер вопроса $ques_number+=1; $question=""; // Сбрасываем счетчик номера варианта $var_number="1"; // Переходим к следующему символу $i=$i+1; continue; } // ---------------------------------// ОБРАБОТКА ВАРИАНТОВ ОТВЕТОВ // ---------------------------------// Если текущий символ указывает на начало варианта if ($form_text[$i]=="/" && $in_variant==false) { $i=$i+1; $in_variant=true; continue; } // Если нашли символ конца определения варианта, а до этого 52
// позиция в тексте была внутри варианта if ($form_text[$i]=="/" && $in_variant==true) { // Мы внутри варианта и видим его конец $in_variant=false; // Получаем идентификатор для следующего варианта $row_var_id = mysql_fetch_array(mysql_query("SELECT max(id_variant) FROM variant")); $current_id_variant=$row_var_id["max(id_variant)"]+1; $variant=str_replace("'", "\'", $variant); mysql_query("INSERT INTO `variant` (`id_variant`, `variant_text`, `v_number`, `id_question`) VALUES ($current_id_variant, '$variant', $var_number, $current_id_question)"); $var_number+=1; $variant=""; $i=$i+1; continue; } $i=$i+1; } // Переходим на главную страницу header("Location: index.php"); ?>
Задания 1. Осуществите экранирование символов «%», «=», «/». Для этого все эти символы, идущие друг за другом, нужно заменить на специальный, соответствующий им в HTML, код (Листинг 13): Листинг 13 $form_text=str_replace("@@", $form_text=str_replace("==", $form_text=str_replace("%%", $form_text=str_replace("//",
Определите верное расположение данного блока кода в обработчике формы в Листинг 12. 2. Поясните, для чего нужно экранирование символов «%», «=», «/», «’». 3. Дополните Листинг 11 таким образом, чтобы пользователь не мог 53
оставить пустым ни одно из полей формы на странице add_form.php. Используйте следующую функцию для проверки формы (приведенный пример только проверяет поле title) (Листинг 14): Листинг 14 function check(obj) { if (obj.title.value=='') { alert("Есть незаполненые поля"); return false; } obj.submit(); }
Пример использования (Листинг 15): Листинг 15
Примечание: тип элемента должен быть button, а не submit. Иначе функция выведет сообщение об ошибке, но не предотвратит выполнение последующих действий. 4*. Выясните, какой максимальный объем данных можно передать с помощью метода POST и вычислите, сколько это символов. Ограничьте общее количество символов, которые можно ввести во все поля формы на странице add_form.php, чтобы объем данных не превысил максимально допустимый. Реализуйте эту проверку с помощью JavaScript. Объясните, почему нельзя использовать атрибут maxlength элемента . Ссылки 1. Обработка форм. – Режим http://www.softtime.ru/info/articlephp.php?id_article=96.
РАБОТА 5. ФОРМИРОВАНИЕ БЛАНКА АНКЕТЫ Цель Научиться делать выборки из БД и формировать из полученных данных форматированный текст с помощью языка разметки гипертекста. Описание задачи Нужно получить из БД формулировки информацию об анкете, формулировки вопросов, варианты ответов и сформировать бланк анкеты. Бланк анкеты можно будет распечатать и дать на заполнение респондентам. Верстка страницы должна осуществляться таким образом, чтобы страница без искажений могла быть распечатана на листе формата А4. Алгоритм решения Необходимо выполнить формирование бланка анкеты. Для этого применяются выборки с помощью команды SELECT из БД, а полученные данные формируются в бланка анкеты. Код сохраните в файле show_blank.php, обращение должно осуществляться следующим образом – show_blank.php?id_form=<идентификатор_анкеты> (Листинг 16). Листинг 16 Бланк анкеты <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
WHERE id_form=$id_form")); // Вывод шапки бланка printf("
%s
", $info["title"]); printf("
%s
", $ info["comment"]); // Делаем выборку всех вопросов из БД $name=mysql_query("SELECT * FROM form, question WHERE form.id_form=question.id_form AND form.id_form='$id_form' ORDER BY number"); while($form_info = mysql_fetch_array($name)) { $ques_id = $form_info["id_question"]; printf("
%s. %s
", $form_info["number"], $form_info["q_text"]); // Выводим информацию и типе вопроса if ($form_info["q_type"]=="o") { echo "Вопрос открытый."; } if ($form_info["q_type"]=="c") { echo "Вопрос закрытый."; } if ($form_info["a_few_answer"]=="1" && $form_info["q_type"]!="o") { echo " Можно выбрать несколько вариантов ответ! "); } if ($form_info["a_few_answer"]!="1" && $form_info["q_type"]!="o") { echo " Укажите ТОЛЬКО один вариант ответа!"; } // Выводим варианты ответов $v_t=mysql_query("SELECT variant_text, v_number FROM variant, form, question WHERE question.id_question='$q' AND question.id_question=variant.id_question AND form.id_form=question.id_form AND form.id_form='$id_form' ORDER BY v_number"); $current_number="1"; // Вывод всех вариантов ответа while($row_var=mysql_fetch_array($v_t)) { $current_number=$row_var["v_number"]; 56
Задания 1. Используя страницу создания бланка анкеты, проверьте результаты работы предыдущей лабораторной работы и убедитесь, что вопросы различных типов добавляются в БД корректно. Устраните найденные ошибки. 2. Измените форматирование бланка анкеты, добившись наиболее удобной формы представления вопросов.
РАБОТА 6. ФОРМИРОВАНИЕ ФОРМЫ ДЛЯ ЗАПОЛНЕНИЯ АНКЕТЫ Цель Сгенерировать в автоматическом режиме форму для ввода ответов на вопросы анкеты. Описание задачи Так как заранее неизвестно содержание вопросов анкет, их количество и варианты ответов, то обработка ответов на вопросы будет производиться следующим образом – на стороне клиента с помощью JavaScript будет формироваться результирующая строка, которая будет содержать в определенном формате все ответы пользователя. Эта строка будет передаваться на сервер и обрабатываться: разбираться по элементам и добавлять ответы в БД для соответствующей таблицы. Алгоритм решения Создайте файл add.php. Алгоритм этого скрипта будет состоять из двух логических частей. Первая часть будет формировать форму и обрабатывающий её JavaScript, который сформирует результирующую строку, и вторая часть – это обработка результирующей строки. Первая часть будет рассмотрена в рамках текущей Работы, вторая – в следующей (Работа 7). Формируем форму, после заполнения которой, все ответы должны быть собраны в результирующую строку. Результирующая строка представляет собой все ответы пользователя, разделенные символом «;». Если вопрос предполагает несколько вариантов ответа (закрытый вопрос с несколькими вариантами ответа), то номера вариантов ответа нужно разделить символами «,». Естественно, в открытом вопросе не должно быть этих символов, поэтому они будут заменяться пробелами – для этого существует функция str_edit(). При формирование формы к анкете в лбом случае добавляется еще три вопроса – дата заполнения (выставляться должна автоматически), аудитория (к какой социальной группе принадлежит респондент, к примеру, студент, рабочий, офисный служащий и так далее) и место проведения (географическая привязка респондента, это может быть город, название учреждения, где проходило анкетирование и так далее). Аудитория и место проведения заданы жесткими списками, то есть по сути являются закрытыми вопросами. Значения этих полей будут храниться в таблице place_audience. `id_place` int(10) unsigned NOT NULL, 58
Создайте таблицу. Добавьте в нее несколько записей. Обратите внимание, значения полей name_place и name_audience не могут быть заполненными в одной записи таблиц. Для каждой записи заполняется только или место проведения (name_place), или аудитория (name_audience). Реализуйте код (Листинг 17): Листинг 17 Добавить ответ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <script language="JavaScript">
DS-test & DS-file ________________________________________________________________________________
// Функция use(); будет перебирать все элементы формы и собирать их // значения во временную переменную, значение которой будет помещено // в специальное поле формы $java_script.="<script language=\"JavaScript\" type=\"text/javascript\">\n \n\n"; echo "$java_script"; $info = mysql_fetch_array(mysql_query("SELECT * FROM form WHERE id_form=$id_form")); $title=$info["title"]; $author=$info["author"]; $comment=$info["comment"]; echo "
"; echo "
Об анкете
Название - $title"); echo " Автор - $author"); echo " Комментарий - $comment
"; echo "
Вопросы
"; // Вывод формы. echo "
$forma_text"; ?>
Дополнительные вопросы
Задание Реализуйте все приведенные алгоритмы. Проверьте на наличие ошибок, исправьте их.
РАБОТА 7. ОБРАБОТКА ФОРМЫ ЗАПОЛНЕННОЙ АНКЕТЫ Цель Добавить введенные пользователем ответы на анкету в БД. Описание задачи На предыдущем этапе мы получили скрипт, который формирует следующие данные и передает их самому себе для обработки: query – результирующую строку вида «xxx;…;y,z,w;;…», которая хранит ответы пользователя; date - дата заполнения; place – место заполнения; audience – аудитория; id_form –идентификатор анкеты. Полученные таким образом данные нужно обработать и добавить в соответствующие таблицы БД. Алгоритм решения Дополним модуль add.php кодом из соответствующего листинга (Листинг 18). Если переменная $query не пустая, значит результирующая строка уже сформирована, а значит, что пользователь уже заполнил анкету и можно добавлять ответы в БД. Так как форма, передающая значение результирующей строки, передает данные с помощью метода POST, то принимать значения будем из глобального массива $_POST. Листинг 18 $query=$_POST["query"]; // Если результирующая строка не пустая if ($query!="") { // Получаем данные из глобального массива $id_form=$_POST["id_form"]; $date=$_POST["date"]; $place=$_POST["place"]; $audience=$_POST["audience"]; // Объявляем временные переменные $current_number=0; $i=0; $history_created=false; $global_query=""; $too_big=false; // Обрабатываем результирующую строку 65
$query=str_replace(",,", ",", $query); $query=str_replace(", ;", ";", $query); $query=str_replace(",;", ";", $query); // Получаем идентификатор следующей записи в таблице // history $row_id_ans=mysql_fetch_array(mysql_query(" SELECT max(id_answer) FROM answer")); $current_id_answer=$row_id_ans["max(id_answer)"]+1; // Разбиваем результирующую строку в массив $field_info // разделив его по символу «;»
array explode (string separator, string string [, int limit]). Возвращает массив строк, полученных разбиением строки string с использованием separator в качестве разделителя. Если передан аргумент limit передан, массив будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string. Если separator - пустая строка (""), explode() возвращает FALSE. Если separator не содержится в string, то explode() возвращает массив, содержащий один элемент string. По историческим причинам, функции implode() можно передавать аргументы в любом порядке, но для explode() это недопустимо. separator всегда должен содержать разделитель, а string - исходную строку. В PHP имеется конструкция foreach, напоминающая аналоги из Perl и некоторых других языков. Она даёт простой способ итерировать по массиву. Есть два вида синтаксиса: второй является расширением первого и используется реже: foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement Первый вид циклически проходит по массиву, заданному в array_expression. При каждом проходе значение текущего элемента присваивается переменной $value, а внутренний указатель массива передвигается на единицу (поэтому при следующем проходе вы просмотрите значение следующего элемента). Второй вид выполняет то же самое, но ключ текущего элемента присваивается переменной $key. Примечание: при старте foreach внутренний указатель массива автоматически устанавливается на первый элемент массива. Это означает, что вам не нужно вызывать reset() перед началом выполнения цикла foreach. Примечание: обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, 66
указатель массива не изменяется и изменения в возвращаемом элементе массива не влияют на массив-оригинал. Продолжение листинга $field_info=explode(";", $query); foreach ($field_info as $temp) { $current_number+=1; // Читаем из базы формат вопроса и ответов на него $ques_q=mysql_query("SELECT id_question, q_type, a_few_answer FROM form, question WHERE form.id_form=$id_form AND question.number=$current_number AND form.id_form=question.id_form"); $row_ques_q=mysql_fetch_array($ques_q); $id_question=$row_ques_q["id_question"]; // Создаем запись о заполненной анкете if (!$history_created) { $row12 = mysql_fetch_array(mysql_query(" SELECT max(id_filled_form) FROM history")); $id_filled_form=$row12["max(id_filled_form)"]+1; // В переменную global_query сохраняем все запросы к БД, // чтобы потом выполнить их разом $global_query.="INSERT INTO `history` (`id_filled_form`, `date`, `place`, `audience`) VALUES ($id_filled_form, '$date', '$place', '$audience');"; $history_created=true; } //-------------------------------------// Если вопрос закрытый //-------------------------------------if ($row_ques_q["q_type"]=="c") { if ($row_ques_q["a_few_answer"]!="1") { // Один вариант ответа 67
$id_filled_form); "; $current_id_answer+=1; } } // Разбиваем строку со всеми запросами на массив, // а затем выполняем каждый запрос $query_array=explode(";", $global_query); foreach ($query_array as $a) { mysql_query("$a"); } }
resource mysql_query(string query [, resource link_identifier] ) mysql_query() посылает запрос активной базе данных сервера, на который ссылается переданный указатель. Если параметр link_identifier опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect() без параметров. Результат запроса буфферизируется. Замечание: Строка запроса НЕ должна заканчиваться точкой с запятой. Только для запросов SELECT, SHOW, EXPLAIN, DESCRIBE, mysql_query() возвращает указатель на результат запроса, или FALSE если запрос не был выполнен. В остальных случаях (INSERT, UPDATE, DELETE, DROP), mysql_query() возвращает TRUE в случае успешного запроса и FALSE в случае ошибки. Значение не равное FALSE говорит о том, что запрос был выполнен успешно. Он не говорит о количестве затронутых или возвращённых рядов. Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда. Следующий запрос составлен неправильно и mysql_query() вернёт FALSE: Пример использования mysql_query() (Листинг 19): Листинг 19
Следующий запрос ошибочен, если колонки my_col нет в таблице my_tbl, в таком случае mysql_query() вернёт FALSE: Пример использования mysql_query() (Листинг 20): 69
mysql_query() также считается ошибочным и вернёт FALSE, если у вас не хватает прав на работу с указанной в запросе таблицей. Работая с результатами запросов, вы можете использовать функцию mysql_num_rows(), чтобы найти число, возвращённых запросом SELECT, рядов, или mysql_affected_rows(), чтобы найти число рядов, обработанных запросами DELETE, INSERT, REPLACE, или UPDATE. Только для запросов SELECT, SHOW, DESCRIBE, EXPLAIN, функция mysql_query() возвращает указатель на результат, который можно использовать в функции mysql_fetch_array() и других функциях, работающих с результатами запросов. Когда работа с результатом окончена, вы можете освободить ресурсы, используемые для его хранения, с помощью функции mysql_free_result(), хотя память в любом случае будет очищена в конце исполнения скрипта. Задания 1. Реализуйте указанный алгоритм. Проверьте правильность выполнения программного кода. 2*. Измените алгоритм так, чтобы при выполнении каждого запроса из переменной $global_query осуществлялся контроль успешности выполнения запроса, а при возникновении ошибки выведите на страницу текст ошибки, возвращенной СУБД. 3. Создайте осмысленную анкету. Заполните ее различными ответами 10 раз. Ссылки 1. Функция mysql_query(). – Режим http://www.php.ru/manual/function.mysql-query.html.
РАБОТА 8. ПЕРВИЧНАЯ СТАТИСТИЧЕСКАЯ ОБРАБОТКА ЗАПОЛНЕННЫХ АНКЕТ Цель Подсчитать результаты анкетирования в виде описательной статистики. Описание задачи Теперь, когда у вас работает алгоритм создания анкеты и добавления ответов, логично будет подсчитать сколько человек ответили на каждый вопрос анкеты в соответствии с вариантами ответов. Алгоритм решения Необходимо выбрать из БД первый вопрос. Если он закрытый, то сделать выборку, сколько всего пользователей ответили на вопросы анкеты и сколько пользователей выбрали первый вариант и разделить значения друг на друга. И так далее по всем вариантам первого вопроса. Далее просматриваются все остальные вопросы. Если вопрос открытый, то для него никакой статистики считать нет смысла, поэтому такие вопросы будут просто пропускаться. Реализуйте код (Листинг 21). Листинг 21
$question=mysql_query("SELECT question.* FROM form, question WHERE form.id_form=$id_form AND form.id_form=question.id_form ORDER BY number"); // Запрос для получения количества ответов на анкету $how_many=mysql_query("SELECT count(DISTINCT `answer`.`id_filled_form`) FROM `answer`, `form`, `history`, `question` WHERE `form`.`id_form`=`question`.`id_form` AND `history`.`id_filled_form`=`answer`.`id_filled_form` AND `answer`.`id_question`=`question`.`id_question` AND `form`.`id_form`=$id_form"); // Если нет ни одного ответа if ($how_many==NULL) { echo "Нет ни одной заполненной анкеты
"; die; } else { $how_many_f=mysql_fetch_array($how_many); // Общее количество ответов на анкету $all_filled=$how_many_f["count(DISTINCT `answer`.`id_filled_form`)"]; if (empty($all_filled) || $all_filled==0) { echo "Нет ни одной заполненной анкеты!
"; die; } } echo echo echo echo
"
Название - $title"; " Автор - $author"; " Комментарий - $comment
"; "
Статистика ответов
";
while ($row=mysql_fetch_array($question)) { $id_question=$row["id_question"]; echo "
\n"; // Закрытый вопрос if ($row["q_type"]=="c") { 72
", $row["number"], $row["q_text"]); $for_save.=$row["number"] . ". " . $row["q_text"] . "\n"; if ($row["a_few_answer"]=="1" && $row["q_type"]!="o") { echo "Несколько вариантов ответа!"; } if ($row["a_few_answer"]!="1" && $row["q_type"]!="o") { echo "По одному варианту ответа!"; } $variant=mysql_query("SELECT * FROM variant WHERE id_question='$id_question' ORDER BY v_number"); while ($row_var=mysql_fetch_array($variant)) { // Сколько ответили на каждый вариант $id_var=$row_var["id_variant"]; $resp=mysql_fetch_array(mysql_query("SELECT count(id_answer) FROM `answer`, `history` WHERE answer.id_filled_form=history.id_filled_form AND id_variant=$id_var")); $count=$resp["count(id_answer)"]; // Подсчет процента ответов на этот вариант ответа $procent=number_format(($count/$all_filled)*100, 3);
string number_format (float number [, int decimals]) string number_format (float number, int decimals, string dec_point, string thousands_sep). number_format() возвращает отформатированное число number. Функция принимает один, два или четыре аргумента (не три): Если передан только один аргумент, number будет отформатирован без дробной части, но с запятой («,») между группами цифр по 3. Если переданы два аргумента, number будет отформатирован с decimals знаками после точки («.») и с запятой («,») между группами цифр по 3. Если переданы все четыре аргумента, number будет отформатирован с decimals знаками после точки и с разделитилем между группами цифр по 3, при этом в качестве десятичной точки будет использован dec_point, а в качестве разделителя групп - thousands_sep. Используется только первый символ строки thousands_sep. Например, при передаче foo в качестве thousands_sep для форматирования числа 1000, number_format() возвращает 1f000. 73
\n", $row_var["v_number"], $row_var["variant_text"], round($procent)); $for_save.="\t" . $row_var["v_number"] . ". " . $row_var["variant_text"] . " = $procent%; $count из $all_filled.\n"; } // Анкеты без ответа на текущий вариант вопроса $resp=mysql_fetch_array(mysql_query("SELECT count(`id_answer`) FROM `answer`, `history` WHERE answer.id_filled_form=history.id_filled_form AND `id_variant` IS NULL AND `answer`.`id_question`=$id_question")); $count=$resp["count(`id_answer`)"]; $procent=number_format(($count/$all_filled)*100, 3); printf("
\n
-
\n
Без ответа
\n
$procent %%
$count из $all_filled
\n
\n", round($procent)); $for_save.="\t- Без ответа $procent %; $count из $all_filled.\n"; echo "