72192

БАЗЫ ДАННЫХ: УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС

Книга

Информатика, кибернетика и программирование

Методические указания к выполнению лабораторных работ являются составной частью раздела «Информационные ресурсы дисциплины» учебно-методического комплекса и содержат описание лабораторных работ, порядок их выполнения и требования к оформлению отчета.

Русский

2014-11-19

7.9 MB

16 чел.

PAGE  103

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Государственное образовательное учреждение высшего профессионального образования

«Северо-Западный государственный заочный технический университет»

Кафедра автоматизированных систем обработки информации и управления

БАЗЫ ДАННЫХ

УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС

Информационные ресурсы дисциплины

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

Институт информационных систем и вычислительной техники

Специальности:

230101.65 – вычислительные машины, комплексы, системы и сети

230102.65 – автоматизированные системы обработки информации и управления

230105.65 – программное обеспечение вычислительной техники и автоматизированных систем

230201.65 – информационные системы и технологии

230202.65 – информационные технологии в образовании

230106.51 – техническое обслуживание средств вычислительной техники и компьютерных сетей

Направления подготовки бакалавра

230100.62 – информатика и вычислительная техника

Санкт-Петербург

Издательство СЗТУ

2010


Утверждено редакционно-издательским советом университета

УДК 681.3

Базы данных: учебно-методический комплекс (информационные ресурсы дисциплины: методические указания к выполнению лабораторных работ) / сост.: М.В. Копейкин,  В.В. Спиридонов, Е.О. Шумова. - СПб.: Изд-во СЗТУ, 2010. – 285 с.

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

Методические указания к выполнению лабораторных работ являются составной частью раздела «Информационные ресурсы дисциплины» учебно-методического комплекса и содержат описание лабораторных работ, порядок их выполнения и требования к оформлению отчета.

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

Рассмотрено на заседании кафедры автоматизированных систем обработки информации и управления 13.05.2010 г.; одобрено методическим советом института информационных систем и вычислительной техники 17.06.2010 г.

Рецензенты: кафедра автоматизированных систем обработки информации и управления СЗТУ (зав. кафедрой И. В. Иванова, д-р техн. наук, проф.); А. М. Заяц, канд. техн. наук, проф., зав. кафедрой Информатики и информационных систем СПбГЛТА.

Составители: М.В. Копейкин, канд. техн. наук, доц.,

В.В. Спиридонов, канд. техн. наук, доц.,

Е.О. Шумова, доц.

Северо-Западный государственный заочный технический университет, 2010


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

1. Общие указания

По дисциплине предусмотрено выполнение лабораторного практикума. Тематика лабораторных работ охватывает вопросы исследования структурной организации баз данных и процессов функционирования информационных систем на основе концепций банков данных. В зависимости от формы обучения и объема занятий, выделенных на проведение лабораторных работ, содержание программы работ может варьироваться.

Студентам разрешается использовать любую современную СУБД, поддерживающую принципы реляционного описания данных и язык SQL.

Основным требованием к выбору СУБД является ее работоспособность на вычислительной технике университета. В качестве рекомендуемой предлагается использовать СУБД MySQL или СУБД ORD. MySQL является собственностью компании Sun Microsystems, осуществляющей разработку и поддержку приложения практически под любой операционной системой. Распространяется под GNU (General Public License) MySQL - является свободно распространяемой системой. ORD коммерческая система, но для студентов кафедры предоставляется бесплатно.

В Интернете указанные системы можно найти по адресам указанным ниже:

http://www.mysql.com/downloads/

http://www.ord.com.ru.

2. Охрана труда и техника безопасности

Организация безопасной работы студентов при выполнении лабораторных работ производится в соответствии с со следующими Государственными стандартами: ГОСТ 12.1.030-81 ССБТ «Электробезопасность. Защитное заземление, зануление», ГОСТ 12.2.032-78 ССБТ «Рабочее место при выполнении работ сидя. Общие эргономические требования».

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

В процессе выполнения лабораторной работы при обнаружении неисправностей в лабораторной установке следует немедленно прекратить работу и сообщить об этом преподавателю.

Запрещается:

- находиться в помещении в верхней одежде;

- выполнять работу в отсутствии преподавателя или дежурного лаборанта;

- класть сумки, одежду и другие вещи на столы и лабораторную технику.

Студенты, не соблюдающие правила техники безопасности, отстраняются от выполнения лабораторных работ.

3. Библиографический список

Основной:

1. Веллинг, Л. Разработка Web-приложений с помощью PHP и MySQL / Л. Веллинг, Л. Томсон. – М.: Вильямс, 2008, 2010. – 875 c.

Дополнительный:

2. Копейкин, М. В. Базы данных : основы SQL реляционных баз данных : учеб. пособие / М. В. Копейкин, В. В. Спиридонов, Е. О. Шумова. - СПб. : Изд-во СЗТУ, 2006. - 176 с.

3. Базы данных: метод. указания к курсовому проектированию / сост.: М.В. Копейкин, В.В. Спиридонов, Е.О. Шумова. – СПб.: Изд-во СЗТУ, 2005. - 172 c.

4. Базы данных: метод. комплекс по курсу и указания к выполнению лаб. работ / сост.: М.В. Копейкин, В.В. Спиридонов, Е.О. Шумова – СПб.: Изд-во СЗТУ, 2004, 2005.

4. Описание лабораторных работ

Лабораторные работы в среде ORD представлены в [4]. Лабораторные работы в среде MySQL представлены ниже.

Каждая лабораторная работа содержит следующие позиции:

  •  цель работы;
  •  основные теоретические положения;
  •  описание лабораторной установки;
  •  порядок выполнения работы;
  •  содержание отчета;
  •  литература или ссылка на программный код.

Пример оформления титульного листа по оформлению лабораторных работ приведен в приложении 1.

Cтуденты изучающие дисциплину с элементами ДОТ, оформляют отчет в электронном виде и выставляют его на Учебный сайт. Разработанные коды программ предоставляются в отдельной папке.

В каждой лабораторной работе предусмотрено несколько тем. Лабораторные работы №1 и №2 и темы указанные в них, выполняются всеми студентами.

В лабораторной работе №3 каждая тема содержит несколько заданий. Студент (независимо от формы обучения) для реализации выбирает любые задания из каждой темы.

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

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

Форма обучения

Число  заданий

очная 

28  ДОТ 4

очно-заочная

16  ДОТ 8

заочная 

 8    ДОТ 12

Например, для студента очной формы обучения должно быть выбрано 28 заданий. Для студента заочной формы обучения необходимо выбрать 8 заданий из 14 тем лабораторной работы №3. Студент заочной формы (обучающийся с элементами ДОТ) реализует 12 заданий из 14 тем лабораторной работы №3.

Лабораторные работы  (очная форма обучения)

Номер и название раздела (темы)

Наименование лабораторной работы

Кол-во часов

ауд

ДОТ

Тема 1.1

№1. Инсталляция СУБД. Изучение структуры и принципов работы инструментальной оболочки СУБД

4

Раздел 5. Тема 5.1, 5.2 

№2. Использование языка PHP и SQL для взаимодействия  с хранимой информацией

12

Тема 6.1, 6.3

№3. Программирование в среде CУБД на  ПЭВМ

12

4

Лабораторные работы  (очно-заочная форма обучения)

Номер и название раздела (темы)

Наименование лабораторной работы

Кол-во часов

ауд

ДОТ

Тема 1.1

№1. Инсталляция СУБД. Изучение структуры и принципов работы инструментальной оболочки СУБД

4

Раздел 5.Тема 5.1, 5.2 

№2. Использование языка PHP и SQL для взаимодействия  с хранимой информацией

8

4

Тема 6.1, 6.3

№3. Программирование в среде CУБД на  ПЭВМ

4

4

Лабораторные работы  (заочная форма обучения)

Номер и название раздела (темы)

Наименование лабораторной работы

Кол-во часов

ауд

ДОТ

Тема 1.1

№1. Инсталляция СУБД. Изучение структуры и принципов работы инструментальной оболочки СУБД

2

1

Раздел 5. Тема 5.1, 5.2 

№2. Использование языка PHP и SQL для взаимодействия  с хранимой информацией

4

6

Тема 6.1, 6.3

№3. Программирование в среде CУБД на  ПЭВМ

2

5

Пропуск занятия по неуважительной причине автоматически увеличивает число заданий на единицу.


Лабораторная работа № 1. Инсталляция СУБД. Изучение структуры и принципов работы инструментальной оболочки СУБД

Тема №1. Инсталляция MySQL и создание локального сервера 

1. Цель работы

Изучение конфигурационных файлов пакета и создание собственного сервера MySQL Server на локальной машине.

2. Основные технические возможности

Максимальные размеры таблиц

MySQL 3.23+: До 8 миллионов терабайт. (2 ^ 63).

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

Производительность 

Результаты тестов Вы сможете найти по адресу http://www.mysql.com/information/benchmarks.html  

Вставка 350768 строк

Секунды

mysql

381

mysql_odbc

619

db2_odbc

3460

informix_odbc

2692

ms-sql_odbc

4012

oracle_odbc

11291

solid_odbc

1801

sybase_odbc

4802

Чтение 2000000 строк по индексу

Секунды

Mysql

367

mysql_odbc

464

db2_odbc

1206

informix_odbc

121126

ms-sql_odbc

1634

oracle_odbc

20800

solid_odbc

877

sybase_odbc

17614

Возможность

Версия MySQL 

Подзапросы

4.1

Внешние ключи

5.0 (3.23 с InnoDB)

Представления

5.0

Хранимые процедуры

5.0

Триггеры

5.0

Полные связи

4.1

Ограничения

4.1 или 5.0

Курсоры

4.1 или 5.0

R-деревья

4.1 (для таблиц MyISAM)

3. Описание установки

