Тег 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

©Оформление. Издательство Томского 
политехнического университета, 2009




 

Оглавление



	Общие сведения о языке разметки HTML	4

	Структура документа	4

	HTML	5

	HEAD	5

	BODY	5

	Form	6

	Метки	9

	Лабораторная работа №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>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<META NAME="Author" CONTENT="Ваше имя ">

<title>Тег FORM, параметр action</title>
</head>
<body>

<form action="http://www.htmlbook.ru/download/file.php">
<p>...</p>
</form> 
</body>
</html>

HTML

Тег <HTML> и парный ему </HTML>. Тег <HTML> указывает программе просмотра страниц что это HTML документ

HEAD

Тег <HEAD> и парный ему </HEAD>. Тег <HEAD> определяет место, где помещается различная информация не отображаемая в теле документа. Здесь располагается тег названия документа и теги для поисковых машин

BODY

Тег <BODY> определяет видимую часть документа.В этом разделе располагается вся содержательная часть документа (текст статьи, фотографии, формы для заполнения, другие объекты).Тег имеет ряд необязательных атрибутов

bgcolor

Устанавливает цвет фона документа, используя значение цвета в виде RRGGBB - пример: FF0000 - красный цвет, либо используя константы цвета, например для желтого цвета, используемой на данной странице <body bgcolor= "yellow">

background

Указывает на url-адрес изображения - фона документа

text

Устанавливает цвет текста документа, используя значение цвета в виде RRGGBB - пример: 000000 - черный цвет, либо используя константы цвета, например для зеленого цвета, используемой на данной странице <body text= "green"> 

<body link=?>

Устанавливает цвет гиперссылок, используя значение цвета в виде RRGGBB - пример: 00FF00 - зеленый цвет,либо используя константы цвета,например для красного цвета,используемой на данной странице <body link= "red">

Пример

Эти параметры можно объединять, например на этой страничке используется <BODY bgcolor="yellow" text="green" link="red" alink="blue">



Form

Тег <FORM> устанавливает форму на веб-странице. Форма предназначена для обмена данными между пользователем и сервером. Область применения форм не ограничена отправкой данных на сервер, с помощью клиентских скриптов можно получить доступ к любому элементу формы, изменять его и применять по своему усмотрению. 

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

Для отправки формы на сервер используется кнопка Submit, то же самое можно добиться, если нажать клавишу <Enter> в пределах формы. Если кнопка Submit отсутствует в форме, клавиша <Enter> имитирует ее использование, но только в том случае, когда в форме имеется только один элемент <INPUT>. Если таких элементов два и более, нажатие на <Enter> не вызовет никакого результата. 

Когда форма отправляется на сервер, управление данными передается CGI-программе, заданной параметром action тега <FORM>. Предварительно браузер подготавливает информацию в виде пары «имя=значение», где имя определяется параметром name тега <INPUT>, а значение введено пользователем или установлено в поле формы по умолчанию. Если для отправки данных используется метод GET, то адресная строка может принимать следующий вид. 

action 

Адрес CGI-программы или документа, которые обрабатывает данные формы. 



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

Если параметр action отсутствует, текущая страница перезагружается, возвращая все элементы формы к их значениям по умолчанию.

enctype 

MIME-тип информации формы. 



Устанавливает MIME-тип для данных отправляемых вместе с формой. Обычно устанавливать значение параметра enctype не требуется, данные вполне правильно понимаются на стороне сервера. Однако если используется поле для отправки файла (INPUT type="file"), следует определить параметр enctype как multipart/form-data. 

<form enctype="MIME-тип">...</form>

method 

Метод протокола HTTP. 



Параметр сообщает серверу о методе запроса. 

<form method="get | post">...</form>

Значение параметра method не зависит от регистра. Различают два метода — GET и POST. Существуют и другие методы, но они пока мало используются.

GET 

Этот метод является одним из самых распространенных и предназначен для получения требуемой информации и передачи данных в адресной строке. Пары «имя=значение» присоединяются в этом случае к адресу после вопросительного знака и разделяются между собой амперсандом (символ &). Удобство использования метода GET заключается в том, что адрес со всеми параметрами можно использовать неоднократно, сохранив его, например, в «Избранное» браузера, а также менять значения параметров прямо в адресной строке. 

POST 

Метод POST посылает на сервер данные в запросе браузера. Это позволяет отправлять большее количество данных, чем доступно методу GET, поскольку у него установлено ограничение в 4 Кб. Большие объемы данных используются в форумах, почтовых службах, заполнении базы данных и т.д 

name 

Имя формы

Определяет уникальное имя формы. Как правило, имя формы используется для доступа к ее элементам через скрипты. 

<form name="имя">...</form>

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

target 



Имя окна или фрейма, куда обработчик будет загружать возвращаемый результат

После того, как обработчик формы получает данные, он возвращает результат в виде HTML-документа. Вы можете определить окно, в которое будет загружаться итоговая веб-страница. Для этого используется параметр target, в качестве его значения используется имя окна или фрейма. Если параметр target не установлен, возвращаемый результат показывается в текущем окне. 

<form target="имя окна">...</form>

