Учебное пособие: Тег FORM, параметр action
Название: Тег FORM, параметр action Раздел: Остальные рефераты Тип: учебное пособие | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования «ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ »
Утверждаю Декан (директор) С. А. Гайворонский « » 2009 г.
А.А. Пономарев
Разработка пользовательского интерфейса к БД в СУБД MySQL Методические указания к выполнению лабораторных работ по курсу «Базы данных» для студентов III курса специальностей 230105 «Программное обеспечение вычислительной техники и автоматизированных систем». 230201 «Информационные системы и технологии». Издательство Томского политехнического университета 2009 УДК 681.324.016 ББК 00000 П00 Пономарев А.А. П00 Базы данных: методические указания по выполнению лабораторного практикума для студентов специальностей 230105 « Программное обеспечение вычислительной техники и автоматизированных систем» , 230201 « Информационные системы и технологии». В трех частях, часть третья. /Сост. А.А. Пономарев. – Томск: Изд-во ТПУ, 2009. – 32 с. УДК 681.324.016 ББК 00000 Методические указания рассмотрены и рекомендованы « 29 » октября 2009 г. Зав. кафедрой АиКС доктор технических наук __________Г.П. Цапко Председатель учебно-методической комиссии __________Е.А. Кочегурова Рецензент Доктор технических наук, профессор Д.Г. Копаница © Пономарев А.А., 2009 © Томский политехнический университет, 2009 ©Оформление. Издательство Томского Оглавление Общие сведения о языке разметки HTML. 4 Лабораторная работа №1. Изучение разметки HTML-документов. 11 Лабораторная работа №2. Формирование навыков создания HTML-документов. 13 Лабораторная работа №3 Формирование Perl скрипта и его вызов из Html формы. 14 Лабораторная работа №4 Формирование Perl скрипта, взаимодействующего с HTML формой и СУБД MySQL 22 Общие сведения о языке разметки HTML
HTML (от англ. HyperText Markup Language — «язык разметки гипертекста») — стандартный язык разметки документов во Всемирной паутине. Большинство веб-страниц создаются при помощи языка HTML (или XHTML). Язык HTML интерпретируется браузером и отображается в виде документа, в удобной для человека форме. HTML является приложением SGML (стандартного обобщённого языка разметки) и соответствует международному стандарту ISO 8879. Язык HTML был разработан британским учёным Тимом Бернерсом-Ли приблизительно в 1991—1992 годах в стенах Европейского совета по ядерным исследованиям в Женеве (Швейцария). HTML создавался как язык для обмена научной и технической документацией, пригодный для использования людьми, не являющимися специалистами в области вёрстки. HTML успешно справлялся с проблемой сложности SGML путём определения небольшого набора структурных и семантических элементов — дескрипторов. Дескрипторы также часто называют «тегами». С помощью HTML можно легко создать относительно простой, но красиво оформленный документ. Помимо упрощения структуры документа, в HTML внесена поддержка гипертекста. Мультимедийные возможности были добавлены позже. Изначально язык HTML был задуман и создан как средство структурирования и форматирования документов без их привязки к средствам воспроизведения (отображения). В идеале, текст с разметкой HTML должен был без стилистических и структурных искажений воспроизводиться на оборудовании с различной технической оснащённостью (цветной экран современного компьютера, монохромный экран органайзера, ограниченный по размерам экран мобильного телефона или устройства и программы голосового воспроизведения текстов). Однако современное применение HTML очень далеко от его изначальной задачи. Например, тег <TABLE>, несколько раз использованный для форматирования страницы, которую вы сейчас читаете, предназначен для создания в документах самых обычных таблиц, но, как можно убедиться, здесь нет ни одной таблицы. С течением времени, основная идея платформонезависимости языка HTML была отдана в своеобразную жертву современным потребностям в мультимедийном и графическом оформлении. Структура документаHTML — это теговый язык разметки документов. Любой документ на языке HTML представляет собой набор элементов, причём начало и конец каждого элемента обозначается специальными пометками — тегами . Элементы могут быть пустыми , то есть не содержащими никакого текста и других данных (например, тег перевода строки <br>). В этом случае обычно не указывается закрывающий тег. Кроме того, элементы могут иметь атрибуты , определяющие какие-либо их свойства (например, размер шрифта для элемента font). Атрибуты указываются в открывающем теге. Вот примеры фрагментов HTML-документа: <html> <META NAME="Author" CONTENT="Ваше имя "> <title>Тег FORM, параметр action</title> HTMLТег <HTML> и парный ему </HTML>. Тег <HTML> указывает программе просмотра страниц что это HTML документ HEADТег <HEAD> и парный ему </HEAD>. Тег <HEAD> определяет место, где помещается различная информация не отображаемая в теле документа. Здесь располагается тег названия документа и теги для поисковых машин BODYТег <BODY> определяет видимую часть документа.В этом разделе располагается вся содержательная часть документа (текст статьи, фотографии, формы для заполнения, другие объекты).Тег имеет ряд необязательных атрибутов
FormТег <FORM> устанавливает форму на веб-странице. Форма предназначена для обмена данными между пользователем и сервером. Область применения форм не ограничена отправкой данных на сервер, с помощью клиентских скриптов можно получить доступ к любому элементу формы, изменять его и применять по своему усмотрению. Документ может содержать любое количество форм, но одновременно на сервер может быть отправлена только одна форма. По этой причине данные форм должны быть независимы друг от друга. Для отправки формы на сервер используется кнопка Submit, то же самое можно добиться, если нажать клавишу <Enter> в пределах формы. Если кнопка Submit отсутствует в форме, клавиша <Enter> имитирует ее использование, но только в том случае, когда в форме имеется только один элемент <INPUT>. Если таких элементов два и более, нажатие на <Enter> не вызовет никакого результата. Когда форма отправляется на сервер, управление данными передается CGI-программе, заданной параметром action тега <FORM>. Предварительно браузер подготавливает информацию в виде пары «имя=значение», где имя определяется параметром name тега <INPUT>, а значение введено пользователем или установлено в поле формы по умолчанию. Если для отправки данных используется метод GET, то адресная строка может принимать следующий вид.
МеткиВ случае, когда используются переходы внутри текущей страницы, на ней должны быть расставлены метки:
Пример меток в тексте: <A name=”metka1”> </A> <A name=”metka2”> </A> Во FrontPage можно выбрать пункт bookmark в подменю Insert.
Текст подсказки <A href=”#Метка”> Текст для щелчка </A>. Пример ссылок на метки: <A href=”#metka1”> Ссылка на первую метку </A> <A href=”#metka2”> Ссылка на вторую метку </A> Карты изображений Спецификация HTML позволяет представлять изображения в виде гипертекстовой ссылки. При щелчке на данном изображении вы переходите к указанному документу. Если вы хотите организовать ссылки на разные документы, то это можно сделать при помощи трех или четырех мелких изображений (иными словами, пиктограмм), каждое из которых предлагает иной выбор. Но существует и другой метод - карты изображений (Image Map). В этом случае переход по ссылке зависит от того, на какую часть изображения вы указываете при щелчке. Таким образом, одно изображение оказывается вектором с указанием на несколько возможных путей. Применение карт изображений предполагает, что браузер Web каким-то образом взаимодействует с процессом на сервере Web: он должен передавать координаты местоположения курсора при щелчке. Технология Image Map применяется в самых различных областях. Однако наиболее часто ее применение можно увидеть при создании графических меню, когда создается одно большое изображение с элементами меню, и каждому участку изображения предписывается какое либо действие. Так же применять данную технологию можно при создании простых ГИС-подобных систем с картографическими возможностями. Чтобы включить поддержку карты для изображения, необходимо ввести дополнительный параметр в тэг IMG:
Параметр USEMAP указывает, в каком месте находится карта описываемого изображения. Карта изображения определяет, какому участку изображения какой URL соответствует. Карта изображения может находиться в том же документе, что и изображение, или в другом документе. <MAP NAME="map_name"> <AREA [SHAPE=" shape "] COORDS="x,y,..." [ HREF =" reference "] [ NOHREF ]> </ MAP >
Лабораторная работа №1. Изучение разметки HTML-документовЗАДАНИЕ 1. Сформировать HTML документ. При оформлении которого использовать теги HTML, META, HEAD, BODY, FORM, INSERT. Разместить на нем произвольную информацию с использованием шрифтов различного размера, таблиц, нумерованного и ненумерованного списка. 2. Создать страницу ссылок на ресурсы сети, обязательно с использованием фреймов. Имена файлов должны иметь маленькие латинские буквы! В левом фрейме создать рубрики, оформить созданные ссылки в виде списка (тег <UL>) в правом фрейме соответственно создать ссылки с названием и кратким описанием ресурсов. - для поисковых систем, ссылки оформить в виде таблицы из двух колонок и нескольких строк. В левой колонке поместить рисунки-логотипы поисковых систем, в правой - гиперссылки на эти системы. (ссылки http://www.yandex.ru/, http://www.rambler.ru/, http://www.aport.ru/, http://www.google.com/, http://www.filesearch.ru/). 3. Сделать ссылку на эту страницу с главной страницы. 4. Разместить файлы на сервере и просмотреть в браузере, проверить работоспособность всех ссылок. Лабораторная работа №2. Формирование навыков создания HTML-документовЗАДАНИЕ 1. Познакомиться с файлом настроек Apache http.conf 2. Запустить сервер Apache. Разместить в рабочей директории документы html 3. Для обеспечения навигации использовать относительные ссылки. 4. Включить в ранее созданные страницы директивы SSI: DOCUMENT_NAME DATE_LOCAL LAST_MODIFIED 5. Сделайте автоматическое обновление первой страницы каждую минуту. 6. Создайте новую страницу, и сделайте автоматическое перенаправление на www.tpu.ru , с временем ожидания 10 секунд, на странице напишите "Через 10 секунд вы будите автоматически перенаправлены на сайт www.tpu.ru. 7. Создайте ссылки на разделы документа с использованием меток. 8. Разместите изображение на странице и выделите области локализации для ссылок на сервера
www.kazan.ru – Казань www.spb.ru – С. – Петербург www.novosibirsk.ru – Новосибирск www.norilsk.ru – Норильск www.tomsk.ru – Томск www.magadan.ru – Магадан Лабораторная работа №3 Формирование Perl скрипта и его вызов из Html формы.Цель работы: Создать функционирующее приложение для демонстрации работы циклов в PERL. Изучить этапы создания Perl-программ и способ его вызова через HTML форму.
Perl программа (скрипт) состоит из последовательности деклараций и предложений. Единственно что должно быть обязательно декларировано это форматы отчетов и подпрограммы (функции). Все не объявленные переменные, массивы, имеют значение 0 или null. Perl имеет свободный формат, комментарии начинаются с символа '#' и продолжаются до конца строки. Декларации могут использоваться в любом месте программы так же как и предложения (statements) но действуют они только в фазе компиляции программы. Обычно их помещают или в начале или в конце программы. Декларация подпрограмм позволяет использовать имя подпрограммы как списковый оператор, начиная с момента декларирования. Для проверки работоспособности Perl в среде web создайте в директории d:\usr\cgi-bin файл test.pl с таким содержанием: #!/usr/local/perl/bin/perl print "Content-type: text/plain\n\n"; print 5+5; Обратите внимание на первую строчку в скрипте. В нашем случае она указывает Apache, что Perl расположен в d:\usr\local\perl\bin\perl.exe. Вы указывайте свой путь.
Тип данных в PERL Типы данных используются в программах при объявлении переменных. Тип данных определяет то множество значений, которые может принимать переменная, а также набор операций, которые программа может выполнять с ней. В языке Perl данные могут быть числом или строкой символов. В качестве внутреннего представления всех чисел используется формат с плавающей запятой двойной точности (double). Иными словами, среди внутренних форматов нет целочисленного. Тем не менее, в большинстве случаев вы можете не обращать на это внимания, и Perl сделает все сам как надо. Например, если вы используете величины в контексте, где только целочисленные значения имеют смысл, Perl сам автоматически усечет число. Примечание: Если вы программируете на С и использовали целочисленное деление с усечением целых чисел автоматически, то, программируя на языке Perl, надо не забыть выполнить усечение вручную, используя функцию int(). Следующая команда иллюстрирует, как Perl обрабатывает числа целого типа и с плавающей запятой: print 6 & 3; # выведет 2 print 6.9 & 3.1 # print 7 / 2 # выведет 2.3333 не целое print int(7/3) # выведет 2 Точно так же, как Perl преобразует числа с плавающей запятой в целые числа: когда скрипт использует целочисленные значения, он также преобразует числа в строки и наоборот, когда такое преобразование имеет смысл. Например, если скрипт использует числа в контексте, где только строки имеют смысл, например, при соединении строк, он конвертирует числа в строки. Аналогичным образом, если требуется использовать строки там, где только числа имеют смысл, то Perl конвертирует их в числа. Работая со скриптами Perl, обычно не надо беспокоиться о внутреннем представлении скалярных величин. Perl поддерживает также концепцию булевых значений, но не имеет для их описания специального типа. Как и в С, численное значение рассматривается истинным, если оно не равно нулю. Дополнительно строковое значение рассматривается как истинное, если оно не равно '' или '0'. Некоторые булевы операторы, такие как <>> (больше), возвращают единицу в качестве значения<истинно> и нуль - в качестве <ложно>. Тем самым, ваш скрипт должен просто рассматривать ненулевые величины как строчного типа, так и числового в качестве булева значения <истинно>. Скрипты Perl могут группировать скалярные величины вместе и создавать список (list). Если скрипт хранит список в какой-то переменной, то эта переменная становится массивом (array).
Переменные. Скалярные переменные Как отмечалось, скалярная переменная может содержать единственное значение. В языке Perl имена скалярных переменных всегда начинаются со знака ($). В еле дующем выражении скалярной переменной $age присваивается значение 35, а переменной $name строковое значение <Bob>. Затем используется функция print для вывода значения каждой из переменных: $age = 35; $name = 'Bob'; print ($name,'is',$age); Переменные. Массивы
Как было сказано выше, массивы представляют собой переменные, принимающие в качестве значения список из скалярных величин. Следующий текст программы на языке Perl иллюстрирует объявление переменных типа массив и их инициализацию: @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); print(@days); # выведет 'SunMonTueWedThuFriSat' print($days[4]); # выведет 'Thu' @weekdays=@days[1..5];значение ('Mon','Tue','Wed','Thu','Fri') @emptylist = (); # пустой список Ссылка на переменные типа <массив> обычно начинается со знака (@) и сопровождается значениями в квадратных скобках ([ ]).Как и в программировании на языке С, индексами массивов для скриптов всегда являются переменные целого типа, которые обычно начинаются с нулевого значения. Третье выражение ($days[4]) служит примером массива, который ссылается на скалярное значение. Поскольку он содержит только один элемент, результирующее значение представляет собой скаляр. Если использовать знак ($) вместо знака (@), то скрипт будет ссылаться на скалярную величину. Это замечание является очень важным. Квадратные скобки указывают, что скрипт ссылается на массив. Знак $, в свою очередь, означает ссылку на скалярную величину. Инициализация массива @weekdays осуществляется путем выборки части массива @days. В предыдущем примере массив @days использовался без индекса. Когда индекс опущен, Perl ссылается на весь массив. Аналогичным образом, в предыдущем примере массив @days инициализировался списком литералов. Кроме того, что массиву могут присваиваться в качестве значений литералы, скрипт может также присваивать массивам значения переменных или даже других массивов, как показано ниже: @stuff = ($age, $name) @FriendsOfMine = ('Joe','Mary', @FriendsOfYours); В следующем примере используются части массивов: @weekend = @days[0,6] ; # результат ('Sun','Sat') print (@days[1..5,0,6]); # выведет 'MonTueWedThuFriSunSat' Если скрипт использует переменную типа массив в контексте скаляра, то значением служит число элементов массива. Скалярным контекстом является такой контекст, где только скалярные значения имеют смысл. Например, следующее выражение использует скалярный контекст для массива stuff для того, чтобы определить число элементов, содержащееся в массиве. Если число элементов, больше или равно 2, то скрипт выдает сообщение и заканчивает исполнение: (@stuff >= 2) || die "Too much stuff! \n"; Функция die служит директивой языку Perl закончить выполнение и выдать при этом указанное сообщение. Если сообщение не содержится, то функция просто заканчивает выполнение скрипта. Perl также поддерживает специальную конструкцию $# переменная, которая возвращает последнее значение индекса в массиве. Например, следующее выражение for использует $[ для того, чтобы определить начальное значение индекса массива, и $# для определения последнего из элементов массива. При этом с помощью выражения for выводятся значения каждого из элементов: for ($i =$[; $i <= $#stuff; $i++) { print $stuff[$i]; } Записанный цикл for можно заменить следующим эквивалентным выражением: Print @stuff;
Условия Последовательность простых предложений ограниченная функциональными ограничителями называется блоком. В Perl это может быть целый файл, последовательность предложений в операторе eval{} или чаще всего это множество простых предложений ограниченных круглыми скобками '{}'. Существуют следующие виды сложных предложений: if (EXPR) BLOCK if (EXPR) BLOCK else BLOCK if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK LABEL while (EXPR) BLOCK LABEL while (EXPR) BLOCK continue BLOCK LABEL for (EXPR; EXPR; EXPR) BLOCK LABEL foreach VAR (LIST) BLOCK LABEL BLOCK continue BLOCK Обратите внимание, что сложные предложения описаны в термах блоков а не предложений как в языках C или Pascal. Поэтому необходимо всегда использовать круглые скобки для обозначения блока. if ( EXPR ) BLOCK - Вычисляется логическое выражение EXPR и если true блок выполняется. Пример 1: $var =1; if ($var == 1) { print $var,"\n"; } Результат: 1 if (EXPR) BLOCK else BLOCK2 - Если EXPR=true выполняется BLOCK иначе BLOCK2. Пример 2: $var =2; if ($var == 1) { print "\$var = 1\n"; } else { print "\$var не равно 1\n"; } Результат: $var не равно 1 if (EXPR1) BLOCK1 elsif (EXPR2) BLOCK2 ... else BLOCK - Если EXPR1=true выполняется BLOCK1 иначе если EXPR2=true выполняется BLOCK2 иначе ... иначе BLOCK. Пример 3: $var = 1; if ($var == 0) { print "\$var = 0\n"; } elsif ($var == 1) { print "\$var = 1\n"; } else { print "Не известное \$var\n"; } Результат: $var = 1 Цикл while выполняет BLOCK до тех пор пока EXPR = true. Метка LABEL не обязательна и состоит из идентификатора завершающегося символом ':'. Метка необходима при использовании внутри блока цикла управляющих операторов next, last и redo. Если метка все же отсутствует, то эти операторы ссылаются к началу ближайшего цикла. Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предложении for поэтому в этом блоке удобно изменять счетчики и флаги цикла даже если применяется оператор next. Операторы управления циклом next - подобен continue в С. Переходит к началу текущего цикла т.е. повторяет итерацию. Пример 4: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 next M1 if $i < 3; # Переходим в начало если $i < 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 1 2 4 6 last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается. Пример 5: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 last M1 if $i > 3; # Выход из цикла если $i > 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 2 4 redo - начать новый цикл не вычисляя EXPR и не выполняя continue блок. Пример 6: M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 redo M1 if $i == 3; # Далее пропустить для $i = 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } Результат: 2 5 7 Цикл for LABEL for (EXPR1; EXPR2; EXPR3) BLOCK Оператор for полностью аналогичен оператору for в С. В перед началом цикла выполняется EXPR1, если EXPR2 = true выполняется блок, затем выполняется EXPR3. Пример 7: for ($i = 2; $i < 5; ++$i) { print $i, " "; } print "\nПосле цикла i = $i\n"; Результат: 2 3 4 После цикла i = 5 Цикл foreach. LABEL foreach VAR ( LIST ) BLOCK Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущенно то элементы присваиваются встроеной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы. Пример 8: @месяц = ("январь","февраль","март"); # Создали массив foreach $i (@месяц) { print $i," "; # Печать $i } Результат: январь февраль март Пример 13: @месяц = ("январь","февраль","март"); # Создали массив foreach $i (@месяц) { $i = uc($i); # Перевели в верхний регистр } print @месяц; Результат: ЯНВАРЬФЕВРАЛЬМАРТ Пример 14: for $i (3,5,7) { print "$i "; } Результат: 3 5 7 Как видно из представленного описания, в Perl существует большое количество средств организации циклов. Выбирайте конкретные реализации, по своему вкусу, исходя из предложенной задачи. Далее рассматривается вопрос взаимосвязи СУБД MySQL и языка программирования. Задание . Создайте скрипт, демонстрирующий работу циклов, согласно примеров №№1-14. Результат работы скриптов представьте в web броузере. Лабораторная работа №4 Формирование Perl скрипта, взаимодействующего с HTML формой и СУБД MySQLЦель работы: Создать функционирующее приложение для обеспечения сохранения введенных пользователем через HTML форму данных в БД под управлением MySQL. В данной работе рассмотрены приемы для реализации клиент серверного взаимодействия. Подробно описаны этапы создания Perl программ. Приведены примеры работающих приложений. В лабораторных работах предполагается использование web сервера APACHE. Рассмотрение параметров настройки web сервера и его установка не входит в программу данного курса. Студентам необходимо знать, что в представленном варианте сервера он настроен на следующее дерево директорий:
В случае отсутсвия диска в можно воспользоваться командой Subst создания виртуального диска (вводится через командную строку, кнопка Пуск/ Выполнить): SUBST disk1: disk2:\path где disk1: - буква назначаемого виртуального диска, disk2:\path - полный путь к каталогу (папке), который заменяется на виртуальный диск. Таким образом для создания диска в и расположения в ней директории USR необходимо последнюю расположить в следующей за корневой директории. Например С:/11/USR. Затем воспользоваться командой SUBST D: "c:/11" после чего появиться диск в и на нем будет располагаться содержимое директории C:/11. Для организации взаимодействия наших Perl-программ с СУБД MySQL необходимо, чтобы в поставку Perl входил модуль DBI. Поскольку модуль в основном ничего сам не делает, а перекладывает все операции по взаимодействию с базами данных на соответствующий им драйвер, то требуется установка библиотеки DBD-Mysql (драйвер к БД MySQL для модуля DBI). По мнению автора и разработчика модуля, «DBI — это API-интерфейс для организации доступа к базам данных из Perl-программ. Спецификация DBI API определяет набор функций, переменных и правил, используемых для прозрачного интерфейса с базами данных». Концепция драйверов баз данных весьма удобна, поскольку в своем Perl-приложении вы используете стандартные для DBI вызовы, которые затем переадресуют модули соответствующему драйверу, а тот, в свою очередь, уже напрямую будет взаимодействовать с БД, не требуя от вас изучения технических особенностей каждой конкретной СУБД. Таким образом, существуют драйверы DBD::Sybase, DBD::Oracle, DBD::Informix и т.д. (рис. 1, 2). Рисунок 1 - Архитектура DBI Рисунок 2 - Поток данных через интерфейс DBI Для упрощения исходного кода во второй части Perl программы (Чтение входных данных) для передачи большого количества информации из разных полей зачастую используются уже созданные библиотеки, существенно упрощающие написание исходного кода. #!/usr/local/perl/bin/perl #Подключение необходимой библиотеки (Убедитесь что она находится в директории с Perl)require "cgi-lib.pl";&ReadParse(*input);#Следующая строка выводит все переменные переданные на скриптprint &PrintVariables(*input);После выполнения этой подпрограммы с использованием библиотеки cgi - lib и функции &ReadParse(*input), можно обращаться к введенным данным используя обращение следующего вида $input{'name'} где name – имя поля в которой осуществлялся ввод данных в форме HTML.
Пример: Использование в скрипте следующей конструкции: print "<I><B>Имя</B></I>=$input{'name'}<BR>\n";выведет на экран введенное в HTML форме в поле 'name' содержимое. Основным заданием данной работы будет создание HTML-форм для ввода, просмотра, изменения, добавления данных в БД и разработки CGI-программ на Perl в целях обработки этой формы и последующего размещения документа в базе данных. Напомним, что CGI (Common Gateway Interface) — протокол, механизм, или формальное соглашение между Web-сервером и отдельной программой. Сервер кодирует входные данные, например HTML-формы, а программа CGI декодирует их и генерирует поток выходных данных. В спецификации протокола ничего не сказано о каком-либо определенном языке программирования. Поэтому программы, соответствующие этому протоколу, могут быть написаны практически на любом языке — на C, C++, Visual Basic, Delphi, Tcl, Python или, как в нашем случае, на Perl. Взаимодействие приложений MySQL и Perl предлагается осуществлять с помощью вебсервера Apache. Все программы написанные на Perl после отладки должны быть расположены в директории / cgi - bin / bd _ name _ num из домашней директории вебсервера, а html документы в директории www / bd _ name _ num , где bd_name_num имя базы данных и номер варианта. Это необходимо учитывать при указании пути для вызова своего исполняемого файла из html формы, например использование конструкции вида:<form action=/cgi-bin/ bd_name_num/example.pl method=get>, обеспечит запуск необходимого файла из директории / cgi - bin / bd _ name _ num /. Для того, чтобы PERL мог выводить данные в HTML форме пользуйтесь конструкцией: # Вывод http-заголовкаprint "Content-type: text/html\n\n"; после которой можно выводить любые данные на форму с использованием тэга print, как в предыдущей работе: print "<h3>Спасибо, что заполнили форму</h3>\nНажмите "; Для выполнения любых операций с БД, посредством программ, написанных на PERL, необходимо произвести подключение с серверу MYSQL следующей конструкцией в составе программы: # Подключение к базе$dbh = DBI->connect("DBI:mysql:database=$database", $opt_user,$opt_password) || die "Can't connect: $DBI::errstr\n"; где $database , $opt_user , $opt_password имя базы данных, имя пользователя, значение пароля соответственно.После подключения к БД можно выполнять любые операции с ней, разрешенные для пользователя, с учетной записью которого было совершено подключениеЭтапы создания скрипта 1. Создать форму для вызова скрипта. 2. Создать сам скрипт. 3. Отладить скрипт. Проверить отсутствие ошибок (если это возможно, лучше проверить все возможные пути выполнения программы). 4. Поместить скрипт на сервер и не забыть дать ему права на выполнение. 5. Связать скрипт с формой, вставив его имя в параметр action тэга form. Например: <form action=/cgi-bin/ bd_name_num/example.pl method=get > 6. Убедиться, что скрипт правильно работает вместе с формой. Основные части Perl скрипта В общем случае любой Perl скрипт состоит из четырех ключевых частей: 1. Настройка. Первая часть скрипта обязательно запускает интерпретатор и устанавливает переменный, используемые в теле скрипта. Для запуска интерпретатора необходимо знать правильный путь к программе. 2. Чтение входных данных. Эта часть "считывает" и сохраняет в переменных входные данные в удобной для обработки форме. Эта часть обычно неизменна во всех скриптах. 3. Обработка входных данных. Эта часть соответствующим образом обрабатывает введенные данные. Она может быть простой (около 5 строк) или очень сложной (более 1000 строк) в зависимости от выполняемой задачи. 4. Вывод результатов. Пользователь обычно ожидает какого-либо ответа на свои действия. Эта часть достаточно проста в реализации. Пример взаимодействия программы Perl с HTML формой
Шаг 1 . Создание формы Создадим для простоты форму, содержащую всего одно поле и позволяющую пользователю зарегистрировать его имя. Напишем в редакторе следующий текст: <html> <head> <title>Test Form</title> </head> <body> <form method=post action="/cgi-bin/db /testform.pl"> <b>Введите Ваше имя: </b> <br><input name="user_name" value="" size=20><br> <b>Введите Email: </b> <br><input name="user_email" value="" size=20><br> <br><b>Введите Сообщение: </b> <br><textarea name="user_messages" rows="10" cols="60"></textarea><br> <input type="submit" value="Зарегистрировать"> </form> </body> </html> Рисунок 3 - Внешний вид созданной формы Сохраните файл на диске под именем form . html . Шаг 2 . Создание скрипта
Предложенный ниже скрипт принимает введенные данные, сохраняет их в БД guest и показывает сообщение, содержащее ссылку на файл в котором представлены результаты выборки из таблицы. Наберите в редакторе текст программы и сохраните в файле testform.pl в вашем каталоге, каталога cgi-bin вашего web-сервера. Убедитесь, что первая строка программы содержит правильный путь к программе-интерпретатору. Создайте БД, в которой вы будете сохранять вводимые пользователем данные. В представленном ниже примере это таблица Messages Рисунок 4 - Структура таблицы Messages Содержимое файла testform . pl
#!/usr/local/perl/bin/perl use DBI; require "cgi-lib.pl"; &ReadParse(*input); # Имя пользователя БД $opt_user="root"; # Пароль доступа к БД $opt_password=""; # Имя базы $database="guest"; $url="http://localhost/db/form.html"; $cgi="http://localhost/cgi-bin/db/result.pl "; # Вывод http-заголовка print "Content-type: text/html\n\n"; # Подключение к базе $dbh = DBI->connect("DBI:mysql:database=$database", $opt_user,$opt_password) || die "Can't connect: $DBI::errstr\n"; $query="INSERT INTO messages (user_name, user_email, user_message) values ('$input{'user_name'}','$input{'user_email'}',’$input{'user_messages'}’)"; # Подготовка $sth = $dbh->prepare($query); $sth->execute(); # Отключение от базы $rc = $sth->finish; $rc = $dbh->disconnect; print "<br><a href='$url'>Вернуться на страницу форм</a><br>"; print "<br><a href='$cgi'>Просмотреть сообщения</a><br>"; Листинг формирования результатов в таблице
В следующем скрипте показана возможность извлечения данных из таблицы и представление извлеченной информации в виде таблицы.
Фрагмент скрипта perl result. pl
#!/usr/local/perl/bin/perl use DBI; # Имя пользователя БД $opt_user="root"; # Пароль доступа к БД $opt_password=""; # Имя базы $database="guest"; $url="http://localhost/db/form.html"; $cgi="http://localhost/cgi-bin/ "; # Вывод http-заголовка print "Content-type: text/html\n\n"; # Подключение к базе $dbh = DBI->connect("DBI:mysql:database=$database", $opt_user,$opt_password) || die "Can't connect: $DBI::errstr\n"; # Чтение введенных в форме данных (данный пример рассматривает случай, когда была осуществлена передача одного поля формы.) В других скриптах функция включена в библиотеку cgi-lib и вызывается &ReadParse(*input); read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/<!--(.|\n)*-->//g; $input{$name} = $value; } $query="select * from messages "; # Подготовка $sth = $dbh->prepare($query); $sth->execute(); $cols=$sth->{NUM_OF_FIELDS}; #Формирование таблицы и её заголовка print "<table width=70% align=center cellspacing=0 cellpadding=1 border=1>"; print "<tr valign=middle align=center>"; @fieldname=@{ $sth->{NAME}}; for($i=0;$i<$cols;$i++) { print "<td><b>$fieldname[$i]</b></td>\n"; } print "</tr>"; #Заполнение таблицы содержимым, исходя из запроса while (my $ref=$sth->fetchrow_arrayref()) { print "<tr align=center>"; for($i=0;$i<$cols;$i++) { print "<td>",$ref->[$i],"</td>"; } print "<tr>\n"; } print "</table>";
Листинг формирования результатов в списке
print "<SELECT name=column>\n"; # заполняем список таблиц $sth = $dbh->prepare("show tables"); $sth->execute; while (@line = $sth->fetchrow_array()) { print " <OPTION>$line[0]</OPTION>\n";[1] } print "</SELECT>”;
Шаг 3. Тестирование скрипта Проверив скрипт визуально на наличие ошибок - отсутствие ";" в конце строк, наличие непарных скобок и кавычек и т.п., запустите скрипт для проверки в баузере, перейдя предварительно в каталог cgi-bin (http://localhost/cgi-bin/db/testform.pl ). Если в скрипте содержатся ошибки, то вы увидите сообщение типа: syntax error at testform.pl line 18, near "open"Execution of testform.pl aborted due to compilation errors.В этом случае проверьте текст около указанной строки. Помните, что причина ошибки может быть выше на несколько, иногда достаточно много строк. В случае если скрипт запускался через web browser, то сообщения выводяться в файл \usr\local\Apache\logs\ error . log Исправленный скрипт сохраните, и тестируйте так до тех пор, пока он не выдаст корректных выходных данных. Шаг 4. Тестирование скрипта с формой Если скрипт работает сам по себе, вы можете оттестировать его с формой: 1. Убедитесь, что web-сервер запущен. 2. Запустите ваш браузер. 3. Наберите URL по которому находится ваша форма (обратите внимание, что строка должна начинаться с http://, а не с file://. В нашем случае http://localhost/bd/form.html 4. Введите ваше имя в поле формы и нажмите кнопку "Зарегистрировать".
Рисунок 5 - Результат работы скрипта testform.pl Это и есть страница, сгенерированная скриптом "на лету". Если вы получили сообщение об ошибке сервера, проверьте правильность расположения скрипта и правильность значения параметра action в тэге form. 6. Если вы видите правильно сгенерированную страницу, нажмите на ссылку “Посмотреть сообщения ”. Вы должны будете увидеть новую страницу, созданную скриптом примерно в таком виде:
Рисунок 6 -Результат работы скрипта result.pl Если вы не видите этого, проверьте правильность URL. В противном случае форма и скрипт правильно работают вместе. Вы успешно создали первое web-приложение. Для изучения различных переменных создайте следующий скрипт: #!/usr/local/perl/bin/perl#vars.cgisub urldecode{ #очень полезная функция декодировани local($val)=@_; #запроса,будет почти в каждой вашей CGI-программе $val=~s/\+/ /g; $val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge; return $val; }print "Content-Type: text/html\n\n";print "<HTML><HEAD><TITLE>CGI-Variables</TITLE></HEAD>\n";print "<BODY>\n";print "Enter here something:<ISINDEX><BR>\n";print "Your request is:$ENV{'REQUEST_STRING'}<BR>\n";print "Decoded request is:urldecode($ENV{'REQUEST_STRING'})<BR>\n";print "<HR>\n";print "Variables:<BR>\n";print "<I><B>REQUEST_METHOD</B></I>=$ENV{'REQUEST_METHOD'}<BR>\n";print "<I><B>QUERY_STRING</B></I>=$ENV{'QUERY_STRING'}<BR>\n";print "<I><B>CONTENT_LENGTH</B></I>=$ENV{'CONTENT_LENGTH'}<BR>\n";print "<I><B>CONTENT_TYPE</B></I>=$ENV{'CONTENT_TYPE'}<BR>\n";print "<I><B>GATEWAY_INTERFACE</B></I>=$ENV{'GATEWAY_INTERFACE'}<BR>\n";print "<I><B>REMOTE_ADDR</B></I>=$ENV{'REMOTE_ADDR'}<BR>\n";print "<I><B>REMOTE_HOST</B></I>=$ENV{'REMOTE_HOST'}<BR>\n";print "<I><B>SCRIPT_NAME</B></I>=$ENV{'SCRIPT_NAME'}<BR>\n";print "<I><B>SCRIPT_FILENAME</B></I>=$ENV{'SCRIPT_FILENAME'}<BR>\n";print "<I><B>SERVER_NAME</B></I>=$ENV{'SERVER_NAME'}<BR>\n";print "<I><B>SERVER_PORT</B></I>=$ENV{'SERVER_PORT'}<BR>\n";print "<I><B>SERVER_PROTOCOL</B></I>=$ENV{'SERVER_PROTOCOL'}<BR>\n";print "<I><B>SERVER_SOFTWARE</B></I>=$ENV{'SERVER_SOFTWARE'}<BR>\n";print "<I><B>HTTP_ACCEPT</B></I>=$ENV{'HTTP_ACCEPT'}<BR>\n";print "<I><B>HTTP_USER_AGENT</B></I>=$ENV{'HTTP_USER_AGENT'}<BR>\n";print "<I><B>HTTP_HOST</B></I>=$ENV{'HTTP_HOST'}<BR>\n";print "<HR>\n";print "All enviroment:<BR>\n";foreach $env_var (keys %ENV){ print "<I>$env_var=$ENV{$env_var}</I><BR>\n"; }print "</BODY></HTML>\n"; вызов скрипта осуществляется http://localhost/cgi-bin/var.cgiЗадание 1. Создайте таблицу Messages в соответствии с предложенной структурой. 2. Получите работающее приложение, обеспечивающее внесение пользователем данных в таблицу Messages. 3. Представьте в web браузере информацию, содержащуюся в таблице Messages. 4. Внесите изменения в структуру таблицы Messages, HTML –форму, скрипты и SQL запросы для решения задач: · Отображения даты внесения сообщения (добавьте новое поле в таблице); · Адреса пользователя (добавьте новое поле на форму и поле в таблице) · REMOTE_HOST (добавьте новое поле в таблице) Учебное издание ПОНОМАРЕВ Алексей Анатольевич Часть 3 РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА К БД В СУБД MYSQLМетодические указания к выполнению лабораторных работ по курсу «Базы данных» для студентов III курса специальностей 230105 «Программное обеспечение вычислительной техники и автоматизированных систем». 230201 «Информационные системы и технологии». Научный редактор доктор технических наук, профессор Г.П. Цапко
[1] Если требуется заполнять список несколькими полями в строке, то команда примет вид print " <OPTION value=$line[0 ]>$line[0 ] $line[1 ]</OPTION>\n";[1] где 0 и 1 номера соответствующих атрибутов, возвращаемых запросом select |