Для того чтобы временно (для отладки) использовать свою машину как удаленный сервер, необходимо на машине установить Web-сервер Apache. Для установки программного обеспечения обеспечивающего взаимодействие клиента с сервером, использован комплекс программ "Денвер" (http://web.dklab.ru). В лабораторных использован следующий модуль инсталляции:

Состав базового комплекта Денвер:

1. Apache: выполняемые файлы, дистрибутивные и адаптированные  конфигурационные файлы.

2. PHP: выполняемые файлы, модуль для веб-сервера Apache, дистрибутивный и адаптированный конфигурационный файл.

3. MySQL: выполняемые файлы, файлы сообщений об ошибках на русском и английском, база данных mysql.

4. Панель управления базой данных MySQL - phpMyAdmin, а также  скрипт,  упрощающий добавление нового пользователя MySQL.

5. Perl: выполняемые файлы, модули отсутствуют.

6. Отладочная "заглушка" для sendmail (/usr/sbin/sendmail), не отправляющая  письма, а записывающая их в файл /tmp/!sendmail.txt.

7. Система автоматического поиска виртуальных хостов и обновления системного файла hosts, а также конфигурации Apache. Благодаря ей  добавление нового виртуального хоста (или домена третьего уровня)  заключается в простом создании  каталога в /home  (см. по аналогии с  уже  существующими хостами) и перезапуске комплекса. Все изменения вносятся в конфигурационные и системные файлы автоматически, но вы можете  управлять этим процессом при помощи механизма шаблонов хостов (см. /usr/local/apache/conf/httpd.conf за детальными разъяснениями).

Комплекс программ "Денвер" позволяет запустить полноценный веб-сервер Apache с поддержкой PHP, Perl и сервер MySQL на машине, работающей под управлением MS Windows 95/98/Me/NT/2000/XP. Как правило, при установке не требуется никакой настройки. Он обычно примененяется не только для обучения азам веб-программирования, но и для отладки интерактивных сайтов, программ, использующих базу данных MySQL, написанных на языках PHP и Perl.

4. Порядок выполнения работы

Чтобы не было проблем при инсталляции, выполните с командной строки программу Ping 

Рис. 1.1. Использование командной строки.

и проверьте Вашу машину на возможность ее исполнения.

Если программу инсталляции Base.exe запустить на исполнение,

то на экране появится диалоговое окно (рис. 1.2), отвечая на вопросы, сформированные в нем, происходит инсталляция пакета.

Примечание. Если на рисунках использованных в лабораторных работах используется овал , то на данную информацию следует обратить особое внимание

Рис. 1.2. Dos окно при инсталляции комплекта программ.

Для простоты и однозначности пути инсталляции, принимайте условия предлагаемые инсталлятором. Так, например, в нашем случае указываем, что папка для хранения будет C:\WebServers. В процессе инсталляции Вам будет предложено указать имя виртуального диска (для примера использовано имя виртуального диска “W”) и вариант его создания (рис. 1.3)

Рис. 1.3. Dos окно при инсталляции комплекта программ Денвер.

Если на вопрос “Создать ярлыки на Рабочем столе для запуска комплекса (y/n)?” вы укажите символ “Y”, то на рабочем столе компьютера появятся ярлыки (рис.1.4) и установка на этом Web сервера Apache завершается.

Рис. 1.4. Ярлыки на Рабочем столе после инсталляции.

ЗАПУСК И ОСТАНОВКА СЕРВЕРА

Управление запуском и остановкой сервера осуществляется посредством файлов etc\Start.exe и etc\Stop.exe, находящиеся в директории комплекса.

- старт сервера: файл etc\Start.exe (в некоторых комплексах RUN.exe)

- остановка сервера: файл etc\Stop.exe

- перезапуск сервера файл etc\Restart.exe

- остановка и отключение виртуального диска: файл etc\Shutdown.exe

Если на рабочем столе будет произведено нажатие на ярлыке “Start Denwer” (рис. 1.4), то промелькнет ДОСовское окно (рис. 1.5), в котором  прописывается протокол работы сгенерированного комплекса Денвер. Так например, будет обработан (обновлен) файл Hosts (C:\Windows\system32\drivers\etc\Hosts описание и назначение см. далее), созданный при инсталляции ОС, обслуживающей Ваш компьютер.

Рис. 1.5. Сообщение об успешном запуске MySQL.

После запуска Start Denwer:

проверьте наличие ошибок в файлах error.log, находящихся по следующим путям: C:\WebServers\home\localhost\error.log,

C:\WebServers\home\test1\error.log,

C:\WebServers\home\test2\error.log.

Примечание. Отсутствие файла error.log указывает на отсутствие ошибок.

Если Вы попытаетесь удалить эти файлы и попытка будет отклонена операционной системой, то это означает, что они блокированы программой и, следовательно, Вы уже запустили Start Denwer.

Настоятельно рекомендуем сервер останавливать  именно  по  команде Stop.exe (ярлык Stop Denwer (рис. 4)), так как, в противном случае, не исключена потеря данных в базе MySQL.

После инсталляции в папках на виртуальном диске “W” (рис. 1.5) и автоматически созданной папке С:\webservers\ (рис. 1.6) будет храниться информация:

Рис. 1.6. Содержимое виртуального диска “W” после инсталляции.

Сам сервер будет храниться в папке C:\webservers\*.*  (рис. 1.7), которую Вы указали при инсталляции пакета (рис. 1.2). Отметим, что содержимое папки C:\webservers\*.* и виртуального диска идентично.

Рис. 1.7. Содержимое виртуального диска “W”  и папки C:\Webservers после инсталляции.

СТРУКТУРА КАТАЛОГОВ

HTML-документы (файлы) должны находиться в директориях /home/<имя_хоста>/www. По умолчанию сконфигурированы 2 виртуальных хоста: test1.ru и test2.ru (рис. 1.8), в директории первого (/home/test1.ru/www) расположена тестовая страница, содержащая некоторую информацию о настройках PHP, переменных окружения и т.д., выводимая функцией PHP phpinfo().

В некоторых версиях Денвер не создает папку ect.

Рис. 1.8. Содержимое папки C:\webservers\HOME.

Поддерживаются также виртуальные хосты с доменными именами третьего и выше уровней.

Директория /usr/local (рис. 1.8) содержит программные компоненты - выполняемые и конфигурационные файлы Apache, PHP, MySQL. Авторы постарались сохранить это расположение приближенным к принятому в среде UNIX.

Рис. 1.9. Содержимое папки C:\webservers\USR\Local.

Директория /usr/bin  -  особая, потому что в ней содержится интерпретатор языка  Perl,  необходимый  для  функционирования  комплекса.  Это  не накладывает   каких-либо   обязательств   на  пользователя,  потому что вся работа  с этим языком  ведется  "прозрачно".  Человек  может даже и не догадываться, что некоторые программы написаны именно на Perl.

Папка Номе (рис. 1.8 и рис. 1.10) содержит четыре директория:

Рис. 1.10. Содержимое папки home на виртуальном диске.

Директорий Cgi-glob содержит скрипты, а остальные три предназначены для описания доменов. Например, директорий Test1.ru (рис. 1.11) содержит три поддиректория и файл с именем error.log.

  •  

Рис. 1.11. Содержимое папки home на виртуальном диске или на диске C:\.

Прежде чем приступить к дальнейшей работе рекомендуется проверить, нет ли ошибок в файле error.log, показанном на рис. 1.11. Его размер должен быть равен 0.

Если раскрыть поддиректорий WWW папки TEST1.ru, то в его содержимом (рис. 1.12) Вы найдете файл index.html.

Рис. 1.12. Содержимое папки WWW на виртуальном диске или на диске C:\.

Файл Index.html является исполняемым HTML файлом (Web Document), содержимое которого формируется и заполняется в обычном текстовом редакторе Блокнот или в более удобном Skite редакторе или в специальном редакторе для написания HTML скриптов.

Например, содержимое файла Index.html может быть следующим (рис. 13):

<html> <body>

<table width=100% height=100%>

<tr> <td align=center>

<h2 align=center>Это файл  /home/test1.ru/index.html.</h2>

</td> </tr>

</table>

</body> </html>

Рис. 1.13. Состав программы (скрипта) Index.html на языке HTML.

После установки  и  первого запуска комплекса рекомендуем  сразу же запустить браузер, набрав в нем следующий URL: "http://localhost". Вы должны попасть на тестовую страницу системы (даже если у Вас отсутствует Интернет).

Рис. 1.14. Экран с выводом теста.

Подобный результат Вы должны получить и в Total Commander, если находясь в папке C:\WebServers\home\test1.ru\www\index.html Вы нажмете Enter.

Если подобного окна Вы не получите (а получите сообщение браузера об ошибке), то необходимо найти на диске C файл C:\Windows\system32\drivers\etc\Hosts (рис. 1.14) и проверить его содержимое.

Рис. 1.14. Папка, содержащая файл соответствий Hosts.

Содержимое этого файла Hosts может быть следующим:

# (C) Корпорация Майкрософт (Microsoft Corp.), 1993-1999

# Это образец файла HOSTS,  используемый Microsoft  TCP/IP для Windows.

# Этот файл содержит сопоставления IP-адресов именам узлов.

# Каждый элемент должен располагаться в отдельной строке. IP-адрес должен

# находиться в первом столбце, за ним должно следовать его имя.

# IP-адрес и имя узла должны разделяться хотя бы одним пробелом.

#

# Кроме того, в некоторых строках могут быть вставлены комментарии

# (такие, как эта строка), они должны следовать за именем узла и отделяться

# от него символом '#'.

# Например:

#      102.54.94.97     rhino.acme.com          # исходный сервер

#       38.25.63.10     x.acme.com                 # узел клиента x

127.0.0.1       localhost

127.0.0.1  test1.ru

Рис. 1.16. Состав файла соответствий HOSTS.

Выбрав те или иные ссылки, вы должны протестировать каждый компонент отдельно.

Фактически файл HOSTS является справочником для локальной машины, указывающим браузеру, где хранится сайт с именем Test1.ru. Поэтому обращение к Интернету не происходит и обработка происходит на локальной машине в среде сервера Apache, который Вы установили. Значение 127.0.0.1 является стандартным адресом Вашего компьютера, за которым и указывается имя сайта. Этим и объясняется необходимость использования Apache в качестве локального сервера.

Ниже (рис. 1.17) приведено состояние файла Hosts C:\WebServers\home\test1\error.log, после удачной инсталляции пакета Денвер.

127.0.0.1       localhost

127.0.0.1 www.subdomain.localhost

127.0.0.1 www.subdomain.test1.ru

127.0.0.1 subdomain.localhost

127.0.0.1 subdomain.test1.ru

127.0.0.1 www.localhost

127.0.0.1 www.test1.ru

127.0.0.2 custom-host

127.0.0.2 www.custom

127.0.0.1 test1.ru

127.0.0.2 custom

Рис. 1.17. Состав файла соответствий C:\Windows\system32\drivers\etc\ HOSTS после инсталляции.

При нажатии ярлыка Stop Denwer (рис. 1.4) содержимое файла Hosts уничтожается, а при нажатии на ярлыке Start или Restart Servers, содержимое файла восстанавливается на основании папок C:\WebServers\home\*.*.

Apache перед обращением в поисковую систему Yandex (или в другую, установленную на Вашей машине) анализирует содержимое файла Hosts и определяет фактический адрес сайта на сервере.

Путь до файла, содержимое которого выводится на экран (рис. 1.14) следующий: C:\webservers\home\test1.ru\index.html (рис 1.12) и теперь становится понятной часть текста HTML приведенного на рис. 1.13, а именно строка с номером 4

(<h2 align=center>Это файл  /home/test1.ru/index.html.</h2>).

Далее необходимо проверить работоспособность инсталлированного комплекса и создать что-то похожее на собственный сайт и заодно проверить, как работает HTML скрипт с встроенным в него PHP кодом. Напомним, что вставленный PHP код выделяется в тексте HTML c помощью конструкции вида: <?       ?>.

<?  Текст вставленного PHP кода  ?>

Для этого надо выполнить ряд шагов.

Шаг 1. Создать новую папку (клавиша F7, если Вы используете Total Commander) в подпапке с именем C:\Webservers\home\*.*. Например, пусть имя новой папки будет Moy.loc (рис. 1.18) для создания сайта на локальном компьютере (с последующей его переброской на удаленный компьютер).

Обратите внимание, что Вы создавали папку на виртуальном диске W:/home, а фактически она создалась по адресу C:\WebServers\home\Moy.loc.

Рис. 1.18. Создание новой папки на виртуальном диске W:\home.

Шаг 2. В созданной папке Moy.loc создать подпапку WWW (рис. 1.19) и в ней создадим текстовый файл, содержащий простейший код PHP с именем Index.html (рис. 1.20).

Рис. 1.19. Создание новой папки по пути C:\WebServers\home\moy.loc\www.

Рис. 1.20. Создание текстового файла Index.php в папке ..\www.

Напомним, что создать файл в Total Commander можно клавишами Shift+F4.

Шаг 3.

В созданном файле Index.php введем следующую информацию (рис. 1.21) и сохраним ее, для проверки работают ли после инсталляции PHP скрипты.

<html>

<body>

<p> Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?>

</body>

</html>

Рис. 1.21. Содержимое текстового файла Index.php в папке ..\www.

На рис. 1.21 только строка 4 относится к языку PHP, где использована функция языка  echo  для вывода информации на экран дисплея. Все остальные строки относятся к языку HTML.

Шаг 4.

Перезапустить сервер Apache (Restart Denwer (рис. 1.4)), чтобы информация о домене Moy.loc попала в файл Нosts. Если на машине все аккуратно настроено, то в созданной Вами папке C:\WebServers\moy.loc\  появится созданный системой файлe C:\WebServers\moy.loc\error.log, в котором будут фиксироваться ошибки.

Если ошибок нет (файл пуст), то содержимое файла  Hosts, находящегося по адресу C:\Windows\system32\drivers\etc\Hosts, должно приобрести вид (рис. 1.22). В нем добавится информация об адресах и именах создаваемого Вами сайта  moy.loc.

127.0.0.1 localhost

127.0.0.1 www.subdomain.localhost

127.0.0.1 www.subdomain.test1.ru

127.0.0.1 subdomain.localhost

127.0.0.1 subdomain.test1.ru

127.0.0.1 www.localhost

127.0.0.1 www.test2.ru

127.0.0.1 www.test1.ru

127.0.0.1 www.moy.loc                            новый

127.0.0.1 test1.ru

127.0.0.1 test2.ru

127.0.0.1 moy.loc                                       новый

Рис. 1.22. Содержимое текстового файла Hosts после перезапуска Apache.

Естественно, что слово новый Вы в этом файле не увидите.

И если Вы укажите (в адресной строке) имя вашего сайта (рис. 1.23), то информация из файла Index.php будет выведена на экран.

Рис. 1.23. Содержимое экрана после обращения к сайту Moy.loc.

Если Вы забудете перезапустить сервер , то Вы получите сообщение об ошибке или браузер оставит свое окно без изменения.

Далее проверьте ошибки в файле: C:\WebServers\home\moy.loc\error.log,

и только если он пуст (или отсутствует), продолжайте работу!

Ошибки могут быть разнообразны, но чаще встречается следующая: [Tue Aug 04 14:00:16 2009] [error] [client 127.0.0.1] File does not exist: w:/home/moy.loc/www/favicon.ico. Для ее устранения необходимо поместить файл favicon.ico в корень папки, куда Вы устанавливали программу, не забыв при этом остановить сервер (Stop Denwer (рис. 4)) и затем перезапустить.

Аналогичным образом может быть создан поддомен, если в папке moy.loc создать подпапку, например с именем New и  выполнив шаги 1-4 и изменив в вновь созданной подпапке содержимое файла Index.php.

В созданном файле Index.php, введем следующую информацию (рис. 1.24) и сохраним ее и перезапустим сервер (Restart Server (рис. 1.4)).

<html>

<body>

<p> Проверка поддомена с именем New.Moy.loc </p>

<? echo "Проверка PHP" ?>

</body>

</html>

Рис. 1.24. Содержимое текстового файла Index.php в папке ..\www.

Получим следующее содержимое в браузере (рис. 1.25). Заметьте, что в данном примере, использован браузер Internet Explorer, но это никак не сказывается на результате, получаемом на экране.

Рис. 1.25. Содержимое экрана после обращения к сайту new.Moy.loc.

В каждом домене можно создавать папку, содержащую CGI скрипты (Perl программы).

Рис. 1.26. Папка для хранения CGI скриптов.

Рис. 1.27. Состав папки  CGI.

Содержимое файла  test представлено ниже

#!/usr/bin/perl

print "Content-Type: text/html\n\n";

print "<html>This is a test of /cgi/ directory of test1.ru virtual server";

Рис. 1.28. Содержимое файла  test.pl.

Если в адресной строке эксплорера  Вы укажите http://test1.ru/cgi/test.pl, то на экране Вы увидите следующую информацию (рис. 1.29).

Рис. 1.29. Запуск на обработку скрипта test.pl.

РЕСУРСЫ ИНТЕРНЕТ

Домашняя страница, документация и статьи по Apache/PHP/Perl/MySQL

http://web.dklab.ru/

http://forum.dklab.ru/denwer/

Официальный сайт Apache http://www.apache.org/

Официальный сайт PHP http://www.php.net/

Официальный сайт MySQL http://www.mysql.com/

5. Содержание отчета

Данная лабораторная работа не содержит текстового отчета, если в качестве целевой СУБД Вы выбрали МуSQL и инсталлировались с помощью Denver.

Если же Вы решили использовать в качестве целевой СУБД, например, PostGresSQL, то все шаги и особенности инсталляции должны быть описаны в таком же порядке, как это сделано в данной лабораторной работе.

Внимание! Все отчеты по лабораторным работам предоставляются преподавателю, как в текстовом варианте, так и в электронном виде.

Литература: [1], с. 838…860


Лабораторная работа № 1

Тема №2. Инструментальная среда PHPMYADMIN

1. Цель работы

Ознакомление с инструментальной оболочкой конструирования баз и таблиц данных в среде MySQL.

2. Основные теоретические положения

Любая СУБД реляционного (или другого) типа предоставляет набор утилит для доступа к хранимой информации. В MySQL в качестве  инструментальной оболочки обычно используют систему phpMyAdmin или непосредственно используют командную строку OC.

3. Описание лабораторного макета

Панель управления базой данных MySQL – phpMyAdmin показана на рис. 1.38.

В следующем разделе будут рассмотрены основные моменты работы с утилитой phpmyadmin, позволяющей упростить работу с CУБД MySQL.

4. Порядок выполнения работы

Прежде чем перейти к изучению утилиты phpmyadmin выполните следующее:

укажите в адресной строке браузера информацию http://localhost  и Вы должны получить следующее окно (рис. 1.30).

Рис. 1.30. Состав окна разработчика Денвер (частично).

Рис. 1.30. Продолжение описания состава окна разработчика Денвер (частично).

Далее необходимо протестировать все пункты для указанных URL адресов указанных на рис. 1.30.

5. Указания к выполнению работы

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

Например, при запуске теста: http://localhost/tools/phpmyadmin Вы можете получить следующее сообщение (рис. 1.31).

Рис. 1.31. Сообщение от phpMyAdmin.

Сообщение:

#1045 –Access denied for user ‘root’ @ ‘localhost’ (using password; NO)

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

Если Вы находитесь в Total Commander, то используя, например, клавиши Alt/F7 найдите на своей машине файл My.ini (рис. 1.32).

Рис. 1.32. Поиск установочного файла My.ini для СУБД MySQL.

Если такой файл на машине найден, то ошибка, указанная на рис. 1.31, порождена именно уже установленной СУБД. Ниже на рис. 1.33 приведен фрагмент состава файла My.ini.

#Path to installation directory. All paths are usually resolved relative to this.

basedir="C:/Program Files/MySQL/MySQL Server 5.1/"

#Path to the database root

datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"

Рис. 1.33. Фрагмент состава установочного файла My.ini для СУБД MySQL.

Важно другое phpMyAdmin обращался при запуске Денвера не к своей базе данных, то естественно пароль и логин с точки зрения ТОЙ базы были неверны. Это же касается и имя хоста.

Вы должны помнить, что при установке MySql на локальный компьютер, создается или в Windows-каталоге, или в корне каталога "С:\" файл "my.ini" из которого в последствии, при запуске MySQL будет брать настройки.

Если возникает подобная проблема необходимо:

1.Посмотреть в автозагрузку (Пуск-Выполнить->пишем msconfig->вкладка "Службы"->ищем "MySQL"->снимаем галочку->"OK"-> перезагрузка – в картинках Рис. 1.34-1.36), не запускается ли там еще одна база при включении компьютера.

2.Посмотреть в каталоге "С:\" или "С:\Windows" не существует ли там файл "my.ini" для MySQL, и если есть - удалить.

Рис. 1.34. Запуск с командной строки на исполнение программы MsConfig.

Если служба MуSQL работает (рис. 1.36), то ее следует отключить.

Рис. 1.35. Машину надо перезагрузить.

Рис. 1.36. Если служба MySQL работает галочку надо снять.

Если после рестарта машины Вы забудете запустить Start Servers, то получите ошибку, показанную на рис. 1.37.

Рис. 1.37. Сервер надо перезагрузить.

При входе в Mysql утилитой, которая расположена по адресу  http://localhost/Tools/phpmyadmin/  Вы должны получить следующее окно (рис. 1.38).

6. Содержание отчета

1. Структурная схема взаимодействия утилит пакета с описанием назначения его основных элементов меню.

Рис. 1.38. Окно входа phpMyAdmin 

Примечание. Обратите внимание на адрес входа http://localhost/Tools/phpmyadmin/. Он зависит от версии Denwer.

Если в поле “Создать новую базу”

указать имя новой базы данных, например My_Base, и нажать Enter или кнопку , то система сформирует пустую базу, не содержащую ни одной таблицы (рис. 1.39).

Если подобного окна Вы не получите, то проверьте, запущен ли Denwer. Формальным признаком его работы является наличие пиктограммы “пера” в правой нижней части окна OC

.

Рис. 1.39. Окно созданной новой базы в phpMyAdmin.

Литература: Официальный сайт phpMyAdmin http://phpmyadmin.sourceforge.net/


Лабораторная работа № 2. Использование языка PHP и SQL для взаимодействия  с хранимой информацией

Тема №1. Создание баз и таблиц данных

1. Цель работы

Получение практических навыков работы в инструментальной среде СУБД.

2. Основные сведения

Указав в Internet Explorer адрес (рис. 2.1), мы попадаем в оболочку (рис. 2.2) (адрес зависит от версии Denwer), в которой в поле ввода  необходимо указать имя создаваемой базы. Пусть для примера мы укажем имя базы My_base и введем его в Get поле, показанное на рис. 2.2 , тогда следующим окном будет рис. 2.3.

Рис. 2.1. Запуск phpMyadmin.

Примечание. Овалом здесь и далее указывается область, на которую надо обратить внимание.

Рис. 2.2. Состав окна утилиты PHPMYADMIN версия Denwer3

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

Если подобное имя в системной таблице СУБД MySQL существует, то Вы получите ошибку вида:

Если в базе данных не обнаружено таблиц, то удалите пустую базу (рис. 2.2(a)), для чего в окне, показанном на рис. 2.2, выберите пункт меню “Базы данных”  и перейдите в этот режим. Будет показано окно (рис. 2.2(a)), в котором необходимо отметить удаляемую базу () и использовать кнопку .

Системой будет сгенерирована команда:

и Ваш ответ приведет к желаемому результату.

Рис. 2.2a. Состав окна утилиты PHPMYADMIN версия Denwer3

Если информация из базы данных Вам необходима, то укажите другое имя для вновь создаваемой базы.

В СУБД MySQL – база данных понимается как набор хранимых таблиц.

На рис. 2.3 показана команда CREATE DATABASE языка SQL использованная оболочкой для резервирования места на диске.

Пусть имя новой базы указанное в поле будет следующим:

Примечание. Использование закладок позволяет посмотреть предшествующие шаги Ваших действий.

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

Рис. 2.3. Окно PHPMYADMIN.

Пусть мы решили создать в базе данных таблицу с именем Lessons, состоящую из 3-х полей (столбцов). Указанные данные, вводятся в Get поля представленные на рис. 2.3 и показаны на рис. 2.4.

Рис. 2.4. Введение названия хранимой таблицы и числа ее столбцов.

Нажав клавишу “Пошел”, на экран будет выведено окно вида (рис. 2.5), в котором необходимо указать информацию о таблице Lessons. Пусть логически таблица предназначена для хранения информации о лекциях (их названиях) и авторах лекции. Каждый столбец должен получить набор свойств характеризующих как сам столбец, так и элементы, которые будут вводиться (означиваться) в этом столбце таблицы. Другими словами каждому столбцу необходимо присвоить осмысленное имя, указать его тип, длину и точность (если столбец предназначен для хранения числовых данных) и ограничения присущие элементам этого столбца.

Примечание. Рекомендуется имя первого поля (столбец) в таблице обозначать символами  “Id” и присваивать ему тип INT (целое), длина этого поля прогнозируется максимальным числом строк, которое может содержаться в таблице. Тип поля INT использует 4 байта для хранения значения. Минимально значение -2147483648, максимальное 2147483647. Беззнаковый INT (unsigned) хранит значения от 0 до 4 294 967 295.

Имена всех следующих полей и их характеристики определяются из смысловых (семантических) особенностей информации, подлежащей хранению в таблице базы данных.

Пусть для нашего примера, второй столбец предназначен для хранения названия лекции (латинское имя titel) и тип его символьный. Третий столбец тоже пусть типа CHAR и предназначен для хранения автора (writer) лекции.

Длина этого поля может максимально занимать 100 символов.

Рис. 2.5. Состав формы для указания характеристик столбцов формы.

Количество столбцов для описания характеристик каждого поля таблицы базы данных достаточно велико и на рис. 2.5 они все не показаны, поэтому не поместившиеся на экране столбцы приведены на рис. 2.6.

Рис. 2.6. Продолжение состава формы для указания характеристик столбцов формы.

Рис. 2.6a. Продолжение состава формы в PhpMyAdmin для указания характеристик столбцов формы.

Примечание. Пиктограмма –  рис. 2.6a соответствует на рис. 2.6 , - индекс и т. д.

Помимо обычных характеристик столбцов хранимой таблицы базы данных, каждая таблица должна иметь столбец (столбцы) для идентификации уникальности объектов, отображаемых в данной хранимой таблице. Такой столбец (столбцы) получают статус реляционного ключа и в форме описания состава хранимой таблицы (рис. 2.6) фиксируются в столбце с именем “Первичный”

Пусть Вы заполнили форму (рис. 2.5, 2.6) следующими данными (рис. 2.7) с учетом того, что в столбце с именем “Дополнительно” для первой строки таблицы (имя поля Id) указали служебное слово “auto_increment”, приказывающее СУБД MySQL формировать это поле автоматически, используя алгоритм счетчика. Т.е., если в хранимую таблицу (для нашего случая таблица с именем “lessons” в базе данных My_base) будет добавляться новая строка, то значение поля с именем “Id” будет формироваться из значения поля предыдущей строки плюс единица.

Рис. 2.7. Состав формы после указания характеристик столбцов формы.

Если при попытке сохранить форму таблицы “lessons” Вы не укажите, на каком поле (полях) формируется реляционный ключ (для нашего случая таким полем является поле с именем Id, и Вы не указали это явно в столбце “Первичный” (на рис. 2.7 точка стоит правильно)), то получите сообщение от MySQL об ошибке, если точка в столбце “Первичный” отсутствует, примерно следующего вида (рис. 2.8):

Рис. 2.8. Реакция MySQL на некорректное объявление таблицы Lessons.

CREATE TABLE ‘lessons’(

   ‘id’ INT(8) NOT NULL AUTO_INCREMENT,

    ‘titel’ VARCHAR(200) NOT NULL

    ‘writer’ VARCHAR(100) NOT NULL

)

Представленное предложение языка SQL (а точнее его часть, относящаяся к DDL) автоматически генерируется программой PHPMYADMIN, и указывает какая команда SQL была использована для генерации структуры  хранимой таблицы с именем lessonsи каков набор столбцов и их характеристик в создаваемой таблице.

Ниже приводится описание ошибки, сгенерированное в СУБД  MYSQL, объясняющее, почему таблица не может быть создана.

Incorrect table definition; There can only be one auto column and it mast be defined as a key

Если Вы правильно укажите характеристики для создаваемой таблицы, и нажмете кнопку “Сохранить” (рис. 2.5), то получите следующее окно (рис. 2.9).

Кнопки типа “Структура”, “Обзор”, “SQL” и т. д. показанные на рис. 9 позволяют модифицировать внутреннею структуру как самой созданной таблицы Lessons, так и введенных в нее данных.

Так, например, кликнув на кнопке “Структура” (рис. 2.9), мы получим окно следующего содержания (рис. 2.10).

Рис. 2.9. Реакция MySQL на корректное объявление таблицы Lessons.

Рис. 2.10. Реакция  на кнопку “Структура” таблицы Lessons на рис. 2.9.

Рис. 2.10. Продолжение рисунка. Реакция  на кнопку “Структура” таблицы Lessons на рис. 2.9.

Если  возникает необходимость добавить новую запись (т. е. заполнить строку таблицы реальной информацией), то следует воспользоваться кнопкой (рис. 2.10 или рис. 2.11).

Рис. 2.11. Реакция  на кнопку “Вставить” таблицы Lessons.

3. Программа работы

Приступим к заполнению информацией созданной таблицы.

Напомним, что первая строка с именем id (рис. 2.11) заполняется автоматически, так как ранее для нее указано ограничение “auto_increment”.

При заполнении 2-ой и 3-ей строки  в столбце “Функция ” (рис. 2.11) может быть использован элемент из списка, показанный на рис. 2.12, однако для создаваемой записи  нет необходимости в использовании его элементов.

Поэтому заполнению подлежат только поля строки 2 и 3 в столбце “Значение”, что и показано на рис. 2.13.

Рис. 2.12. Listbox  на кнопкe  столбца “Функция” таблицы Lessons.

Рис. 2.13. Ввод данных в первую строку таблицы Lessons.

Если Вы заполнили все данные для первой строки таблицы, то следует нажать кнопку “Пошел” (рис. 2.13) и на экран будет выведено следующее окно (рис. 2.14).

Рис. 2.14. Таблица Lessons после ввода первой строки.

Структура SQL-запроса и синтаксические правила рассмотрены в лекциях по основам SQL.

INSERT INTO ‘lessons’ (‘id’, ’titel’, ’writer’)

VALUES (‘’, ‘Лекция по Аpache’, ‘Иванов’

);

Аналогичным образом происходит вставка второй и последующих записей в таблицу Lessons, так, например, на рис. 2.15 показано состояние окна после ввода информации по лекции, касающихся основ SQL, которая названа ‘Лекция по SQL’  и читает ее преподаватель Иванов.

Рис. 2.15. Таблица Lessons после ввода второй строки и нажатия .

Как видно из рис. 2.15, в таблице две записи и выборка произведена с помощью команды SQL 

SELECT  *

FROMlessons

Прежде чем рассмотреть функции импорта и экспорта данных в Mysql

Рис. 2.16. Назначение кнопок.

Рассмотрим, как производится импорт в базу данных файла, используя кнопку “SQL” (рис. 2.17). Для этого выбирается необходимая база  и нажимается кнопка  

Рис. 2.17. Переход в режим импорта файла в базу данных my_base.

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

Рис. 2.18. Импорт файла в базу данных my_base.

Вставка (импорт) на основе функции реализованной на кнопке SQL (рис. 2.18) может производиться двумя способами. Первый из них подразумевает ввод данных в окно ввода (на рис. 2.18 оно обозначено ломанной фигурой) обработки SQL запроса предварительно открыв импортируемых файл, либо используя кнопку “Обзор” (рис. 2.18), выбираете файл из соответствующей папки и используя кнопку “Пошел” импортируют файл в Вашу базу данных.

Если возникает необходимость экспортировать  вашу базу данных в виде обычного текстового файла, то нажатие  кнопки “Экспорт”  (рис. 2.15-2.18) и на экране появится следующее диалоговое окно (рис. 2.19).

Рис. 2.19. Экспорт из базы данных.

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

На экране появляется текст, показанный на рис. 2.20, который копируется на удаленный сервер. Сервер имеет у себя такую же утилиту PHPMYADMIN, воспользовавшись которой на удаленном сервере (см. режим “Импорт”, использование функции (кнопки) “SQL” рис. 2.18), можно обновить содержимое базы на удаленном сервере.

Рис. 2.20. Экспорт из базы данных на сервер.

4. Указания к выполнению работы

При выполнении программы следует помнить, что на некоторых этапах порядок Ваших действий может привести к "зависанию" системы.

5. Содержание отчета

1. Описание порядка выполнения производимых действий и перечень используемых программ. Краткая характеристика (назначение, функциональные возможности) каждой программы.

2. Результаты использования SQL команд, диагностических сообщений и созданных баз ив таблиц.

Литература: Официальный сайт phpMyAdmin http://phpmyadmin.sourceforge.net/


Лабораторная работа № 2

Тема №2. Создание пользователей базы данных 

1. Цель работы

Создание пользователей и определение их привилегий.

2. Основные сведения

Прежде чем использовать базу данных, необходимо создать пользователей базы данных, которые могут к ней обращаться. Это делается следующим образом. Перейдите к началу процесса (). Ниже на рис. 2.21. показана часть окна из рис. 2.2, в которой присутствует вкладка “Привилегии”.

Рис. 2.21. Создание пользователя  из базы данных.

Используя эту вкладку (пункт- , рис. 2.21) мы получаем следующее окно для создания пользователей базы данных (рис. 2.22).

Рис. 2.22. Создание пользователя  из базы данных.

Используя функцию “Добавить нового пользователя” (рис. 2.22) происходит переход к окну, где необходимо определить пользователя и что ему разрешено делать с указанной базой данных. Окно выглядит следующим образом (рис. 2.23).

Рис. 2.23. Создание пользователя  базы данных.

В поле “Имя пользователя” (рис. 2.23) информация вводится латинскими буквами, например, “people”. В поле “Xost” указывается, например,”localhost”, что обозначает для данного пользователя доступ к базе данных с локальной машины и указывается его пароль (который дублируется в поле с именем “Подтверждение”). В нижней части открываем привилегии (вскидываем галочки) для опций доступных данному пользователю в базе данных My_base. Таким образом, экран показанный на рис. 2.23 приобретает вид (рис. 2.24).

Примечание. Для дальнейших примеров, пусть для пользователя использован (введен) пароль “12345”

Рис. 2.24. Создание пользователя  базы данных и указание его привилегий.

Реакция системы будет следующей, если будет нажата кнопка “Пошел” (рис. 2.25) и пользователь будет зарегистрирован для доступа к базе данных.

Рис. 2.25. Создание и регистрация пользователя  базы данных.

После получения прав доступа необходимо протестировать базу данных. Для этого необходимо  закрыть базу (Stop Denwer – двойной клик) и перейти в папку C:\WebServers\home\moy.loc\www\index.php (рис. 2.26), где хранится Ваш скрипт, содержащий PHP код (рис. 2.27). Папка создана в момент установки собственного сервера (лекция, описывающая создание сервера на Вашей машине).

 

Рис. 2.26. Папка, где хранится программа.

3. Программа работы

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

Шаг 1. Создайте копию из файла index.php в этой же папке с именем index0.php.

Шаг 2. Модифицируйте в index.php 3-ю строку (вставили символы 00) и сохраните его. На нижнем рисунке использован редактор 

 

<html>

<body>

<p> 00 Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?>

</body>

</html>

Рис. 2.26a. Модифицированная программа.

Этот запасной файл (index0.php) поможет Вам при последующих тестах.

Шаг 3. Находясь на выделенном файле, в Total Commander, нажмите клавишу F3 (Просмотр) и Вы должны увидеть только одну строку:

00 Проверка моего домена с именем Moy.loc

Шаг 4. Находясь на выделенном файле в Total Commander нажмите клавишу F4 (Редактировать) и Вы должны увидеть полный текст программы, показанный на шаге 2.

Теперь необходимо модифицировать файл Index.php и вставить в него операторы языка PHP для обращения к хранимой информации (рис. 2.29) в таблице Lessons базы данных My_Base.

<html>

<body>

<p> Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?>

</body>

</html>

Рис. 2.27. Текст программного кода файла index.php до модификации.

Запустите сервер и укажите в адресной строке http://moy.loc/.

Рис. 2.28. Сайт до модификации на основе кода файла index.php из рис. 2.26а.

Не закрывая сервер, модифицируйте файл index.php. Вставьте, например, в  3-й строке слово NEW и сохраните его. Нажмите кнопку “Обновить” в браузере

Рис. 2.29. Обновление файла index.php без перезагрузки сервера.

 

Рассмотренный прием позволяет экономить Ваше время при отладке программ.

Ниже (рис. 2.30) приводится текст модифицированной программы из рис. 2.27 и результат запроса (рис. 2.31) к базе данных My_base на основании встроенного PHP кода (строки 6-12). Для учебных целей строки программы пронумерованы и физически они в файле index.php не присутствуют.

В отличие от кода представленного на рис. 2.27, в программе на рис. 2.30 присутствует встроенный PHP код и интерпретируемые операторы обращения к базе данных. Заметим, что сам язык SQL (а точнее его диалект для СУБД MySQL) не имеет никакого отношения ни к языку HTML, ни к языку PHP.

1   <html>

2   <body>

3   <p> NEW Проверка моего домена с именем Moy.loc </p>

4   <? echo "Проверка вставки PHP кода в содержимое HTML" ?><br>

5   

6   <?

7     $db = mysql_connect("localhost","people","12345");

8     mysql_select_db ("my_base",$db);

9     $result = mysql_query ("SELECT * FROM lesonss ", $db);

10   $num = mysql_num_rows ($result);

11   echo "Всего лекций в базе My_base, в таблице Lessons пока - $num";

12   ?>

13

14   </body>

15   </html>

Рис. 2.30. Модифицированный текст программного кода файла index.php.

Примечание. Не копируйте содержимое из рис. 2.30 в файл index.php. В том рисунке в тексте есть грамматическая ошибка.

 

Теперь, если в адресной строке браузера указать адрес http://moy.loc/ , то используя файл hosts система сформирует новое содержимое сайта, которое должно быть как показано на рис. 2.31, если Вы не получили подобное изображение, то посмотрите на рис. 2.32.

Рис. 2.31. Сайт после модификации на основе кода файла index.php.

Внимание ! Так должно быть. Но ! Ошибка будет раскрыта далее!

Поясним некоторые строки (рис. 2.30) кода языка PHP встроенные в язык HTML, позволяющие обратиться к базе данных MySQL и обратиться к хранимой в ней таблице Lessons для подсчета количества лекций хранимых в этой таблице.

Шестая и двенадцатая строка является стандартом, указывающим интерпретатору, что все расположенное между этими строками относится к языку PHP.

Седьмая строка (рис. 2.30)

$db = mysql_connect("localhost","people","12345");

осуществляет соединение с СУБД  MySQL для пользователя с именем "people", имеющего пароль "12345". Первый параметр функции "localhost", указывает, что информация должна браться с текущего (локального) компьютера. Успешность соединения с сервером СУБД  MySQL фиксируется в переменной (идентификаторе) $db.

Восьмая строка, используя встроенную функцию языка PHP

mysql_select_db ("my_base", $db);

позволяет обратиться к базе данных с именем  "my_base", используя идентификатор  $db.

Девятая строка (рис. 2.30), используя встроенную функцию языка PHP  mysql_query

$result = mysql_query ("SELECT *  FROM  lesonss ", $db);

реализует запрос к таблице lessons  базы данных на основе оператора языка SQL SELECT. Этот первый параметр (обязательно в двойных ковычках) является конструкцией языка SQL. Вторым оператором функции является идентификатор  $db. Результат работы функции фиксируется в переменной с именем $result , которая по своей структуре является двумерным массивом.

Деcятая строка, используя встроенную функцию языка PHP mysql_num_rows

$num = mysql_num_rows ($result);

подсчитывает число строк в массиве  $result , т.е. фактически определяет, сколько записей хранится в таблице lessons.

Одиннадцатая строка, используя встроенную функцию языка PHP echo 

echo   "Всего лекций в базе My_base, в таблице Lessons пока - $num";

обеспечивает вывод сообщения на экран. Внутри этого сообщения могут быть использованы объявленные в теле программы переменные. В нашем случае такой переменной является переменная  $num.

Пятая и тринадцатая строка в тексте программы (рис. 2.30) вставлены для читаемости текста. В четвертой строке использован тег переноса <br>, который заставляет осуществлять вывод последующей информации с новой строки экрана.

4. Указания к выполнению работы

Если Вы не получили окно показанное на рис. 2.31, а получили что-то подобное, как показано например, на рис. 2.32, то Вы скорее всего скопировали в файл index.php информацию из рис. 2.30, что не рекомендуется, т. к. при правке Вы могли допустить неточность.

Рис. 2.32. Предупреждение после модификации кода файла index.php.

Чтобы проверить это предположение закомментарим /*   */ введенную часть текста (рис. 2.33).

<html>

<body>

<p> New  Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?><br>

<?

/* комментарий в стиле СИ

  $db = mysql_connect("localhost","people","12345");

   mysql_select_db ("my_base",$db);

   $result = mysql_query ("SELECT * FROM lesonss ", $db);

  $num = mysql_num_rows ($result);

  echo "Всего лекций в базе My_base, в таблице Lessons пока - $num";

*/

?>

</body>

</html>

Рис. 2.33. Использование блокового комментария в php (строки 7 и 13).

Более подробно использование комментариев в языке PHP приведено далее.

На данном этапе после сохранения изменений и перезапуска Вы увидите уже привычный экран (рис. 2.29). Значит ошибка внутри вставленного кода.

Для простейшей отладки приведите текст программы к виду (рис. 2.34).

<html>

<body>

<p> New 1Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?><br>

 

<?

$db = mysql_connect("localhost","people","12345") or die ("Нет соединения". mysql_error());

mysql_select_db ("my_base",$db)or die ("Нет доступа к базе".mysql_error());

$result = mysql_query ("SELECT * FROM lesonss ", $db) or die ("No доступа к табл".mysql_error())

//$num = mysql_num_rows ($result);

//echo "Всего лекций в базе My_base, в таблице Lessons пока - $num";

?>

</body>

</html>

Рис. 2.34. Использование строкового комментария в php (строки 10 и 11) и функции mysql_error().

Обратите внимание, что точка перед функцией mysql_error() поставлена не случайно.

После проведенных манипуляций Вы получите на экране (рис. 35)

Рис. 2.35. Ошибка, выданная функцией mysql_error() из строки 9 кода на рис. 2.14.

Ошибка заключается в неправильном написании слова lesonss в 9-ой строке кода представленного на рис. 2.34. Таблицы с таким названием в базе данных My_Base нет, а есть таблица с именем lessons.

Таким образом, правильный текст программы следующий (рис. 2.36):

<html>

<body>

<p> New  Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?><br>

<?

$db = mysql_connect("localhost","people","12345");

mysql_select_db ("my_base",$db);

$result = mysql_query ("SELECT * FROM lessons ", $db)

$num = mysql_num_rows ($result);

echo "Всего лекций в базе My_base, в таблице Lessons пока - $num";

?>

</body>

</html>

Рис. 2.36. Правильный код index.php.

Используем данный код (рис. 2.36) для проверки функции mail.

$v = mail ("admin@moy.com","Привет", "Проверка функции MAIL"), которая позволяет переслать информацию с сервера клиенту (ам). Текст программы приобретет вид (рис. 2.37).

<html>

<body>

<p> New  Mail  Проверка моего домена с именем Moy.loc </p>

<? echo "Проверка вставки PHP кода в содержимое HTML" ?><br>

<?

$db = mysql_connect("localhost","people","12345");

mysql_select_db ("my_base",$db);

$result = mysql_query ("SELECT * FROM lessons ", $db);

$num = mysql_num_rows ($result);

echo "Всего лекций в базе My_base, в таблице Lessons пока - $num";

$v = mail ("admin@moy.com","Привет","Проверка функции MAIL");

?>

</body>

</html>

Рис. 2.37. Код index.php использующий обратную связь.

Первый параметр функции mail – это адрес получателя.

Второй параметр функции – это тема письма.

Третий параметр функции – это содержание письма

В качестве получателя использован адрес, сформированный в предыдущей лабораторной работе. Поэтому при загрузке файла Index.html на исполнение, функция mail будет автоматически слать сообщение по указанному адресу.

Если программу представленную на рис. 2.2 сохранить и перейти в Вашем браузере (например, в Internet Explorer) по адресу http://moy.loc/, то Вы получите следующее окно (рис. 2.38).

Рис. 2.38. Окно браузера.

Аналогичный вариант Вы получите и в окне другого браузера (рис. 2.38a).

Рис. 2.38a. Окно браузера.

Для того чтобы проверить ушло ли сообщение, необходимо перейти в папку, куда Вы установили сервер (в нашем случае это  C:\WebServers) и найти в ней подпапку с именем !sendmail (рис. 2.39).

Рис. 2.39. Папка !sendmail для хранения сообщений по Email.

Если открыть эту папку, то в ней увидим полученное письмо (рис. 2.40).

Рис. 2.40. Возможный состав папки.

Имя письма состоит из даты отправки и времени получения. Расширение  .eml, указывает к какому типу файлов относится данный файл.

Если раскрыть этот файл, то мы увидим следующее содержимое (рис. 2.41).

  •  

Рис. 2.41. Содержимое письма.

5. Содержание отчета

1. Результаты тестирования, полученные с помощью диагностических программ.


Лабораторная работа № 3. Программирование в среде CУБД на  ПЭВМ

Программирование с использованием PHP и MySQL 

1. Цель работы

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

2. Основные сведения

Тема №1

Создание форм

Цель работы: Получение практических навыков по созданию форм в документах HTML.

Тема №2

Передача значений переменным в сценариях PHP. Использование возможностей метода GET  без HTML-формы для передачи значений переменных в сценариях PHP

Цель работы: Получение практических навыков по передаче значений переменным в сценариях РНР с использованием формы и с помощью метода GET.

Тема №3

Создание формы и РНР-сценария в одном файле

Цель работы: Получение навыков и понимание взаимосвязанной работы формы и ее обработки.

Тема №4

Использование чисел. Управляющие структуры For и While

Цель работы: работа с численными данными в форме.

Тема №5

Использование управляющей структуры switch

Цель работы: Обучение применению структуры switch.

Тема №6

Использование регулярных выражений в сценариях РНР

Цель работы: Получение практических навыков в использовании регулярных выражений при обработке форм.

Тема №7

Работа с массивами

Цель работы: Обучение использованию массивов в сценариях PHP.

Тема №8

Использование функций в сценариях РНР

Цель работы: Получение навыков по применению функций в PHP при обработке сценариев.

Тема №9

Использование файлов для хранения данных  в сценариях РНР

Цель работы: Обучение работе с файлами для хранения данных при обработке сценариев.

Тема №10

Работа с каталогами

Цель работы: Получение практических навыков по работе с деревом каталогов.

Тема №11

Создание панели управления файлами

Цель работы: Получение практических навыков по обработке файлов в сценариях.

Тема №12

Работа с базой через монитор MySQL и PhpMyAdmin.

Цель работы: Изучение команд MySQL для хранения, выборки и обработки данных с использованием монитора MySQL и средств PhpMyAdmin.

Тема №13.

Извлечение данных из базы данных

Цель. Практическое использование конструкций SQL.

Тема №14.

PHP и MySQL. Доступ к базе данных MySQL из Web с помощью РНР.

Цель работы: Получение практических навыков по связке MySQL и PHP.

3. Указания к выполнению работы

Исходные темы и данные для тем, студент выбирает самостоятельно, но последние две темы являются обязательными для всех. Число рассмотренных тем в Вашей лабораторной работе №3 не может быть меньше чем 7. В пункте 5 приведены исходные коды и формы, использованные в вышеперечисленных темах. Если в качестве целевой СУБД  Вы использовали другую систему – то требования к выбору тем не меняются.

4. Содержание отчета

1. Исходные тексты программ.

2. Результаты тестирования, полученные с помощью диагностических программ.

5. Примеры реализации тем

Тема №1. Создание форм

Цель работы: Получение практических навыков по созданию форм в документах HTML.

Задание 1. Разработать HTML-форму с переключателями

вида (рис. 3.1).

Рис. 3.1. HTML форма.

Исходный код (файл lab1.php) представлен ниже (рис. 3.2.).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab1</title>

</head>

<body>

<body bgcolor=#99CCCC>

<form method=post action=""> <!--Начало формы-->

<table>

<tr>

<td valign=top>Текстовое поле</td>

<td><input type=text name="text1" value="Значение text1 не более 255 символов,size=50" size=50></td>

</tr>

<tr>

<td valign=top>Текстовое поле PASSWORD</td>

<td><input type=password name="pwd" value="Пароль- password"></td>

</tr>

<tr>

<td valign=top>Текстовое поле TEXTAREA</td>

<td><textarea name="text2" rows=4 cols=30>Текст длина которого может превышать 255 символов. Показывать строк rows=4</textarea></td>

</td>

<tr>

<td valign=top>Переключатели CHECKBOX</td>

<td>

<input type=checkbox name="chk1" value="on" checked>   Первый<br>

<input type=checkbox name="chk2" value="on" >   Второй<br>

<input type=checkbox name="chk3" value="on" checked>   Третий<br>

</td>

</tr>

<tr>

<td valign=top>Переключатели RADIO</td>

<td>

<input type=radio name="rad" value="on1" checked>Первый<br>

<input type=radio name="rad" value="on2" >Второй<br>

<input type=radio name="rad" value="on3" checked>Третий<br>

</td>

</tr>

<tr>

<td valign=top>List</td>

<td><select name="sel" size=1>

<option value="first option">First option</option>

<option value="second option">Second option</option>

<option value="none">Нет выбора</option>

</select>

</tr>

<tr>

<td valign=top>Скрытый орган управления</td>

<td><input type=hidden name="hid" value="hidden"</td>

</tr>

</table>

<br>

<input type=submit value="Переслать" /> <!--&nbsp;-->

<input type=reset value="Reset">

</form> <!--Конец формы-->

</body>

</html>

Рис. 3.2. Код HTML формы.

Ниже приводится описание основных конструктивных элементов, использованных при создании формы (рис. 3.1), представленных в коде рис. 3.2.

Теги <form> и </form>

Теги <form> и </form> задают начало и конец формы. Начинающий форму тег <form> содержит два атрибута: action и method. Атрибут action содержит адрес URL сценария, который должен быть вызван для обработки сценария (на рис. 3.2. обработчик событий не указан action=""). Атрибут method указывает браузеру, какой вид HTTP запроса необходимо использовать для отправки формы; возможны значения POST и GET (на рис. 3.2. указан метод method=post).

Главное отличие методов POST и GET заключается в способе передачи информации. В методе GET параметры передаются через адресную строку, т.е. по сути в HTTP-заголовке запроса, в то время как в методе POST параметры передаются через тело HTTP-запроса и никак не отражаются на виде адресной строки.

Допустима запись:

<form method="post" action="../admin/add.php">

</form>

Текстовое поле (text)

Позволяет пользователям вводить различную информацию.

<input type="Тип" name="Имя поля" size="Размер" maxlength="Макс. количество символов">

При создании обычного текстового поля размером size и максимальной допустимой длины maxlength символов, атрибут type принимает значение text. Если указан параметр value, то поле будет содержать отображать value-текст. При создании поля не забывайте указывать имя поля, т.к. этот атрибут является обязательным.

Например:

<input type="text" name="txtName" size="10" maxlength="5" value="Текст по умолчанию">

Поле для ввода пароля (password)

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

Например:

<input type="password" name="txtName" size="10" maxlength="5">

Многострочное поле ввода текста (textarea)

Многострочное поле ввода текста позволяет отправлять не одну строку, а сразу несколько. По умолчанию тег создает пустое поле шириной в 20 символов и состоящее из двух строк.

<textarea name="Имя поля" cols="Ширина поля " rows="Число строк">Текст</textarea>

Многострочное поле ввода текста начинается с парных тегов <textarea></textarea>. Тэг name задает имя многострочного поля. Также можно указать ширину поля (cols) и число строк (rows). При необходимости можно указать атрибут readonly, который запрещает редактировать, удалять и изменять текст, т.е. текст будет предназначен только для чтения. Если необходимо чтобы текст был изначально отображен в многострочном поле ввода, то его необходимо поместить между тэгами <textarea></textarea>.

Например:

<textarea name="txtArea" cols="15" rows="10" readonly>

Текст, который изначально будет отображен в многострочном поле ввода и который нельзя изменять, т.к. указан атрибут readonly </textarea>

Флажок (checkbox)

Флажки checkbox предлагают пользователю ряд вариантов, и разрешает выбор нескольких из них.

Группа флажков состоит из элементов <input>, имеющих одинаковые атрибуты name и type(checkbox). Если вы хотите, чтобы элемент был отмечен по умолчанию необходимо пометить его как checked. Если элемент выбран, то сценарию поступит строка имя=значение, в противном случае в обработчик формы не придет ничего, т.е. не выбранные флажки вообще никак не проявляют себя в переданном наборе данных.

Например:

<input name="mycolor" type="checkbox" value="red" checked>Красный(выбран по умолчанию)

<input name="mycolor" type="checkbox" value="blue">Синий 

<input name="mycolor" type="checkbox" value="black">Черный 

<input name="mycolor" type="checkbox" value="white">Белый

Переключатель(radio)

Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них.

<input name="Имя переключателя" type="Тип" value="Значение">

Переключатель (radio) имеет атрибуты name, type и value. Атрибут name задает имя переключателя, type задает тип radio, а атрибут value задает значение. Если пользователь выберет переключатель, то сценарию будет передана строка имя=значение. При необходимости можно указать параметр checked, который указывает на то, что перключатель будет иметь фокус (т.е. будет отмечен по умолчанию) при загрузке страницы. Переключатели также можно объединять в группы, для этого они должны иметь одно и тоже имя.

Например:

 <input name="mycolor" type="radio" value="white"> Белый

 <input name="mycolor " type="radio" value="green" checked> Зеленый (выбран по умолчанию)

 <input name="mycolor " type="radio" value="blue"> Синий

 <input name="mycolor " type="radio" value="red"> Красный

 <input name="mycolor " type="radio" value="black"> Черный

Скрытое текстовое поле (Скрытый орган управления)

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

<input name="Имя" type="Тип" value="Значение">

Скрытое поле начинается с тега <input>, атрибуты которого являются name, type и value. Атрибут name задает имя поля, type определяет тип поля, а атрибут value задает значение поля.

Например:

<input name="email" type="hidden" value="spam@nospam.ru">

Кнопка отправки данных формы (submit)

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

<input type="Тип" name="Имя кнопки" value=" текст_на_кнопке ">

При создании кнопки для отправки формы необходимо указать 2 атрибута: type=“submit” и value=”Текст кнопки”. Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.

Кнопка отправки данных инициирует действие, заданное атрибутом action тега <form>. Синтаксис определения:

<input type="submit" value=" текст_на_кнопке">

Определение кнопки включает два атрибута:

type -- тип элемента (для кнопки отправки данных -- submit);

value -- текст, по умолчанию отображаемый на кнопке.

Кнопка сброса формы (Reset)

Кнопка сброса отменяет все изменения, внесенные в элементы формы.

<input type="Тип" name="Имя кнопки" value="Надпись на кнопке">

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

Например:

<input type="reset" name="Reset" value="Очистить форму">

<input type="reset" value="текст_на_кнопке">

Определение кнопки включает два атрибута:

type -- тип элемента (для кнопки сброса -- reset);

value -- текст, по умолчанию отображаемый на кнопке.

Кнопка сброса выглядит точно так же, как и кнопка отправки данных, если не считать того, что на ней обычно выводится слово «Reset» (рис. 3.1).


Задание 2: Разработать HTML-форму с методом Post

вида (рис. 3.3).

Рис. 3.3. Пример 2 HTML формы.

Код Lab1_2.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title> Lab1_2</title>

</head>

<body bgcolor=#ffacb3>

<b>Регистрационная страница электронной библиотеки</b>

<p>Заполнив анкету, вы сможете пользоваться нашей электронной библиотекой

<p><form methos="post" action="">

<table>

<tr>

<td>Введите регистрационное имя</td>

<td><input type=text name="text1" value="" ></td>

</tr>

<tr>

<td>Введите пароль</td>

<td><input type=password name="pwd" value=""></td>

</tr>

<tr>

<td>Подтвердите пароль</td>

<td><input type=password name="pwd" value=""></td>

</table>

<p>

Ваш возраст

<input type=radio name="r1" value="on1" checked>До 20

<input type=radio name="r2" value="on2" >20-30

<input type=radio name="r3" value="on3" >30-50

<input type=radio name="r4" value="on3" >старше 50

<p> На каких языках читаете:

<input type=checkbox name="ch1" value="on" checked>русский

<input type=checkbox name="ch2" value="on" >английский

<input type=checkbox name="ch3" value="on" >французский

<input type=checkbox name="ch3" value="on" >немецкий

<p>Какой формат данных является для вас предпочтительным?

<p><select name="sel" size=2>

<option value="html" selected>HTML</option>

<option value="plain">Plain text</option>

</select><p>

Ваши любимые авторы:

<p><textarea name="text2" rows=3 cols=30></textarea>

<br>

<input type=submit value="OK">&nbsp;

<input type=reset value="Отменить">

</form>

<?php echo "<p>Проверка PHP Лабораторные по базам данных</p>";

 ?>

 

<table width="690" border="1" align="center" bgcolor="#FFFFFF">

 <tr>

 <td><img src="img/footer.jpg" width="690" height="18" alt="Сайт Должен проявиться по наведению мышки"/td>

 

 </tr>

</table>

<center>

Сегодня замечательный день. <br>Я сделал свою первую интернет страничку.

<br><font color="#0000FF">я буду богатым и свободным человеком !</font>

<br>

</center>

</body>

</head>

Рис. 3.4. Код HTML формы для примера 2 рис. 3.3.

В приведннном коде на рис. 3.4  использованы две новые конструкции:

выпадающий список (select)

<p><select name="sel" size=2>

<option value="html" selected>HTML</option>

<option value="plain">Plain text</option>

</select><p>

и использование рисунков (img) в форме

 <td><img src="img/footer.jpg" width="690" height="18" alt="Сайт Должен проявиться по наведению мышки"/td>

Выпадающий список (select)

Тэг <select> представляет собой выпадающий или раскрытый список, при этом одновременно могут быть выбраны одна или несколько строк.

Список начинается с парных тегов <select></select>. Теги <option></option> позволяют определить содержимое списка, а параметр value определяет значение строки. Если в теге <option> указан параметр selected, то строка будет изначально выбранной. Параметр size задает, сколько строк будет занимать список. Если size равен 1, то список будет выпадающим. Если указан атрибут multiple, то разрешено выбирать несколько элементов из списка(при size = 1 не имеет смысла).

<select name="Имя списка" size = “Размер” multiple>

<option value=”Значение”>Отображаемый текст в списке</option>

</select>

При передаче данных выпадающего списка сценарию передается строка имя=значение, а при раскрытом списке передается строка имя=значение1&имя=значение2&имя=значениеN.


Тема №2. Передача значений переменным в сценариях PHP. Использование возможностей метода GET без HTML-формы для передачи значений переменных в сценариях PHP

Цель работы: Получение практических навыков по передаче значений переменным в сценариях РНР с использованием формы и с помощью метода GET.

Задание 1: Разработать приложение с использованием метода GET, в котором:

Создается форма ввода (см. рис. 3.5.) помощью программы Lab2.php (см. рис. 3.6.) для введения пользователем данных:

  •  Имени;
  •  Фамилии;
  •  Адреса электронной почты;
  •  Текста - комментария.

Введенные данные PHP-сценарий  Lab2_result.php получает данные с формы .

  •  Отображает извлеченные из формы данные в окне браузера.
  •  Сценарий должен сгенерировать отправку данных в другой PHP-файл, который в свою очередь должен отобразить персональное приветствие пользователю.

Имена использоаванных и взаимосвязанных файлов: Lab2.php (описание и создание формы – рис. 3.6.), Lab2_result.php (обработчик событий для Lab2.php), Lab2_GET.php (использование метода Get)

В форму созданную с помощью Lab2.php (описание и создание формы) введите, например следующую информацию (рис. 3.5.)

Рис. 3.5. Форма с обработчиком на кнопке “OK” .

Исходный код Lab2.php (создание формы).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01

Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab2</title>

</head>

<body bgcolor=#CCFFFF>

<form action="Lab2_result.php" method="POST">

<!--Lab2_result.php Обработчик для данной HTML формы. -->

<!--В указании имени method надо указывать ковычки !!! -->

<table>

<tr>

<td> Введите Ваше имя: <br></td><!--имя атрибута на экране-->

<td><input type=text name="FName" size=20></td>

</tr>

<tr>

<td>Last Name</td><!--имя атрибута на экране-->

<td><input type=text name="LName" size=20></td>

</tr>

<tr>

<td>E-mail</td><!--имя атрибута на экране-->

<td><input type=text name="Email" size=40></td>

</tr>

<tr>

<td> Примечание </td><!--имя атрибута на экране-->

<td><textarea name="Comments" rows=5 cols=40></textarea></td>

</tr>

</table>

<input type=submit name="Submit" value="OK">&nbsp;

<input type=reset name="Reset" value="Очистить">

<!--Нажатие кнопки name="Submit" с именем value="OK" приведет к вызову обработчика данной формы (к аналогичному действию приведет нажатие Enter на любом из полей). Нажатие кнопки name="Reset" с значением  value="Cancel" (Очистить) приведет к уничтожению всех объявленных переменных в форме.

&nbsp - непрерывный пробел

Веб-браузеры обычно игнорируют дополнительные символы пробела, введенные в текст страницы. Для этого используется команда &nbsp. Эта команда создает неделимое пустое пространство между элементами страницы, будь то графика или текст. Следует учитывать тот факт, что использование &nbsp вместо пробела между двумя соседними словами гарантирует, что оба слова не будут разнесены по разным строкам в окне браузера - они будут расположены всегда рядом.

-->

</form>

</body>

</html>

Рис. 3.6. Код создания формы для рис. 3.5.

Нажатие , (на выше показанной форме рис. 3.5) приводит к следующему результату в окне браузера (рис. 3.7). Отметьте, что имя программы обработчика в адресной строке будет сформировано автоматически.

Рис. 3.7. Результат обработки события  после нажатия кнопке “OK” на рис. 3.5.

Код программы (Lab2_result.php), который приводит к этому результату приведен ниже (рис. 3.8).

Lab2_result.php (обработчик для кнопки “OK”)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab2_обработчик</title>

Информация попадает в обработчик - программа Lab2_result.php

</head>

<body bgcolor=#FFFFFF><!--Цвет фона белый-->

<?PHP

print("<br>В обработчике переменные из HTML кода Lab2.php напрямую не доступны! <br>");

print("Имя переменная FName is: $FName <br>");

print("Указана фамилия is: $LName <br>");

print("e-mail is: $Email <br>");

print("Комментарий: $Comments <br>");

print("Через массив POST переменные наверняка будут доступны<br>");

$FName = $_POST["FName"];

print("Имя FName $FName передано через глобальный POST: $_POST[FName] <br>");

//а как указано ниже - даст ошибку

//print("Имя FName $FName передано через глобальный POST:

//$_POST['FName'] <br>");

print("Указана фамилия is: $_POST[LName] <br>");

print("e-mail is: $_POST[Email] <br>");

print("В примечании указано $_POST[Comments] <br>");

print("Click  <a href=Lab2_GET.php?FName=$FName&LName=$_POST[LName]>here</a> здесь, чтобы посмотреть как работает метод GET");

//После знака '?' перечислены переменные, которые должны быть

//доступны в программе Lab2_GET, которая вызывается по ссылке,

//если пользователь кликнет на слове here, то будет вызвана

//программа Lab2_GET.php с указанными переменными

//Слово here может быть заменено на смысловое русское слово

?>

</body>

</html>

Рис. 3.8. Код программы обработки события на кнопке “OK”.

Если выполнить действие

то будет вызвана программа Lab2_GET.php (рис. 3.10.) результат (рис. 3.9) и исходный код, которой приведен ниже.

Рис. 3.9. Результат обработки события по ссылке HERE.

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

Код Lab2_GET.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab2_GET</title>

</head>

<body>

<?PHP

//реакция при нажатии на ссылку, см. файл Lab2_GET.php слово Here

$FName = $_GET['FName'];

$LName = $_GET['LName'];

print("<center> Hello из Lab2_GET Имя:'$FName' Фамилия: ' $LName '!!!</center>");

//А так будет ошибка print("<center> Hello из Lab2_GET Имя  $FName $Lname !!!</center>");

?>

</body>

</html>

Рис. 3.10. Исходный код программы Lab2_GET.php.

В данной лабораторной работе были получены практические навыки по передаче данных в РНР-сценарий с помощью HTML-форм и с помощью метода GET.


Тема №3. Создание формы и РНР-сценария в одном файле

Цель работы: Получение навыков и понимание взаимосвязанной работы формы и ее обработки.

Обработка форм

Все данные, которые Вы хотите получить из HTML-формы в PHP сценарий обрабатываются с помощью суперглобальных массивов $_POST или $_GET, в зависимости от указанного в атрибуте method метода передачи данных.

Задание 1: Получение данных из текстового поля

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

Решение: Необходимо создать HTML форму и PHP – сценарий для обработки формы.

Создадим два файла: form.html и action.php. В файле form.html будет содержаться html-форма с текстовым полем mytext и текстовой областью msg:

<form action="action.php" name="myform" method="post">

  <input type="text" name="mytext" size="50">

 <textarea name="msg" cols="20" rows=”10” ></textarea>

   <input name="Submit" type=submit value="Отправить данные">

</form>

В этой html-форме нас интересует три элемента: action, который указывает путь к обработчику формы (action.php), имя текстового поля (mytext) и имя многострочного поля вода (msg). Также в форме присутствует кнопка (Submit), при нажатии на которую, происходит передача данных.

После того как html-форма готова, необходимо создать обработчик формы action.php:

<?php

 $text =  $_POST['mytext'];

 $msg =  $_POST['mytext'];

 echo $text; // Выводим содержимое текстового поля

?>

После того как мы введем любые значение в текстовые поля и нажмем на кнопку "Отправить данные" html-форма отправит значения сценарию action.php.

После этого в переменных $text и $msg будут содержаться значения текстового поля и многострочного поля ввода соответственно, значения которых взяты из суперглобальных переменных $_POST.

Если вы хотите, чтобы в многострочном текстовом поле соблюдалось html-форматирование, то используйте функцию nl2br():

<?php

 $text = nl2br($_POST['mytext']);

?>

Задание 1.: Разработать приложение, в котором:

Создается форма ввода (см. рис. 3.11.) помощью программы Lab3.php (см. рис. 3.12.) для введения пользователем данных:

  •  Имени;
  •  Фамилии;
  •  Адреса электронной почты;
  •  Текста - комментария.

Информация указанных данных должна быть охвачена рамкой (fieldset).

Введенные данные обабатываются этим же PHP-сценарием Lab3.php (при нажатии кнопки “OK” или Enter на поле ввода). В программе показана реализация ограничения, требующего обязательного ввода значения поля  Фамилия. Если поле Фамилия будет означено и нажата кнопка OK”, то необходимо вызвать программу Lab3_1.php, в которую необходимо передать зашифрованную информацию.

Lab3_1.php  должна отобразить данные в окне браузера.

Рис. 3.11. Форма созданная с помощью программы Lab3.php с введенными данными.

Исходный код программы Lab3.php создающий форму средствами PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab3 Anketa</title>

</head>

<h1 align="justify" >Анкета </h1><!--Заголовок формы-->

<!--justify: строки текста выравниваются по обоим краям.-->

<fieldset style="width: 50%" align="right">

<legend>Ввод исходных данных (заголовок рамки)</legend>

<body bgcolor=><!--по умолчанию белый фон формы-->

<?PHP //тело PHP блока для создания и обработки формы

if (!isset($_POST[Submit]))

{

//echo "Кнопку Submit=OK еще не нажимали <br>";

//Создание формы и описание ее объектов.

print("<form  action=\"Lab3.php\" method=POST>");

print("<table> <tr><td> Имя </td>");

print("<td><input type=text name=\"FirstName\" size=20></td></tr>");

print("<tr><td>Фамилия</td>");

print("<td><input type=text name=\"LastName\" size=20></td></tr>");

print("<tr><td>E-mail</td>");

print("<td><input type=text name=\"Email\" size=40></td></tr>");

print("<tr><td> Комментарий</td>");

print("<td><textarea name=\"Comments\" rows=5 cols=40></textarea></td></tr></table>");

print("<input type=submit name=\"Submit\" value=\"OK\">&nbsp;");

print("<input type=reset name=\"Reset\" value=\"Отмена-Cancel\">");

//print("<input type=reset name=\"Reset\" value=\"Cancel\">//");

print("</form>");

}

else

{//Вывод введенных данных

$FirstName=trim($_POST[FirstName]);

$iFirstName=$FirstName;

echo "Вышли из формы, нажав кнопку OK. Вывод значений переменных <br>";

$LastName=trim($_POST[LastName]);

if (empty($LastName))

 {//проверка на пустое значение переменной $LastName- Фамилия

   echo '$LastName Не введена. Введите Фамилию ';

exit; //выйти из программы

}

$Email=trim($_POST[Email]);

$Comments=trim($_POST[Comments]);

$Name=$FirstName." ".$LastName;

print("Ваше имя Firstname is: $FirstName <br>");

print("Ваша фамилия is: $LastName <br>");

print("Ваш e-mail is: $Email <br>");

print("В поле комментария было: $Comments <br>");

$FirstName=md5($FirstName);//шифруем имя

print("Шифрованное имя через md5(Firstname) - is $FirstName <br>");

print("Конкатенация Имени и фамилии: $Name <br>");

$Name=urlencode($Name);

print("urlencode Имени и фамилии: $Name <br>");

print("Click  <A href=\"Lab3_1.php?Name=$Name\">here</a> здесь и будет вызвана Lab3_1.php с параметром Name=<br> $Name, ввели имя=".$iFirstName);

//Действие каждого из 6-и ниже стоящих операторов

//эквивалентно действию вышестоящего оператора

//print (" <a href=Lab3_1.php?Name=$Name> here</a> ");

//print " <a href=Lab3_1.php?Name=$Name> here</a> ";

//echo ("<br><a href='Lab3_1.php?Name=$Name'> here</a>");

//echo "<br><a href='Lab3_1.php?Name=$Name'> here</a>";

//echo "<br><a href='Lab3_1.php?Name=$Name'> См.далее</a>";

//print("Click  <A href=\"http://localhost/PHP/Lab3_1.php?Name=$Name\">here</a> здесь и будет вызвана Lab3_1.php с параметром $Name, ввели имя=".$iFirstName);

}

?>

</body>

</html>

Рис. 3.12. Код программы Lab3.php для создания формы.

Прим. HTML код на рис. 3.12. показан мелким жирным шрифтом.

Если пользователь введет данные (как показано на рис. 3.11) и нажмет кнопку “OK”, то вновь будет вызвана программа Lab3.php, но в ней сработает ветка

else

{//Вывод введенных данных

и на экран будет выведена следующая информация (рис. 3.13)

Рис. 3.13. Результат обработки события “OK” при вводе значений данных как показано на рис. 3.11.

Если Пользователь использует (см. рис. 3.13), то будет вызвана программа Lab3_1.php, код которой приведен на рис. 3.14., а результат представлен на рис. 3.15.

Программа Lab3_1.php для обработки ссылки

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab3_1</title>

</head>

<body>

<?PHP

//реакция при нажатии на ссылку HERE, см. файл Lab3.php

//$FirstName = $_GET['FirstName'];

$Name = $_GET['Name'];

$Name1=$_REQUEST['Name'];

if (isset($Name1)) // проверка переменной Name1 на ее существование

{ echo "Переменная с именем Name1 доступна и равна ".$Name1."  Ее тип=".gettype($Name1);}

else

{ echo "Переменная с именем Name1 НЕ доступна через REQUEST";

 echo "<br>Ее тип=".gettype($Name1);//опеделение типа переменной

} //конец if-else

// echo "<br>Полный адрес к скрипту. Исполняется скрипт - http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

echo "<br>Исполняется скрипт-http://".$_SERVER['SERVER_NAME'];

$a=$_SERVER['REQUEST_URI'];

echo "<br>Передали через адресную строку <br>".$a;

echo "<br> Метод ".$_SERVER['REQUEST_METHOD']." также передал ".$Name ; // GET

echo "<br> QUERY_STRING ".$_SERVER['QUERY_STRING'];

echo "<br> PHP_SELF=".$_SERVER['PHP_SELF'];

if (isset($_SERVER['HTTP_REFERER'])) //контроль существования переменной

{

echo "<br>Вы пришли на данную страницу с адреса: ".$_SERVER['HTTP_REFERER'];

$e = $_SERVER['HTTP_REFERER'];//http://localhost/php/Lab3.php

$d = strstr($e, '/php/');

//print "<br> d=".$d; // печатает /php/Lab3.php

$pos = strpos($d, "/php/"); //

$str=substr($d,$pos+5); //вырежет только Lab3.php  

}

print("<br>Hello из $str - Имя и Фамилия: ' $Name '.Отработала ".$_SERVER['PHP_SELF']);

//print("<center> Hello из $d Имя и Фамилия: ' $Name '!!!</center>");

?>

</body>

</html>

Рис. 3.14. Исходный код программы Lab3_1.php – обработка ссылки.

Рамка (fieldset)

Объект fieldset позволяет вам нарисовать рамку вокруг объектов. Имеет закрывающий тэг </fieldset>. Заголовок указывается в тэгах <legend></legend>. Основное назначение объекта – задавание различных стилей оформления.

Например:

<fieldset>

<legend>Программное обеспечение (заголовок рамки)</legend>

Текст, который будет помещен внутри рамки.</fieldset>

Рис. 3.15. Результат работы программы Lab3_1.php – обработка ссылки.

Задание 2. Использование рамок в приложении

Разработать приложение в котором создается форма ввода, испоющая рамку (см. рис. 3.16.).

Рис. 3.16. Пример формы ввода на экране.

Программа Lab3_2.php (рис. 3.17) подготавливает форму для ввода информации:

  •  Имени;
  •  Фамилии;
  •  Текста - комментария.

Информация указанных данных должна быть охвачена рамкой (fieldset) и  выделена цветом отличным от стандартного цвета браузера.

Введенные данные обабатываются этим же PHP-сценарием Lab3_2.php (при нажатии кнопки “OK”). В программе показано реализация ограничения, требующего обязательного ввода значения поля  Фамилия. Если поле Фамилия будет означено и нажата кнопка OK” (рис. 3.17),

Рис. 3.17. Пример ввода значения фамилии.

то необходимо вызвать программу Lab3_2.php, в которой необходимо вывести на экран информацию в виде, показанном на рис. 3.18.

Рис. 3.18. Пример вывода введенных значений.

Исходный код программы, реализующий обработку и вывод информации на экран, показанный на рис. 3.17, 3.18 и 3.20 приведен на рис. 3.19 (мелким шрифтом показан текст относящийся к HTML коду).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<!--Обработчик формы в этом же файле Lab3_2.php, method=POST-->

<title>Lab3_2</title>

</head>

 

<body bgcolor="#f6f6f6" text="#009999" >

<h2>Использование <i><b>bgcolor</b></i> и выделение ссылки цветом</h2><!--Заголовок формы-->

<!--строки текста прижаты по умолчанию, т.е. влево-->

<!--Шрифтовые элементы (font elements) - физическая разметка текста

Шрифтовые элементы это: TT  "телетайпный" текст, т.е. текст одного размера

I  курсив

B  выделение

U  подчеркивание

STRIKE  зачеркнутый текст

BIG  большой шрифт

SMALL  малый шрифт

SUB  подстрочный текст

SUP  надстрочный текст.

-->

<!--<fieldset style="width: 50%" align="right">-->

<fieldset  style="width: 50%" ><!--Рамка формы-->

<legend><b>Ввод исходных данных(заголовок рамки)</b></legend>

<?PHP //начало встроеннго PHP кода

if (!isset($_POST[Submit]))//

{

$NameG=$_GET['LastName'];

$NameR=$_REQUEST['LastName'];

$NameP=$_POST['LastName'];

if (empty($NameG))

 echo "Кнопку Submit=OK еще не нажимали. Значение Фамилии в    массивах должно быть Get=$NameG = Пусто,REQUEST=$NameR =Пусто,Post=$NameP =Пусто <br>";

 // на экране будет:

 //Кнопку Submit=OK еще не нажимали. Значение Фамилии в

 //массивах должно быть Get= = Пусто,REQUEST= =Пусто,

 //Post= =Пусто

 else

 // на экране будет (если ввели например фамилию Кук):

 //Кнопку Submit=OK уже нажимали. Значение Фамилии в

 //массивах $_GET=Кук, $_REQUEST=Кук, S_Post=

 echo 'Кнопку Submit=OK <font color=red><BIG> уже </BIG> нажимали. Значение Фамилии в массивах $_GET='.$NameG.',  $_REQUEST='.$NameR.', S_Post='.$NameP.' <font color=blue><br>';

 

$a=$_SERVER['REQUEST_URI'];

echo "<br>Передали через адресную строку ".$a;

//на экране (если Фамилия не означена):

//Передали через адресную строку /php/Lab3_2.php

//на экране (если Фамилия означена и равна Кук):

//Передали через адресную строку

// /php/Lab3_2.php?LastName=%CA%F3%EA

echo "<br> Метод указанный в SERVER = ".$_SERVER['REQUEST_METHOD']." ".$Name." " ; // GET 

//на экране (при неозначенной или означенной фамилии):

//Метод указанный в SERVER = GET

$b=$_SERVER['QUERY_STRING'];

echo "<br>Передали через SERVER['QUERY_STRING'], b= ".$b;

//на экране (если Фамилия не означена):

//Передали через SERVER['QUERY_STRING'], b=

//на экране (если Фамилия означена и равна Кук):

//Передали через SERVER['QUERY_STRING'], b= LastName=%CA%F3%EA

$c = true;  

if (!empty($b)) {

//в адресной строке указан параметр и его значение

//echo ''.$b.' SERVER='.$_SERVER['QUERY_STRING'].'  не //пуста Факт = '.$_GET['LastName'];

$LastName=$_GET['LastName'];

$c=false;

}

echo "<br> QUERY_STRING ".($c ? 'Пусто' : 'Не пусто '.$b.' Фам=$LastName='.$LastName);

//на экране:

//QUERY_STRING Пусто, если значение $c = true

//иначе 

//QUERY_STRING Не пусто LastName=%CA%F3%EA Фам=$LastName=Кук

//echo "<br> Выполняется PHP_SELF=".$_SERVER['PHP_SELF'];

//Вывод вышестоящего оператора будет:

//Выполняется PHP_SELF=/php/Lab3_2.php

//Создание формы и описание ее объектов

echo"<font color=blue>";//цвет имен атрибутов в форме голубой

print("<form  action=\"Lab3_2.php\" method=POST>");

print("<table bgcolor='#33FF99'>

     <tr><td> Имя </td>");//вывод атрибута на экран

print("<td><input type=text name=\"FirstName\" size=20></td></tr>");

print("<tr><td>Фамилия</td>");

//print("<tr bgcolor='#33FF99'><td>Фамилия</td>");

if (!empty($b))

// Внимание! if (!c) не эквивалентно if (!empty($b))

{// в адресной строке указан параметр и его значение

//print("<td><input type=text name=\"LastName\" value=$LastName size=20></td></tr>");

print("<td><input type=text name=\"LastName\" value=".$_GET['LastName']." size=20></td></tr>");  

}

else

{

print("<td><input type=text name=\"LastName\" size=20></td></tr>");

}

print("<tr><td> Комментарий</td>");

print("<td><textarea name=\"Comments\" rows=5 cols=40></textarea></td>");

print("</tr></table>");

//формирование кнопок

print("<input type=submit name=\"Submit\" value=\"OK\">&nbsp;");

print("<input type=reset name=\"Reset\" value=\"Отмена-Cancel\">");

print("</form>");

}

else //Кнопку Submit=OK нажимали

{

$FirstName=trim($_POST[FirstName]);

echo "Вышли из формы, нажав кнопку OK. Вывод значений введенных переменных <br>";

$LastName=trim($_POST[LastName]);//значение фамилии

if (empty($LastName))

{//проверка на пустое значение переменной $LastName

   echo'<font color=red><BIG> Введите Фамилию. Связь с сервером запрещена.</BIG>  Вернитесь на предыдущую страницу!';

 exit; //выйти из программы

}//конец if (empty($LastName))

$Comments=trim($_POST[Comments]);

print("Указали Имя : $FirstName <br>");

print(" Фамилия : $LastName <br>");

 if (empty($Comments))//комментарий не вводили

 print("Поле комментария не заполняли<br>");

 else

{

 print("В поле комментария было:<br> $Comments <br>");

}//конец if (empty($Comments))

print("Нажмите  <a href=\"Lab3_2.php?LastName=$LastName\">здесь</a>  и будет вызвана Lab3_2.php с параметром LastName,<br> значение = $LastName ");

}

?>

</fieldset> <!--Конец рамки-->

</body>

</html>

Рис. 3.19. Исходный код программы Lab3_2.php.

Нажатие на ссылке (рис. 3.18) должно привести к выводу следующего экрана (рис. 3.20).

Рис. 3.20. Пример вывода введенных значений.

Если пользователь не вводит значения фамилии и нажимает кнопку “OK”, то реакция программы Lab3_2.php показана на рис. 3.21.

Рис. 3.21. Пример сообщения из программы Lab3_2.php при отсутствии значения Фамилии в поле ввода.

 

Задание 3. Разработать приложение с использьзованием только HTML средств для ввода информации.

 Вид формы форма ввода показан  на  рис. 3.22. Исходный код представлен на рис. 3.23

Рис. 3.22. Пример форм,  реализованных программой Lab3_3.php

На рис. 3.22 показано несколько форм использующих два текстовых поля,  конструкцию checkbox и выпадающий список select.

Синтаксис определения текстового поля:

<input type="text" name="имя переменной" size="N" maxlenght="N" value="">

Определение текстового поля включает пять атрибутов:

type - тип элемента (для текстовых полей - text);

name - тип переменной, в которой сохраняются введённой данные;

size - общий размер текстового поля в браузере;

maxlength - максимальное количество символов, вводимых в текстовом поле;

value - значение, отображаемое в текстовом поле по умолчанию;

Чтобы создать в форме поле для ввода паролей, достаточно указать

type="password" вместо type="text".

Флажки (checkboxes) используются в ситуациях, когда пользователь выбирает один или несколько вариантов из готового набора - по аналогии с тем, как ставятся "галочки" в анкетах.

Синтаксис определения флажка:

<input type="cheskbox" name="имя_переменной" value="начальное_значение">

Определение флажка включает три атрибута:

type - тип элемента (для флажков - checkbox);

name - имя переменной, в которой сохраняются введённые данные (в данном случае - состояние элемента);

value - значение, присваиваемое переменной по умолчанию. Если флажок установлен, именно это значение будет присвоено переменной с указанным именем. Если флажок не установлен, значение атрибута value не используется.

Раскрывающийся список

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

Синтаксис определения раскрывающегося списка:

<select name="имя_переменной">

<option value="имя_переменной1">

<option value="имя_переменной2">

"option value="имя_переменной3">

.........................................................

<option value="имя_переменнойN">

</select>

Определение раскрывающегося списка включает два атрибута:

name - имя переменной, в которой сохраняются введённые данные (в данном случае - строка, выбранная в списке);

value - значение, отображаемое в списке по умолчанию.

Далее приводится текст HTML кода (программа Lab3_3.php), обеспечивающая вывод странички на экран.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab3_3</title>

</head>

<h1> Пример форм в HTML </h1>

<body>

<!--1-я форма-->

<form

<label for="name"> Ваше имя </label>

<input type="text" name="Name" value="Вася" maxlengf="20" size=30><br>

<input type="reset"  value="Очистить форму">

</form><br>

<!--2-я форма-->

<form

label for="name"> Введите пароль </label>

<input type="password"  maxlengf="10" size=30><br>

<input type="reset"  value="Сброс пароля">

</form><br>

<form

label for="name1"> Ваши интересы </label><br>

<input type="checkbox"  name="name1" value="Comp"> Компьютеры<br>

<input type="checkbox"  name="name1" value="Sport" > Спорт<br>

<input type="checkbox"  name="name1" value="Art" > Искусство<br>

 

</form><br>

<!--Раскрывающийся список 1-->

<select name="SP">

<option value="SP1" >Базы данных

<option value="SP2" >Операционные системы

<option value="SP3" >Организация ЭВМ

<option value="SP4" >Сети ЭВМ

</select><br><br>

<!--Раскрывающийся список 2-->

<select name="SPP">

<option value="SPP1" >1-й урок 9.00 - 9.45

<option value="SPP2" >2-й урок 10.00 - 10.45

<option value="SPP3" >3-й урок 11.00 - 11.45

<option value="SPP4" >4-й урок 12.00 - 12.45

<option value="SPP5" >5-й урок 13.00 - 13.45

</select><br><br>

</body>

</html>

Рис. 3.23. Программа Lab3_3.php, реализующая различные формы средствами HTML.

Кнопка для загрузки файлов (browse)

Служит для реализации загрузки файлов на сервер. Объект browse начитается с парных тегов <form></form>. Начинающий тэг <form> содержит необходимый атрибут encrypt. Атрибут encrypt принимает значение multipart/form-data, который извещает сервер о том, что вместе с обычной информацией посылается и файл. При создании текстового поля также необходимо указать тип файла – “file”.

Синтаксис описания browse (Кнопка обзор)

<form enctype="multipart/form-data" action="upload.php" method="post">

Загрузить файл: <input name="my_file" type="file">

 <input type="submit" value="Отправить">

</form>

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

Ниже приведен еще один  пример формы представленный в файле Lab3_4.php.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab3_4 Anketa</title>

 

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74"

vlink="#808040" alink="f808040">

<?

// Все кавычки внутри $form должны экранироваться,

// в противном случае произойдет ошибка.

$form = "

<form action=\"Lab3_4.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"y\">

<b>Введите информацию!</b><br>

Ваше имя :<br>  

<input type=\"text\" name=\"name\" size=\"20\" maxlength=\"20\" value=\"\"><br>

Ваш Email:<br>

<input type=\"text\" name=\"email\" size=\"20\" maxlength=\"40\" value=\"\"><br>

<input type=\"submit\" value=\"Отправить\">

</form>";

// Если форма ранее не отображалась, отобразить ее.

// Для проверки используется значение скрытой переменной $seenform.

if ($seenform != "у"):

//print " форма ранее не отображалась ";

print "$form";

else:

print "Ввели. $name!. Your email address is $email";

endif;

?>

</body>

</html>

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


Тема №4. Использование чисел. Управляющие структуры

Цель работы: работа с численными данными в форме.

Задание 1. Разработать приложение с формой для простого калькулятора (см. рис. 3.24).

Рис. 3.24. Форма с группой переключателей Действие и ввода переменных.

Исходный код программы приведен ниже (рис. 3.25).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab4 Калькулятор</title>

</head>

<h2> Форма калькулятора в HTML </h2>

<body>

<form action="Lab4_1.php" method="POST">

<!-- форма использует обработчик представленный в файле Lab4_1.php-->

<p> Значение 1:

<input type="text" name="Var1" size=10></p>

<p> Значение 2:

<input type="text" name="Var2" size=10></p>

<p> Действие:<br>

<input type="radio"  name="calc" value="Сложить"> Сложить<br>

<input type="radio"  name="calc" value="Вычесть"> Вычесть<br>

<input type="radio"  name="calc" value="Умножить"> Умножить<br>

<input type="radio"  name="calc" value="Разделить"> Разделить<br>

</p>

<p> <input type="submit" name="Submit" value="Вычислить"></p>

</form>

<!--При пересылке формы в ваш сценарий Lab4_1.php будут переданы переменные - $Var1 и $Var2 (используется массив POST), так как именно эти имена являются значениями параметра NAME, использованного при создании каждого текстового поля. Значениями этих переменных будут значения, введенные пользователем в соответствующие поля формы.

-->

</body>

</html>

Рис. 3.25. Исходный код программы Lab4.php.

Cозданная форма (рис. 3.24) содержит два поля ввода Значение 1 и Значение 2, переключатель Действие и кнопку Вычислить. Кроме того, с переменными $Var1 и $Var2, в обработчик Lab4_1.php, будет пересылаться еще одна переменная с именем $calc (переменная $calc также будет доступна через глобальный массив $_POST).

Если к данному моменту времени сценарий Lab4_1.php не создан, то нажатие на кнопке  "Вычислить" (рис. 3.24) приведет к следующему результату (рис. 3.26).

Рис. 3.26. Реакция браузера при отсутствии программы Lab4_1.php.

Создание сценария калькулятора

В соответствии с выбранным в форме Lab4.php именем обработчика, создадим PHP-сценарий с именем Lab4_1.php. Цель сценария - принять два значения переменных $Var1 и $Var2 и произвести с ними вычисления в зависимости от значения переменной $calc.

Созданный вами сценарий должен выглядеть как на pис. 3.27.

Сохраните созданный файл с именем Lab4_1.php в папке для документов вашего Web-сервера.

<?PHP

$Var1 = $_POST["Var1"];// использование массива $_POST для означивания переменных обязательно

$Var2 = $_POST["Var2"];

$calc = $_POST["calc"];

if ( ($Var1=="") || ($Var2=="") || ($calc==""))

{

header ("locahion:http://localhost/lab4.php");

//echo "header  ";

exit;

}

if ($calc=="Сложить")

{$rez=$Var1 + $Var2;}

else if ($calc=="Вычесть")

{$rez=$Var1 - $Var2;}

else if ($calc=="Умножить")

{$rez=$Var1 * $Var2;}

else if ($calc=="Разделить")

{$rez=$Var1 / $Var2;}

?>

<html>

<head>

<title>Lab4_1 Результаты вычислений</title>

</head>

<body>

<p>Результат вычислений равен <? echo $rez; ?> </p>

<p>Результат получен в обработчике Lab4_1.php </p>

</body>

</html>

Рис. 3.27. Исходный листинг программы Lab4_1.php.

Например, если в форму (рис. 3.26) ввести данные, как показано на рис. 3.28, то  результат будет следующий (рис. 3.29)

Рис. 3.28. Данные указанные в форме.

Рис. 3.29. Вывод результата работы сценария Lab4_1.php.

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

Примечание. Контроль ввода числовых данных частично рассмотрен в

Lab15_05.php (Lab15_055.php). Контроль ввода текстовых данных частично рассмотрен в Lab6_....php. В общем случае необходимо ознакомиться с описанием стандартной функции preg_match() (например см. php4.chm).


Тема №5. Использование управляющей структуры switch

Цель работы: Обучение применению структуры switch.

Задание 1. Разработать приложение с использованием конструкции SWITCH-CASE, в котором создается форма для простого калькулятора (см. рис. 3.30 и рис. 3.33).

Рис. 3.30. Вид формы для калькулятора.

Исходный код Lab5.0.php для вывода формы представленной на рис. 3.30, показан на рис. 3.31.

Рис. 3.31. Исходный код создания формы .

Рис. 3.32. Продолжение исходного кода создания формы .

Пояснения к коду программы создания формы (рис. 3.31 - 3.32).

При пересылке формы в сценарий Lab5_1.php будут переданы две переменные - $Var1 и $Var2, так как именно эти имена являются значениями параметра NAME, использованного при создании каждого текстового поля. Значениями этих переменных будут значения, введенные пользователем в соответствующие поля формы.

Кроме того, если пользователь отметит какое-то действие, с помощью радио кнопки, в сценарий (обработчик формы) будет передана переменная Scalc (с указанным значением).

В форме используется обработчик с именем Lab5_1.php

Исходный код (Lab5_1.php) обработки формы представлен на рис. 3.33.

Рис. 3.33. Исходный код Lab5_1.php обработки  ввода.

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab5_1 Результаты</title>

</head>

<body>

<p>Результат вычислений равен <? echo $rez; ?> </p>

<p>Результат получен в обработчике Lab5_1.php </p>

</body>

</html>

Рис. 3.34. Продолжение исходного кода Lab5_1.php обработки  ввода.

Если строка

в коде HTML не будет вставлена, то на экране будет выведена информация вида (рис. 3.38):

Рис. 3.35. Результат обработки  ввода при отсутствии указания русской кодировки.

Если в форму ввести значения указанные на рис. 3.39, то обработчик выдаст на экран информацию, показанную на рис. 3.40.

Рис. 3.36. Результат  ввода информации.

Если кнопка будет нажата

Рис. 3.37. Результат работы обработчика для рис. 3.36.

Если в форму (рис. 3.30) не вводить информацию и нажать кнопку , то получим результат:

Рис. 3.38. Результат работы обработчика при отсутсивии информации в форме и нажатии кнопки “Вычислить”.

Задание 2. Разработать сценарий обрабочика кнопки OK с использованием Switch, приложение использует форму ввода, показанную на рис. 3.39 и сопутствующий ей код на рис. 3.40.

Contact.html

Рис. 3.39. Форма ввода.

<html>

<head>

<title>Contact</title>

</head>

<body bgcolor=yellow>

<form action="ContactHow.php" method=POST>

<table> <tr><td> First Name</td>

<td><input type=text name="FirstName" size=20></td></tr>

<tr><td>Last Name</td>

<td><input type=text name="LastName" size=20></td></tr>

<tr><td> Comments</td>

<td><textarea name="Comments" rows=5 cols=40></textarea></td></tr></table>

Способ связи

<p><select name="ContactHow" size=1>

<option value="Telephone">Телефон</option>

<option value="Pochta">Почта</option>

<option value="Email">E-mail</option>

<option value="Fax">Fax</option>

</select>

<p><input type=submit name="Submit" value="OK">&nbsp;

<input type=reset name="Reset" value="Cancel">

</form>

</body>

</html>

Рис. 3.40. Исходный код HTML формы ввода.

Тема № 6. Использование регулярных выражений в сценариях РНР

Цель работы: Получение практических навыков в использовании регулярных выражений при обработке форм.

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

Проверка ошибок

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

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

Задание 1. Вывод информации о ошибочно заполненных полях формы 

Мы последовательно проверяем все поля формы и убеждаемся в том, что они не остались пустыми. Там, где это возможно, проверяется правильность структуры введенных данных. Если проверка прошла успешно, мы переходим к следующему полю; в противном случае программа выводит сообщение об ошибке, устанавливает флаг, который позднее используется для повторного отображения формы, и переходит к следующему полю. Процедура повторяется до тех пор, пока не будут проверены все поля формы (рис. 3.41, файл Lab6_0.php).

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title></title>

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74"

vlink="#808040" alink="#808040">

<? PHP

$name = $_POST['name']; //$name=$_REQUEST['name'];

$seenform=$_POST['seenform'];

$email=$_POST['email'];

// Создать форму

$form = "

<form action=\"Lab6_0.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"z\">

<b>Введите информацию</b><br>

Ваше имя:<br>

<input type=\"text\" name=\"name\" size=\"20\" maxlength=\"20\" value=\"$name\"><br>

Ваш Email:<br>

<input type=\"text\" name=\"email\" size=\"20\" maxlength=\"40\" value=\"$email\"><br>

<input type=\"submit\" value=\"Отправить\">

<br>Lab6_0.php. Обработка ошибок при вводе

<br>неправильного Email производится в этом же файле

</form>";

 

if ($seenform != "z"): // Заполнялась ли форма ранее?

 print "$form";  //echo " Первая прорисовка формы";

else:

// Пользователь заполнил форму. Проверить введенные данные.

//echo " form нарисована $name";

 $error_flag = "n"; //признак что ошибок нет

 if ($name == ""):

// Убедиться в том, что поле имени содержит информацию

 print "<font color=\"red\"> Вы забыли ввести Ваше имя </font><br>";  

 $error_flag = "y";//признак наличия ошибоки

 endif;

 

// Убедиться в том. что поле адреса содержит информацию

 if ($email == ""):

  $error_flag = "y";

  print "<font color=\"red\">Укажите правильный email address!   Он не должен быть пустым.</font><br>";  

 else:

//Преобразовать все алфавитные символы в адресе электронной почты

//к нижнему регистру 

 $email = strtolower(trim($email));

endif;

if(!empty($_POST['email']))

{

// Убедиться в правильности синтаксиса  адреса электронной почты

//Будем считать, что стандартный адрес электронной почты выглядит так:

//   admin@mail.ru

//Адрес состоит из двух частей это:

//  admin - имя пользователя.

//  mail.ru - домен, доменное имя.

//Их разделяет знак @(собака).

//Имя пользователя - может состоять из букв разного регистра,

//цифр, знаков подчёркивания, точек, минусов.

//Доменное имя - так же может состоять из букв разного

//регистра, цифр, знаков подчёркивания, точек, минусов.

 

 if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email'])):

   echo $_POST['email']. " Email - Правильный.";

$error_flag = "n";   

 else:

   $error_flag = "y";

   echo $_POST['email']. " Email - НЕправильный.";

    print "<font color=\"red\"> Пример правильного возможного email:    admin@mail.ru</font><br>";    

 endif;

}

else 

 { echo "Вы не ввели email."; }

 if ($error_flag == "y"):

// Если флаг ошибки $error_flag установлен, то заново отобразить форму.   

 print "$form";

 else: // Обработать данные пользователя

 print "<br>Данные введены правильно";

 endif;

endif;  

?>

</body>

</html>

Рис. 3.41. Проверка данных формы и вывод сообщений об ошибках. Lab6_0.php.

На экране форма будет представлена в виде (рис. 3.42).

Рис. 3.42. Форма ввода для листинга приведенного на рис. 3.41.

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

Отметим, что в функцию preg_match передаются два параметра – шаблон, которому должен соответствовать email адрес  и  собственно сам адрес, введенный пользователем $_POST['email']

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email']))

Шаблон , с которым функция preg_match будет сравнивать email адрес, может выглядеть так:

1. "[0-9a-z_]+@[0-9a-z_^\.]+" - это часть паттерна (шаблона), проверяющая имя пользователя, собаку и домен второго уровня до точки.

2. "\.[a-z]{2,6}" - эта часть проверяет домен первого уровня (ru,com,ua и т.д.).

Объединим всё и получим такой шаблон:

   "|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}|i"

   

В конце шаблона присутствует модификатор i он сообщает интерпретатору, что поиск проводится без учёта регистра, т.е. могут присутствовать и заглавные буквы и прописные.

Как известно, у адреса две составляющие - имя пользователя и имя домена, которые разделены знаком @. Для проверки разделителя между именем пользователя и именем домена в шаблоне (регулярном выражении)  указано +@.

На рис. 3.43 приведен пример вывода сообщения об ошибочных действиях пользователя при заполнении формы  на рис. 3.42.

Рис. 3.43. Заполненная форма ввода для листинга приведенного на рис. 3.41.

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

Также не забывайте, что электронный ящик может находиться на поддомене xxx@xxx.xxx.com, или даже на домене четвертого, пятого уровня (как вариант, реально эта ситуация крайне редка, но отбрасывать эти адреса не стоит). Поэтому в регулярном выражении не забывайте использовать точку (экранированную "\.") для указания того, что часть адреса после "@" может содержать точку как разделитель доменных имен.

Для проверки доменного имени первого уровня учитываем, что его длина уже составляет не только 2 символа (.ru) или 3 символа (.com), но и 4 символа - .info, и даже 6 символов. Поэтому в шаблоне присутствует выражение:

"\.[a-z]{2,6}$/i"

Проверка осуществляется по этому шаблону с применением функции preg_match():

- Функция bool preg_match( string $expr, string $str [,list &$pockets] ) сопоставляет выражение $expr в строке $str.

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

Ниже на рис. 3.44 показана форма ввода содержащая поле для ввода Email и в программе рис. 3.45 показано каким образом контролируется ввод информации в указанное поле.

Рис. 3.44. Форма ввода для листинга приведенного на рис. 3.45.

Листинг программы Lab6_0_1.php, содержащий функцию пользователя  для проверки корректности адреса электронной почты.

Рис. 3.45. Листинг программы Lab6_0_1.php для формы на рис. 3.44.

Рис. 3.46. Продолжение листинга программы Lab6_0_1.php для формы на рис. 3.44.

В функции пользователя Val_email использованы стандартные функции:

- Функция int strlen( string $st ) определяет длину строки;

- Функция string trim( string $st [, string $charlist] ) удаляет ведущий и концевые символы строки.

Если пользователь (в форму на рис. 3.44) введет информацию как показано на рис. 3.47, и нажмет кнопку , то реакция пользовательской функции Val_email показана на рис. 3.48.

Рис. 3.47. Форма с введенной информацией.

Обратите внимание, что после нажатия кнопки нижнее сообщение на рис. 3.47 исчезнет.

Рис. 3.48.Сообщение об ошибке сгенерированное пользовательской функцией.

Если пользователь исправит ошибку (рис. 3.49 ) и вновь нажмет , то ответ из программы Lab6_0_1.php показан на рис. 3.50.

Рис. 3.49. Исправление в поле Email введенное пользователем.

Рис. 3.50. Сообщение о правильности ввода контролируемое функцией val_email().

Ответьте на вопрос. Существует ли в реальности такой адрес Email, приведенный на рис, 3.49. ?


Задание 3. Проверка ограничений в текстовом поле. Lab6_0_2.php

Очень часто встречается ситуация, когда надо написать регистрацию на ресурсе, который вы поддерживаете. В силу каких-либо причин выдвигаются требования к введенной информации. Например, как проверить, что пользователь ввел в качестве ника (nickname, login) слово, состоящее только из букв латинского алфавита и цифр.

Проверка условия приведена внутри кода (рис. 3.51), чтобы было понятно, что и куда писать:

<?php

$user = $_POST['username'];

if(!preg_match("/^[a-zA-Z0-9]+$/", $user)) {

echo "Имя пользователя задано в неправильном формате";

} else {

echo "Имя пользователя задано в правильном формате";

}

?>

Рис. 3.51. Проверка специфичного имени пользователя.

Разбирем само регулярное выражение.

Так как регистрационное имя пользователя должно состоять из латинских букв, а также цифр, то надо написать символьный класс, который будет удовлетворять этому условию: [a-zA-Z0-9].

В этот символьный класс входит три интервала, первый интервал a-z (все символы от маленькой буквы a до маленькой буквы z), второй интервал A-Z (аналогично, но с большими буквами), третий интервал 0-9 (цифры от 0 до 9). Мы описали только одну букву, из которой может состоять регистрационное имя, но таких букв может быть... а теперь как раз надо ответить на вопрос, сколько таких букв может быть?

Если Ваш ответ будет: “Да сколько угодно”, то вы неправы.

Регистрационное имя должно состоять минимум из одной буквы! и  это обязательное условие при прохождении регистрации, поэтому надо данный факт описать. Вспоминаем про квантификаторы: [a-zA-Z0-9]+

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

Далее надо сказать регулярному выражению, что условию должна соответствовать вся строка, от начала до конца, поэтому добавляем в регулярное выражение символ начала строки '^' в начале регулярного выражения и символ конца строки '$' в конец: ^[a-zA-Z0-9]+$

Теперь надо объяснить функции preg_match, что строка ^[a-zA-Z0-9]+$ является регулярным выражением, надо поставить ограничители, для этого и ставлится слеш '/':

preg_match("/^[a-zA-Z0-9]+$/",$user)

Полный листинг сценария в котором использовано ограничение для вводимого имени приведено на рис. 3.52 (файл Lab6_0_2.php).

Рис. 3.52. Листинг программы  Lab6_0_2.php (проверка имени пользователя).

Рис. 3.53. Конец листинга программы  Lab6_0_2.php.

Ниже на рис. 3.54 приведена форма ввода для листинга программы из рис. 3.52 - 3.53.

Рис. 3.54. Заполненная форма. Программа  Lab6_0_2.php.

Если будет нажата кнопка , то результат показан на рис. 3.55.

Рис. 3.55. Результат работы программы  Lab6_0_2.php.

Если пользователь введет информацию, как показано на рис. 3.56, то результат приведен на рис. 3.57.

Рис. 3.56. Заполненная форма. Программа  Lab6_0_2.php.

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

Рис. 3.57. Результат работы программы  Lab6_0_2.php.


Задание 4. Специфика имени пользователя. Lab6_0_3.php

В 80% случаев вышеприведенная задача усложняется на практике, надо либо расширить набор символов, что делается простым добавлением символов в символьный класс, либо ужесточаются условия. Например, ставится условие, что имя пользователя может состоять как из букв латинского алфавита, так и из цифр, но первый символ имени пользователя должен быть обязательно буквой латинского алфавита!

Дописываем регулярное выражение: ^[a-zA-Z][a-zA-Z0-9]*$

Как известно, символьный класс описывает только один символ. Наша задача как раз в том и состоит, чтобы описать один символ (первый): [a-zA-Z] тут два интервала, описывают первый символ и дают понять, что никаких цифр в первом символе проверяемой строки быть не может.

В предыдущем примере явно следовало, что регистрационное имя пользователя должно быть длинной минимум в один символ. Мы уже описали первый символ строки, но он может быть и единственным, после него может быть сколько угодно символов, либо может их вообще не быть, но регулярное выражение совпадет только тогда, когда все последующие символы будут удовлетворять условию, что они являются либо буквами латинского алфавита, либо цифрами. [a-zA-Z0-9]. Первый обязательный символ описан, остальные символы не обязательны, поэтому меняем квантификатор с '+' на '*', Ставим символы начала и конца строки: ^[a-zA-Z][a-zA-Z0-9]*$

Если  в листинге программы 42-ю строку (рис. 3.53)

заменить на (файл Lab6_0_3.php):

то на ввод информации (рис. 3.58) получим следующую реакцию (рис. 3.59).

Рис. 3.58. Заполненная форма. Программа  Lab6_0_3.php.

Рис. 3.59. Результат работы программы  Lab6_0_3.php.

Задание 5. Специфика имени пользователя с помощью JavaScript. Lab6_0_4.php

Пример использования JavaScript (файл Lab6_0_4.php).

Ниже (рис. 3.60) представлен HTML код самой формы:

<form onsubmit="return checkmail(this.email.value)" action="#" method="post">

<input id="email" name="email" />

<input type="submit" value="Отправить" />

</form>

Рис. 3.60. Код для формы  Lab6_0_4.php.

И код функции на JavaScript, которая и проверяет email.

<script language="javascript" type="text/javascript">

function checkmail(value) {

reg = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;

if (!value.match(reg)) {alert("Пожалуйста, введите свой настоящий e-mail");

document.getElementById('email').value=""; return false; }

}

</script>

Рис. 3.61. Код функции на JavaScript для проверки email (Lab6_0_4.php).

В принципе, если не хотите вникать в суть дела, можете просто скопирвать код, всё будет работать). Напоминаем, что в Интернете существует огромное количество открытых кодов для проверки Email адресов и их надо использовать , а не придумывать свои коды.

Рис. 3.62. Пример Lab6_0_4.php при неправильном указании Email адреса в  форме ввода.

Проверка на корректность адреса электронной почты

<?php

function check_email($email) {

   if (preg_match("%^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z])+$%", $email)) {

       return true;

   }

   return false;

}

?>


Задание 6. Проверка правильности ввода URL. Lab6_1.php.

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

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

http://хост/путь

Простейшим вариантом проверки, не позволяющим посетителю ошибаться при наборе URL, но в то же время не предотвращающий неверный формат, является:

"#http://[^]*\.html?#i"

Данное выражение учитывает только URL расширения файла html либо htm, для обобщения на другие файлы следует расширить регулярное выражение до:

"#http://[^]*\.(html?|php|pl|cgi)#i"

Уточняя регулярное выражение, разместим за префиксом http:// регулярное выражение для хоста — [-a-z0-9_.]+. Структура пути может быть более разнообразной. Для него необходимо использовать выражение вида:

[-a-z0-9_:@&?=+,.!/~*'%$]*

Объединяя все в одно регулярное выражение, получаем следующее:

"#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi)#i"

На рис. 3.63 приведена форма с полем URL адреса.

Рис. 3.63. Пример Lab6_1.php при неправильном указании URL  адреса в  форме ввода.

Как видно из рис. 3.63, при таком вводе обработчик зафиксирует ошибку, которая может быть представлена рис. 3.64.

Рис. 3.64. Реакция Lab6_1.php при неправильном указании URL  адреса в  форме ввода на рис. 3.63.

Исходный листинг Lab6_1.php приведен ниже на рис. 3.65.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab6_1 Регулярные выражения</title>

</head>

<h2> Регулярные выражения для URL </h2>

<h3 align="left"><font color=RED>(файл Lab6_1.php)<font color=BLUE> </h3>

<body

TEXT=BLUE

LINK=RED

VLINK=BLUE ALINK=PINK>

<?PHP

if (!isset($_POST[Submit]))

{

//echo "Кнопку Submit=OK еще не нажимали <br>";

print("<form action=\"Lab6_1.php\" method=POST>");

print("<table> <tr><td> Ваше Имя </td>");

print("<td><input type=text name=\"FirstName\" size=20></td></tr>");

print("<tr><td>Ваша Фамилия</td>");

print("<td><input type=text name=\"LastName\" size=20></td></tr>");

print("<tr><td>URL</td>");

print("<td><input type=text name=\"Url\" size=40></td></tr></table>");

print("<input type=submit name=\"Submit\" value=\"OK\">&nbsp;");

print("<input type=reset name=\"Reset\" value=\"Cancel\">");

print("</form>");

}

else

{

$Url_adress=$_POST['Url'];

//echo "Указан адрес $Url_adress ";

 if (strlen($Url_adress)<8)

 {echo "Указанный адрес $Url_adress менее 8-и символов";//

 exit;//завершение выполнения PHP сценария

 }

//Единственным обязательным признаком в URL:

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

//Больше ничего обязательного для URL нет.

//Например, google.com или supersait.ru

 if(preg_match('#^[-a-z0-9]+(\.[-a-z0-9]+)*(\.[a-z]+)(|\/|\/([a-z0-9-_\(\)!\&\#\.\/\~]+(\.[a-z0-9\_\-]+)?(\?([a-zа-я0-9-_\%]*|([a-z0-9_-]+=[a-zа-я0-9-_\%\&]*)+))?(\#[a-z0-9]*)?)?)$#i', $Url_adress))

{

// URL верен. Например, ORD.com.ru

//Внимание! Это выражение не проверяет на наличие "http://"

}

else 

{

// URL НЕ верен

echo "Возможный Url Ord.com.ru или www.ord.com.ru <br>";

exit("Указанный адрес $Url_adress <font color=\"red\">НЕ верен</font><br>");

}

 

if(!preg_match("#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi|ru)#i", $Url_adress))

{

echo "Указанный адрес $Url_adress  допустим <br>";

$Pattern="^(http://)?([^[:space:]]+)([[:alnum:]\.,?%#\-\:;&])$";

if (ereg($Pattern,$Url_adress)):

//ereg - совпадение с регулярным выражением.

//Ищет в строке Url_adress совпадения с регулярным

//выражением, данным в шаблоне pattern.

//

$Replace="<a href=\"http://\\2\\3\" target=\"_self\">\\2\\3</a>";

$Url_adress=eregi_replace($Pattern, $Replace, $Url_adress);

//Функция eregi_replace ищет регулярное выражение Pattern

//в строке Url_adress и заменяет его строкой Replace.

//функция не чувстительна к регистру

print("Ваша подача документа по URL адресу - $Url_adress - может быть осуществлена!");

//Например. Ваша подача документа по URL адресу -

// www.ord.com.ru - может быть осуществлена!

else:

print("URL не точен");

endif;

}

//exit("Неверный формат URL");

}

?>

</body>

</html>

Рис. 3.65. Листинг Lab6_1.php с проверкой URL.

Если пользователь введет правильную информацию рис. 3.66, то вывод в браузере показан на рис. 3.67.

Рис. 3.66. Форма Lab6_1.php с проверкой URL.

Рис. 3.67. Форма Lab6_1.php с проверкой URL.


Задание 7. Проверка правильности ввода из списка. Lab6_2.php.

Пусть необходимо разработать форму (рис. 3.68)

Рис. 3.68. Форма Lab6_2.php.

Для указания способа связи использован следующий список (рис. 3.69)

Рис. 3.69. Форма Lab6_2.php списком значений.

Форма выводится с помощью листинга представленного на рис. 3.70 (файл Lab6_2.php), а обработка события  производится в файле Lab6_3.php (листинг программы показан на рис. 3.71).

Файле Lab6_3.php в свою очередь содержит внутренний обработчик событий представленный в файле Lab6_4.php (рис. 3.72).

Листинг программы Lab6_2.php представлен ниже.

Рис. 3.70. Листинг Lab6_2.php с списком значений.

Как указано в строке

обработчик нажатия кнопки “OK”, находится в отдельном файле с именем Lab6_3.php.

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

Естественно пользователь может указать один из видов связей, что должно быть учтено в обработчике Lab6_3.php (рис. 3.71).


Рис. 3.71. Листинг обработчика Lab6_3.php.

Обратите внимание, что в листинге программы Lab6_3.php (рис. 3.71) Html код должен помещаться после PHP кода, иначе функция

будет выдавать предупреждение о присутствии информации перед PHP кодом.

Кроме того текст программы Lab6_3.php, в свою очередь содержит обработчик Lab6_4.php (листинг представлен на рис. 3.72) для возможности обработки ошибок при вводе значений в поле связи (рис. 3.73).

Рис. 3.72. Листинг обработчика Lab6_4.php.

Пусть пользователь ввел информацию в форму, показанную на рис. 3.69.

Тогда в обработчике Lab6_3.php (через глобальный массив $_POST) будут доступны переменные:

Так как значения переменных $FirstName и $LastName непусты и равны соответственно $FirstName =’Иван’, $LastName= ‘Иванов’, то будет построена форма (рис. 3.73) с помощью операторов ниже приведенных операторов (полный текст см. рис. 3.71):

и тело формы закрывается операторами

На основании указанных операторов на экран будет выведено:

Рис. 3.73. Содержание формы сгенерированное обработчиком Lab6_3.php.

Если пользователь введет в форму (рис. 3.73) информацию, показанную на рис. 3.74 и нажмет кнопку , то обработчик Lab6_4.php, указанный в теле Lab6_3.php

получит информацию через $_POST, которая показана на рис. 3.75.

Рис. 3.74. Содержание формы (рис. 3.73) после указания Email.

Рис. 3.75. Результат работы обработчика (рис. 3.72) по нажатию рис. 3.74.

Рассмотрим ситуацию когда форма, показанная на рис. 3.69 остается не заполненной и сразу нажимается кнопка (рис. 3.76).

Рис. 3.76. Содержание формы без ввода информации.

В этом случае на экране получим сообщение (рис. 3.77) на основе выполнения условия   .

Рис. 3.77. Содержание формы без ввода информации.

Если пользователь вернется на предыдущую страницу и укажет (рис. 3.78)

Рис. 3.78. Содержание формы c информацией.

Нажатие для содержимого рис. 3.78 приведет к результату (рис. 3.79).

Рис. 3.79. Содержание формы (файл Lab6_3.php) c информацией.


Тема №7. Работа с массивами

Цель работы: Обучение использованию массивов в сценариях PHP.

Массив представляет собой набор переменных, объединенных одним именем. Каждое значение массива идентифицируется индексом, который указывается после имени переменной-массива в квадратных скобках. Комбинацию индекса и соответствующего ему значения называют элементом массива.

1<?

2   $i = 1024;

3   $a[1] = 'abc';

4   $a[2] = 100;

5   $a['test'] = $i - $a[2];

6

7   echo $a[1] . "<br>\n";

8   echo $a[2] . "<br>\n";

9   echo $a['test'] . "<br>\n";

10 ?>

В приведенном примере, в строке три объявляется элемент массива $a с индексом 1; элементу массива присваивается строковое значение 'abc'. Этой же строкой объявляется и массив $a, так как это первое упоминание переменной $a в контексте массива, массив создается автоматически. В строке 4 элементу массива с индексом 2 присваивается числовое значение 100.

В строке же 5 значение, равное разности $i и $a[2], присваивется элементу массива $a со строковым индексом 'test'.

Как видите, индекс массива может быть как числом, так и строкой.

В предыдущем примере массив создавался автоматически при описании первого элемента массива. Но массив можно задать и явно:

1 <?

2   $i = 1024;

3   $a = array( 1=>'abc', 2=>100, 'test'=>$i-100 );

4   print_r($a);

5 ?>

Созданный в последнем примере массив $a полностью аналогичен массиву из предыдущего примера. Каждый элемент массива здесь задается в виде индекс=>значение. При создании элемента 'test' пришлось указать значение 100 непосредственно, так как на этот раз мы создаем массив "одним махом", и значения его элементов на этапе создания неизвестны PHP.

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

Строки в выводе функции print_r разделяются обычным переводом строки \n, но не тэгом <br>. Для удобства чтения, строку print_r(..) можно окружить операторами вывода тэгов <pre>...</pre>:

echo '<pre>';

print_r($a);

echo '</pre>';

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

1 <?

2   $operating_systems = array( 'Windows', 'Linux', 'FreeBSD', 'OS/2');

3   $operating_systems[] = 'MS-DOS';

4

5   echo "<pre>";

6   print_r($operating_systems);

7   echo "</pre>";

8 ?>

Ниже приведенное задание 1 показывает особенность использования функции print_r и тега  <pre>…</pre> (рис. 3.83 -3.84).

Примечание. Далее в данной теме заголовок типа (рис. 3.80) приводить не будем.

Рис. 3.80. Заголовок в HTML коде.


Задание 1. Означивание массива и вывод на экран. Lab7_0.php.

 В представленной ниже программе (рис. 3.81) приведены несколько вариантов объявления массива в коде с последующим выводом содержимого массива на экран.

Код Lab7_0.php.

Рис. 3.81. Код Lab7_0.php.

Результат вывода элементов массивов с помощью кода Lab7_0.php.

Рис. 3.82. Вариант 1. Результат работы кода Lab7_0.php.

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

Рис. 3.83. Вариант 2. Результат работы кода Lab7_0.php.

Рис. 3.84. Вариант 3. Результат работы кода Lab7_0.php.

Записи массив можно перебирать с помощью цикла for. Количество элементов массива возвращает оператор count.

Например, если в тело программы Lab7_0.php добавить строки (рис. 3.85)

Рис. 3.85. Модифицированный код Lab7_0.php.

Тогда результат будет

Рис. 3.86. Вариант 4. Результат работы кода Lab7_0.php.

Задание 2. Цикл foreach. Lab7_1.php.

Для перебора элементов массива предусмотрен специальный цикл foreach:

На рис. 3.87 показано использование цикла foreach, а на рис. 3.88 результат.

Рис. 3.87. Использование Foreach для вывода массива. Lab7_1.php

Рис. 3.88. Использование Foreach для вывода массива.

Этот цикл работает (рис. 3.87) следующим образом: в порядке появления в коде программы элементов массива $languages, переменным $key и $value присваюваются соответственно индекс и значение очередного элемента, и выполняется тело цикла.

Если индексы нас не интересуют, цикл можно записать следующим образом: foreach ($languages as $value).

Т. е. в программе рис. 3.87 произвести следующую замену:

Тогда вывод на экране будет как показано на рис. 3.89.

Рис. 3.89. Использование Foreach для вывода массива.

Задание 3. Конструкции list и each. Lab7_2.php.

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

Допустим, у нас есть массив $lang = array('php', 'perl', 'basic'). Тогда конструкция list($a, $b) = $lang присвоит переменной $a значение 'php', а $b - 'perl'. Соответственно, list($a, $b, $c) = $lang дополнительно присвоит $c = 'basic'.

Если бы в массиве $lang был только один элемент, PHP бы выдал замечание об отсутствии второго элемента массива.

А если нас интересуют не только значения, но и индексы? Воспользуемся конструкцией each, которая возвращает пары индекс-значение.

Рис. 3.90. Использование Foreach для вывода массива. Lab7_2.php.

На первый взгляд может удивить тот факт, что в строках 19-21 переменным присваиваются разные значения, хотя выражения справа от знака присваивания совершенно одинаковые. Дело в том, что у каждого массива есть скрытый указатель текущего элемента. Изначально он указывает на первый элемент. Конструкция each же продвигает указатель на один элемент вперед.

Результат работы кода представленного на рис. 3.90 показан ниже.

Рис. 3.91. Использование Foreach для вывода массива. Lab7_2.php.

Эта особенность each позволяет перебирать массив с помощью обычных циклов while и for. Конечно, ранее рассмотренный цикл foreach удобнее, и стоит предпочесть его, но конструкция с использованием each довольно распространена, и вы можете ее встретить во множестве скриптов в сети.

Ниже (рис. 3.92) показан модифицированный код Lab7_2.php, использующий цикл

Рис. 3.93. Использование While для вывода массива. Lab7_2.php.

Результат модифицированной программы приведенной на рис. 3.93, соответствует рис. 3.91.

После завершения цикла, указатель текущего элемента указывает на конец массива. Если цикл необходимо выполнить несколько раз, указатель надо принудительно сбросить с помощью оператора reset: reset($brows). Этот оператор устанавливает указатель текущего элемента в начало массива.

Задание 4. Сортировка массива. Lab7_3.php.

Реализовать ввод названий месяцев и отсортировать их в алфавитном порядке.

Исходный код Lab7_3.php показан на рис. 3.93.

Рис. 3.93. Ввод и сортировка массива . Lab7_3.php.

В результате работы кода представленного на рис. 3.93 получим (рис. 3.94).

Рис. 3.94. Форма для ввода элементов массива . Lab7_3.php.

Если пользователь заполнит, например, форму (рис. 3.94) информацией вида (рис. 3.95).

Рис. 3.95. Форма с информацией . Lab7_3.php.

Тогда нажатие кнопки приведет к следующему результату (рис. 3.96).

Рис. 3.96. Форма с информацией . Lab7_3.php.


Тема №8. Функции в сценариях РНР

Цель работы: Получение навыков по применению функций в PHP при обработке сценариев.

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

Данная тема посвящена функциям PHP, их определению и применению на практике. Хотя основное внимание в ней уделяется определению и вызову пользовательских функций, необходимо помнить и о том, что в PHP существуют сотни стандартных функций. Стандартные функции работают точно так же, как пользовательские, и обеспечивают заметную экономию времени при создании новых приложений. Обновленный список стандартных функций PHP можно найти по адресу http://www.php.net.

Что такое функция?

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

 

Определение и вызов функций

Определить новую функцию в PHP несложно. Функции могут создаваться в любой точке программ PHP, однако по соображениям структурной организации кода удобнее разместить все функции, используемые сценарием, в самом начале сценарного файла или конца файла.

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

Определение функции обычно состоит из трех частей:

имени функции;

круглых скобок, в которых перечисляются необязательные входные параметры, разделенные запятыми;

тела функции, заключенного в фигурные скобки.

Обобщенный синтаксис функций PHP выглядит так:

 

function имя_функции ([$параметр1, ..., $параметрn])  

{

тело функции

}

Рис. 3.97. Синтаксис функций.

Имя функции должно подчиняться условиям, приведенным для идентификаторов. После имени функции следуют обязательные круглые скобки, в которые заключается необязательный список входных параметров ($параметр1, $параметр2, ...., $параметрn). Вследствие относительно либеральных принципов определения переменных в PHP указывать тип входных параметров не нужно. Хотя такой подход имеет свои преимущества, следует помнить, что механизм PHP не проверяет аргументы на соответствие тем типам, которые должны обрабатываться функцией. Случайные ошибки в использовании входных параметров могут привести к неожиданным последствиям (чтобы убедиться в том, что параметр относится к нужному типу, можно проверить его стандартной функцией gettype( )). После закрывающей круглой скобки следуют фигурные скобки, в которые заключается программный код, ассоциируемый с именем функции.

Рассмотрим простой пример использования функции. Предположим, вы хотите создать функцию для вывода лицензионной информации на web-странице:

function display_copyright()  

{

print "Copyright &copy; 2009 PHP-Powered Recipes. All Rights Reserved.";

}

Рис. 3.98. Простейшая функция.

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

Рассмотрим разновидность функции display_copyright(), которой при вызове передается параметр. Предположим, вы отвечаете за администрирование нескольких web-сайтов, каждому из которых присвоено отдельное имя. На каждом сайте имеется собственный административный сценарий с несколькими переменными, относящимися к этому сайту; к их числу принадлежит переменная $site_name с именем сайта.

В этом случае функцию display_copyright() можно записать следующим образом:

 

function display_copyright($site_name)  

{

print "Copyright &copy; 2009 $site_name. All Rights Reserved.";

}

Рис. 3.99. Простейшая функция с параметром.

Переменная $site_name, значение которой присваивается за пределами display_copy-right(), передается функции в качестве параметра. Переданное значение можно использовать и модифицировать в любом месте функции, однако любые изменения будут действовать лишь внутри этой функции. Впрочем, специальные ключевые слова позволяют сделать так, чтобы изменения параметров распространялись и за пределы display_copyright(). Эти ключевые слова были представлены в лекции, в общем обзоре области видимости переменных и ее отношения к функциям.

Задание 1. Вложенные функции. Lab8_0_0.php

Функции можно вызывать внутри других функций -- по аналогии с тем, как одна управляющая конструкция (if, while, for и т. д.) может находиться внутри другой. Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы.

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

 

function display_copyright($site_name)

{

print "Copyright &copy ". date("Y"). "$site_name. All Rights Reserved.";

}

Рис. 3.100. Простейшая функция с параметром и без констант.

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

Ниже на рис. 3.101 приведен пример описания и вызова фунцкии в файле Lab8_0_0.php. На рис. 3.102 показан результат вывода на экран работы функции display_copyright.

Рис. 3.101. Простейшая функция с параметром и без констант.

Рис. 3.102. Результат работы функции display_copyright.

Примечание. Далее, для удобства, на рисунках будет приводиться только PHP код (информация между тегами и ).

Задание 2. Объявление функций внутри других функций. Lab8_0.php

Также допускается объявление функций внутри других функций. Тем не менее, вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена. Более того, вложенная функция не наследует параметров родительской функции; параметры должны передаваться ей точно так же, как и любой другой функции.

Пример вложенного объявления приведен в листинге рис. 3.103.

Рис. 3.103. Использование вложенных функций.

 

Сценарий выводит следующий результат:

Рис. 3.104. Результат Lab8_0.php.

Обратите внимание: функцию display_copyright( ) можно вызвать и за пределами display_footer( ). Концепция защищенных функций в PHP не поддерживается. Так, например, если строку с номером 31 на рис 3.103 раскоментарить, то получим следующий результат (рис. 3.105).

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

Рис. 3.105. Результат Lab8_0.php после модификации.

Задание 3. Возврат значений функцией. Lab8_1.php 

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

Рис. 3.106. Листинг Lab8_1.php.

Краткое описание алгоритма.

Перед вызовом функции задаются значения переменных: $price (цена товара) и $tax (налоговая ставка).

Объявляется функция calculate_cost( ). При вызове функция получает два параметра: налоговую ставку и цену товара. Она вычисляет цену с учетом налога и возвращает ее командой return.

В теле программы вызывается calculate_cost() и значение возвращенное функцией, присваивается переменной $total_cost.

Далее выводятся соответствующие сообщения (рис. 3.107).

Рис. 3.107. Результат Lab8_1.php.

Функции, не возвращающие значений, также называются процедурами.

Задание 4. Возврат нескольких значений функцией. Lab8_2.php

Существует и другой способ использования возвращаемых значений, при котором вызов функции включается прямо в условную/циклическую команду. В следующей программе (листинг 3.108) сумма счета пользователя сравнивается с предельным размером кредита.

Алгоритм выглядит так:

Объявить функцию check_limit( ), которая при вызове получает два параметра. Первый параметр, $total_cost, определяет общую сумму счета, накопленную пользователем до настоящего момента. Второй параметр, $credit_limit, определяет максимальную сумму, которую может потратить пользователь. Объявление и состав функции на рис. 3.108 представлено строками 13-22.

Если накопленная сумма счета превышает предельный размер кредита, функция возвращает ложное значение (0).

 

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

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

Если при вызове check_limit( ) было получено значение TRUE, мы предлагаем пользователю продолжить закупку. В противном случае пользователь информируется о превышении кредита.

Листинг программы сравнения текущей суммы счета пользователя с предельным размером кредита  приведен на рис. 3.108, а результат (при указанных исходных данных) на рис. 3.109.

Рис. 3.108. Результат Lab8_2.php.

При выполнении листинга 3.108 будет выведено сообщение об ошибке, поскольку значение $cost превышает $limit.

Рис. 3.109. Результат Lab8_2.php.

Задание 5. Возвращение функцией нескольких величин. Lab8_3.php

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

Краткий алгоритм:

Объявить функцию best_years( ), вызываемую с одним параметром. Параметр $label определяет сорт вина, для которого пользователь хотел бы узнать три рекомендуемых года.

Объявить два массива, $Tokay  и $zinandali. В каждом массиве хранится три рекомендуемых года для соответствующего сорта вина.

Написать команду return, которая бы использовала особые возможности переменных. Выражение $$label сначала интерпретирует переменную $label, а затем интерпретирует полученное значение как имя другой переменной. В настоящем примере массив Tokay возвращается в виде списка, и каждый возвращаемый год занимает свою позицию в списке, для которого вызывалась функция.

Вывести сообщение с информацией о рекомендуемых годах.

Листинг 3.110. Возвращение функцией нескольких величин

Рис. 3.110. Исходный код PHP в Lab8_3.php.

Программа выводит следующий результат:

Рис. 3.111. Результат Lab8_3.php.

Задание 6. Рекурсивные функции . Lab8_4.php

Ситуация, при которой функция многократно вызывает сама себя, пока не будет выполнено некоторое условие, открывает замечательные возможности. При правильном использовании рекурсивные функции уменьшают объем программы и делают ее более выразительной. Рекурсивные функции особенно часто используются при выполнении повторяющихся действий -- например, при поиске в файлах/массивах и построении графических изображений (например, фракталов). Классическим примером рекурсивных функций, встречающимся во многих курсах программирования, является суммирование чисел от 1 до N. Программа, приведенная в листинге 3.112, суммирует все целые числа от 1 до 10.

Листинг 3.115. Использование рекурсивной функции для суммирования последовательных целых чисел

Рис. 3.112. Исходный код PHP в Lab8_4.php.

В результате выполнения листинга 3.112 будет выведен следующий результат:

Рис. 3.113. Результат Lab8_4.php.

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

Задание 7. Функции-переменные. Lab8_5.php

Одной из интересных возможностей PHP являются функции-переменные (variable functions), то есть динамические вызовы функций, имена которых определяются во время выполнения программы. Они значительно сокращают объем и сложность программного кода, а также часто снимают необходимость в условных командах if.

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

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

Алгоритм:

Создать сообщение для русского языка в функции с именем rushian.

Создать сообщение для английского языка в функции с именем english.

Передать информацию о выбранном языке в сценарий, присвоив значение переменной $language.

Переменная $language используется для выполнения функции-переменной (в приведенном примере -- russian ()).

Листинг 3.117. Выбор функции в зависимости от пользовательского ввода

Рис. 3.114. Листинг Lab8_5.php.

Листинг 3.114 демонстрирует интересную концепцию функций-переменных и наглядно показывает, что функции-переменные способствуют уменьшению объема программного кода. Если бы не эта возможность, функцию пришлось бы выбирать командой if или switch; это привело бы к заметному увеличению объема программного кода и риску появления дополнительных ошибок при кодировании.

Рис. 3.115. Результат Lab8_5.php.

Задание 8. Построение библиотек функций. Lab8_6_0.php

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

include(имя файла с расширением );

include_once(имя файла с расширением );

require(имя файла с расширением );

require_once(имя файла с расширением ).

Функция include( ) включает содержимое файла в сценарий. Функция include_once( ) делает то же, что и include( ), за одним исключением: прежде чем включать файл в программу, она проверяет, не был ли он включен ранее. Если файл уже был включен, вызов include_once( ) игнорируется, а если нет — происходит стандартное включение файла.

Функция require( ) похожа на include( ) — она тоже включает шаблон в тот файл, в котором находится вызов require( ).

Между функциями require( ) и include( ) существует одно важное различие. Файл, определяемый параметром require( ), включается в сценарий независимо от местонахождения require( ) в сценарии. Например, при вызове requiге( ) в блоке if при ложном условии файл все равно будет включен в сценарий!

Весь код РНР во включаемом файле обязательно заключается в теги РНР.

Чтобы пояснить механизм использования функций require() и include( ) рассмотрим простейший сценарий реализующий переход по ссылке (рис. 3.116).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Lab8_6 Библиотеки функций</title></head>

<?PHP

   print "<b>Простейшее меню на ссылке. Lab8_6.php</b> <br>";

?>

<body bgcolor=pink>

<?PHP

$site_title = "Название сайта";

$contact_email = "Ord@yandex.ru";

$contact_name = "VVS";

 

print "Вход на сайт- $site_title. <br> Контакт <a href =

\"mai1to:$contact_email\">$contact_name</a>.";

?>

</body>

</html>

Рис. 3.116. Листинг Lab8_6.php.

Программа элементарна и ее вывод показан на рис. 3. 117.

Рис. 3.117. Содержимое браузера для Lab8_6.php.

Чтобы уяснить принцип работы require( ) и include( ) представим содержимое файла показагого на рис. 3.116 в виде двух файлов (Lab8_6_0. php -рис. 3.118  и   Lab8_6_1. php - рис. 3.119)

Рис. 3.118. Содержимое Lab8_6_0.php.

Как показано на рис. 3.118 листинг программы содержит включающий файл в который вынесено содержимое следующих строк (рис. 3.119) из файла Lab8_6.php.

Рис. 3.119. Содержимое  для Lab8_6_1.php.

Внутри вынесенного кода могут находиться не только переменные которые используются в других программах, но и функции. Последнее позволяет гово