В качестве аргумента используется имя окна или фрейма, заданное параметром name. Если установлено несуществующее имя, то будет открыто новое окно. В качестве зарезервированных имен используются следующие.

_blank 

Загружает страницу в новое окно браузера. 

_self 

Загружает страницу в текущее окно. 

_parent 

Загружает страницу во фрейм-родитель, если фреймов нет, то этот параметр работает как _self. 

_top 

Отменяет все фреймы и загружает страницу в полном окне браузера, если фреймов нет, то этот параметр работает как _self. 



Тег <A> является одним из важных элементов HTML и предназначен для создания ссылок. В зависимости от присутствия параметров name или href тег <A> устанавливает ссылку или якорь. Якорем называется закладка внутри страницы, которую можно указать в качестве цели ссылки. При использовании ссылки, которая указывает на якорь, происходит переход к закладке внутри веб-страницы.

Для создания ссылки необходимо сообщить браузеру, что является ссылкой, а также указать адрес документа, на который следует сделать ссылку. В качестве значения параметра href используется адрес документа (URL, Universal Resource Locator, универсальный указатель ресурсов), на который происходит переход. Адрес ссылки может быть абсолютным и относительным. Абсолютные адреса работают везде и всюду независимо от имени сайта или веб-страницы, где прописана ссылка. Относительные ссылки, как следует из их названия, построены относительно текущего документа или корня сайта.

<a href="URL">...</a>
<a name="идентификатор">...</a>

<html>


<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Тег А, параметр href</title>
</head>
<body>

<p><a href="../wormik/knob.html">Относительная ссылка</a></p>
<p><a href="http://www.htmlbook.ru/wormik/knob.html">Абсолютная ссылка</a></p>

</body>
</html>

href 

Задает адрес документа, на который следует перейти. 

name 

Устанавливает имя якоря внутри документа. 

target 

Имя окна или фрейма, куда браузер будет загружать документ. 

title 

Добавляет всплывающую подсказку к тексту ссылки. 






Метки 

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


<A name=”Метка”> </A> 

Пример меток в тексте:

<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:


<IMG SRC="url" USEMAP="url#map_name">

Параметр USEMAP указывает, в каком месте находится карта описываемого изображения. Карта изображения определяет, какому участку изображения какой URL соответствует. Карта изображения может находиться в том же документе, что и изображение, или в другом документе.
Определение карты изображения имеет следующий синтаксис.



<MAP NAME="map_name"> 

<AREA [SHAPE=" shape "] COORDS="x,y,..." [HREF=" reference "] [NOHREF]> 

     </MAP> 

    






Лабораторная работа №1. Изучение разметки HTML-документов



ЗАДАНИЕ



Сформировать HTML документ. При оформлении которого использовать теги HTML, META, HEAD, BODY, FORM, INSERT. Разместить на нем произвольную информацию с использованием шрифтов различного размера, таблиц, нумерованного и ненумерованного списка.

Создать страницу ссылок на ресурсы сети, обязательно с использованием фреймов. Имена файлов должны иметь маленькие латинские буквы!

В левом фрейме создать рубрики, оформить созданные ссылки в виде списка (тег <UL>)

																в правом фрейме соответственно создать ссылки с названием и кратким описанием ресурсов.

																- для поисковых систем, ссылки оформить в виде таблицы из двух колонок и нескольких строк. В левой колонке поместить рисунки-логотипы поисковых систем, в правой - гиперссылки на эти системы. (ссылки http://www.yandex.ru/, http://www.rambler.ru/, http://www.aport.ru/, http://www.google.com/, http://www.filesearch.ru/).

- для каталогов, оформить созданные ссылки в виде нумерованного списка, (ссылки http://www.list.ru/, http://www.rambler.ru/.) 
- для литературы, оформить созданные ссылки в виде нумерованного списка, ссылки разложить по рубрикам, например: библиотеки, техническая литература, стандарты. (ссылки http://www.citforum.ru/, http://www.lib.ru/, http://www.w3.org/, http://pyramidin.narod.ru/html401/index.htm.) 

Сделать ссылку на эту страницу с главной страницы. 

Разместить файлы на сервере и просмотреть в браузере, проверить работоспособность всех ссылок. 




Лабораторная работа №2. Формирование навыков создания HTML-документов



ЗАДАНИЕ



Познакомиться с файлом настроек Apache http.conf

Запустить сервер Apache. Разместить в рабочей директории документы html

Для обеспечения навигации использовать относительные ссылки.

Включить в ранее созданные страницы  директивы SSI:  DOCUMENT_NAME DATE_LOCAL LAST_MODIFIED

Сделайте автоматическое обновление первой страницы каждую минуту. 

Создайте новую страницу, и сделайте автоматическое перенаправление на www.tpu.ru , с временем ожидания 10 секунд, на странице напишите "Через 10 секунд вы будите автоматически перенаправлены на сайт www.tpu.ru. 

Создайте ссылки на разделы документа с использованием меток.

Разместите изображение на странице и выделите области локализации для ссылок на сервера


www.moskva.ru – Москва

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 сервера и его установка не входит в программу данного курса. Студентам необходимо знать, что в представленном варианте сервера он настроен на следующее дерево директорий:



D:\usr\

www









cgi-bin









local











Apache

Apache.exe







Perl

bin

Perl.exe





MySQL

Mysql.exe





В случае отсутсвия диска D можно воспользоваться командой Subst создания виртуального диска (вводится через командную строку, кнопка Пуск/ Выполнить): SUBST disk1: disk2:\path где disk1: - буква назначаемого виртуального диска, disk2:\path - полный путь к каталогу (папке), который заменяется на виртуальный диск. 

Таким образом для создания диска D и расположения в ней директории USR необходимо последнюю расположить в следующей за корневой директории. Например С:/11/USR. Затем воспользоваться командой SUBST D: "c:/11" после чего появиться диск D и на нем будет располагаться содержимое директории 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 имя базы данных, имя пользователя, значение пароля соответственно.

После подключения к БД можно выполнять любые операции с ней, разрешенные для пользователя, с учетной записью которого было совершено подключение



Этапы создания скрипта

Создать форму для вызова скрипта. 

Создать сам скрипт. 

Отладить скрипт. Проверить отсутствие ошибок (если это возможно, лучше проверить все возможные пути выполнения программы). 

Поместить скрипт на сервер и не забыть дать ему права на выполнение. 

Связать скрипт с формой, вставив его имя в параметр action тэга form. Например: 

<form action=/cgi-bin/ bd_name_num/example.pl method=get>

Убедиться, что скрипт правильно работает вместе с формой. 



Основные части Perl скрипта

В общем случае любой Perl скрипт состоит из четырех ключевых частей: 

Настройка. Первая часть скрипта обязательно запускает интерпретатор и устанавливает переменный, используемые в теле скрипта. Для запуска интерпретатора необходимо знать правильный путь к программе. 

Чтение входных данных. Эта часть "считывает" и сохраняет в переменных входные данные в удобной для обработки форме. Эта часть обычно неизменна во всех скриптах. 

Обработка входных данных. Эта часть соответствующим образом обрабатывает введенные данные. Она может быть простой (около 5 строк) или очень сложной (более 1000 строк) в зависимости от выполняемой задачи. 

Вывод результатов. Пользователь обычно ожидает какого-либо ответа на свои действия. Эта часть достаточно проста в реализации. 

Пример взаимодействия программы 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";

																}

																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. Тестирование скрипта с формой

																Если скрипт работает сам по себе, вы можете оттестировать его с формой: 

Убедитесь, что web-сервер запущен. 

Запустите ваш браузер. 

Наберите URL по которому находится ваша форма (обратите внимание, что строка должна начинаться с http://, а не с file://. В нашем случае http://localhost/bd/form.html

Введите ваше имя в поле формы и нажмите кнопку "Зарегистрировать". 

																

Рисунок 5 - Результат работы скрипта testform.pl

																Это и есть страница, сгенерированная скриптом "на лету". Если вы получили сообщение об ошибке сервера, проверьте правильность расположения скрипта и правильность значения параметра action в тэге form.

Если вы видите правильно сгенерированную страницу, нажмите на ссылку “Посмотреть сообщения”. Вы должны будете увидеть новую страницу, созданную скриптом примерно в таком виде: 

																

Рисунок 6 -Результат работы скрипта result.pl

																	Если вы не видите этого, проверьте  правильность URL. В противном случае форма и скрипт правильно работают вместе. Вы успешно создали первое web-приложение.

Для изучения различных переменных создайте следующий скрипт: 

  

#!/usr/local/perl/bin/perl

#vars.cgi

sub 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



Задание 

Создайте таблицу Messages в соответствии с предложенной структурой.

Получите работающее приложение, обеспечивающее внесение пользователем данных в таблицу Messages.

Представьте в web браузере информацию, содержащуюся в таблице Messages.

Внесите изменения в структуру таблицы Messages, HTML –форму, скрипты и SQL запросы для решения задач:

Отображения даты внесения сообщения (добавьте новое поле в таблице);

Адреса пользователя (добавьте новое поле на форму и поле в таблице) 

REMOTE_HOST (добавьте новое поле в таблице)



Учебное издание



ПОНОМАРЕВ Алексей Анатольевич

		









Часть 3

РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА К БД В СУБД MYSQL

Методические указания к выполнению лабораторных работ

по курсу «Базы данных» для студентов III курса специальностей  230105 «Программное обеспечение вычислительной техники и автоматизированных систем». 230201 «Информационные системы и технологии».







	Научный редактор

	доктор технических наук,

		профессор	Г.П. Цапко

		

	
	

	

	

	

Подписано к печати 26.11.2009. Формат 60х84/16. Бумага «Снегурочка».

Печать Xerox. Усл. печ. л. 000. Уч.-изд. л. 000. 

	Заказ ХХХ. Тираж ХХХ экз. 

	

	Томский политехнический университет

	Система менеджмента качества

	Томского политехнического университета сертифицирована

	NATIONAL QUALITY ASSURANCE по стандарту ISO 9001:2000

	

	. 634050, г. Томск, пр. Ленина, 30.



32