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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИйСКОЙ ФЕДЕРАЦИИ
Уральский государственный экономический университет
Центр дистанционного образования
В.В. Плещёв
Разработка сайтов и
Web-программирование.
VBScript, HTML, ASP, Dreamweaver, PHP, MySQL, phpMyAdmin
с примерами и упражнениями
Екатеринбург
2013
УДК 681.3.06 Рекомендовано
ББК 32.973 Учебно-методическим советом
П 38 Уральского государственного экономического университета,
Составитель
В.В. Плещёв
Рецензенты:
Кафедра прикладной информатики Уральского института бизнеса им. И.А. Ильина;
Н.Н. Спирин, зав. кафедрой УрФУ, заслуженный работник образования, д.т.н., профессор;
Ответственный за выпуск
Директор центра дистанционного образования
Уральского государственного экономического университета
В. Е. Кучинская
Плещёв В.В.
П 38 Разработка сайтов и Web-программирование. VBScript, HTML, ASP, Dreamweaver, PHP, MySQL, phpMyAdmin c примерами и упраженениями: Учебное пособие. - Екатеринбург: Изд-во Урал. гос. экон. ун-та, 2013. 200 с.
Пособие содержит обзор, анализ и описание основных средств и технологий разработки сайтов и Web-приложений: VBSript, HTML 4.0, ASP, Dreamweaver, PHP, MySQL, phpMyAdmin с примерами и упражнениями. Приводятся примеры программ и упражнения. Рекомендовано студентам всех форм обучения специальности “Прикладная информатика в экономике (по областям)” и другим аналогичным компьютерным специальностям и направлениям.
Оглавление
[1] Введение [2] Глава 1. Создание Webстраниц [2.1] 1.1. Обзор средств и технологий создания Webстраниц и Web-приложений [2.1.1] 1.1.1. Языки описания документов [2.1.1.1] 1.1.1.1. HTML [2.1.1.2] 1.1.1.2. Динамический HTML. [2.1.1.3] 1.1.1.3. Язык гипертекстовой разметки XML. [2.1.1.4] 1.1.1.4. Macromedia Flash [2.1.1.5] 1.1.1.5. Язык VRML [2.1.1.6] 1.1.1.6. Мультимедйные средства и редакторы [2.1.2] 1.1.2. Языки и технологии Web-программирования [2.1.2.1] 1.1.2.1. Клиентские приложения [2.1.2.2] 1.1.2.2. Серверные приложения [2.1.2.3] 1.1.2.3. Поддержка состояния [2.1.3] 1.1.3. Системы управления контентами сайта (CMS) [2.1.4] 1.1.4. Web-сервера [2.1.4.1] 1.1.4.1. Apache HTTP Server [2.1.4.2] 1.1.4.2. Microsoft Internet Information Services (IIS) [2.1.5] 1.1.5. Использование поисковых возможностей Интернет [2.2] 1.2. Основы HTML [2.2.1] 1.2.1. Правила написания [2.2.2] 1.2.2. Структура документа [2.2.3] 1.2.3. Форматирование текста [2.2.4] 1.2.4. Атрибуты выравнивания текста и управления цветом [2.2.5] 1.2.5. Шрифты [2.2.6] 1.2.6. Списки [2.2.7] 1.2.7. Изображения [2.2.8] 1.2.8. Таблицы [2.2.9] 1.2.9. Якорь (элемент привязки документов, их частей, почты) [2.2.10] 1.2.10. Фреймы [2.2.11] 1.2.11. Формы, управляющие элементы [2.2.12] 1.2.12. Использование компонентов ActiveX [2.2.13] 1.2.13. Дополнительные теги [2.2.14] 1.2.14. Листы стилей [2.3] 1.3. Клиент и сервер [2.4] 1.4. Создание ASPфайла [2.5] 1.5. Основы создания сценариев [2.6] 1.6. Управление браузером [2.6.1] 1.6.1. Объект Window [2.6.2] 1.6.2. Объект Frame [2.6.3] 1.6.3. Объект Location [2.6.4] 1.6.4. Объект Navigator [2.6.5] 1.6.5. Объект History [2.6.6] 1.6.6. Объект Document [2.6.7] 1.6.7. Объект Links [2.6.8] 1.6.8. Объект Anchors [2.6.9] 1.6.9. Объект Forms [2.6.10] 1.6.10. Объект Elemеnts [2.6.10.1] 1.6.10.1. Кнопки (Button, Reset, Submit) [2.6.10.2] 1.6.10.2. Переключатели (CheckBox, Radio) [2.6.10.3] 1.6.10.3. Поля ввода (Text, TextArea, Password) [2.6.10.4] 1.6.10.4. Списки выбора (Select) [2.7] 1.7. Объекты ASP [2.8] 1.8. Работа с текстовыми файлами [2.9] 1.9. Работа с базами данных [2.10] 1.10. Визуальный редактор HTMLдокументов Dreamweaver [2.10.1] 1.10.1. Палитра основных объектов [2.10.2] 1.10.2. Настройка Dreamweaver [2.10.3] 1.10.3. Структура и размещение файлов [2.10.4] 1.10.4. Создание заготовки HTMLдокумента [2.10.5] 1.10.5. Создание пустой таблицы [2.10.6] 1.10.6. Форматирование ячеек таблицы [2.10.7] 1.10.7. Размещение картинки [2.10.8] 1.10.8. Создание меню [2.10.9] 1.10.10. Режимы работы объектов [2.10.10] 1.10.11. Команды [2.10.11] 1.10.12. Анимация [2.11] Вопросы для самопроверки и контроля [3] Глава 2. Weв-программирование на языке PHP [3.1] 2.1. Основные положения [3.1.1] 2.1.1. Среды разработки [3.1.2] 2.1.2. Настройка PHP [3.1.3] 2.1.3. Правила написания программы
[3.2] [3.2.1] 2.2.1. Типы данных [3.2.2] 2.2.2. Переменные
[3.3] [3.3.1] 2.3.1. Выражения и операции [3.3.2] 2.3.2. Операторы
[3.4]
[3.5]
[3.6] [3.6.1] 2.6.1. Объявление класса [3.6.2] 2.6.2. Основные стандартные функции [3.7] 2.7. Файлы [3.7.1] 2.7.1. Открытие и закрытие файлов [3.7.2] 2.7.2. Запись в файл [3.7.3] 2.7.3. Чтение из файла [3.7.4] 2.7.4. Запуск внешних программ на сервере [3.7.5] 2.7.5. Работа с файловой системой [3.7.6] 2.7.6. Работа с каталогами
[3.8] [3.8.1] 2.8.1. Регулярные выражения [3.8.2] 2.8.2. Стандартные интервальные выражения (символьные классы) [3.8.3] 2.8.3. Функции поиска в стиле POSIX [3.8.4] 2.8.4. Строковые функции [3.8.5] 2.8.5. Преобразование текста в HTML
[3.9] [3.9.1] 2.9.1. Простые ссылки [3.9.2] 2.9.2. Файловые компоненты (шаблоны) [3.10] 2.10. Формы [3.10.1] 2.10.1. Элементы для ввода информации. [3.10.2] 2.10.2. Элементы форм, ориентированные на ввод с помощью мышки [3.10.3] 2.10.3. Проблема выравнивания полей для различных браузеров и экранов дисплеев
[3.11] [3.11.1] 2.11.1. Стандартные функции РНР для работы с MySQL [3.11.2] 2.11.2. Работа с сервером баз данных с различными СУБД через ODBC [3.11.3] 2.11.3. Другие СУБД
[3.12] [3.12.1] 2.12.1. Основные понятия [3.12.2] 2.12.2. Схема построения шаблона
[3.13]
[3.14] [3.14.1] 2.14.1. Проблемы конфигурации [3.14.2] 2.14.2. Маскировка файлов данных и конфигурационных файлов [3.14.3] 2.14.3. Хранение файлов за пределами корневого каталога документов [3.14.4] 2.14.4. Безопасность данных [3.14.5] 2.14.5. Шифрование данных [3.14.6] 2.14.6. Аутентификация пользователя
[3.15] [3.15.1] 2.15.1. Программирование на PHP [3.15.2] 2.15.2. Использование MySQL [3.16] Вопросы для самопроверки и контроля [4] Глава 3. Практикум по разработке сайтов и Web-программированию [4.1] 3.1. Разработка учебного сайта заказов на авиабилеты [4.2] 3.2. Разработка учебного Web-приложения на PHP для ведения таблицы единиц измерения в базе данных с СУБД MySQL [4.3] 3.3. Разработка учебного Web-приложения на PHP для ведения таблицы единиц измерения в базе данных с СУБД Access [4.4] 3.4. Разработка Web-приложения на PHP для поиска и вывода оценок студента из базы данных успеваемости с СУБД Access [4.5] 3.5. Разработка Web-приложения на PHP по трудоустройству [4.5.1] 3.5.1. Постановка задачи [4.5.2] 3.5.2. База данных [4.5.3] 3.5.3. Программа формирования и ведения резюме (Vipuskniki.php). [4.5.4] 3.5.4. Функция проверки правильности даты (proverkadati.php) [4.5.5] 3.5.5. Функция проверки номера года (proverkagoda) [4.5.6] 3.5.6. Функция проверки натурального числа (proverkahisla) [4.5.7] 3.5.7. Подпрограмма чтения поля с фотографией (VivodFoto.php) [4.5.8] 3.5.8. Программа ввода параметров поиска записей-резюме [4.5.9] 3.5.9. Программа поиска записей-резюме (ObrabRabotodateli.php) [4.5.10] 3.5.10. Программа переноса сообщений работодателей кандидатам (ObrabRabotodateli2.php) [4.6] [4.7] 3.6. Задачи для программирования [4.7.1] 3.6.1. Формирование форм [4.7.2] 3.6.2. Работа с базой данных [4.7.3] 3.6.3. Дополнительные задачи [4.7.3.1] 3.6.3.1. Циклы [4.7.3.2] 3.6.3.2. Массивы [4.7.3.3] 3.6.3.3. Функции [4.7.3.4] 3.6.3.4. Формы [4.7.3.5] 3.6.3.5.Файлы [4.7.3.6] 3.6.3.6. Строки [4.7.3.7] [4.7.3.8] 3.6.3.7. Графика [4.7.3.9] 3.6.3.8. СУБД MySQL [4.8] 3.7. Контрольные работы [4.8.1] 3.7.1. Разработка учебного сайта [4.8.2] 3.7.2. Разработка учебного Web-приложения по ведению базы данных [5] П р и л о ж е н и я [5.1] Приложение 1. Ответы на вопросы для самопроверки [5.2] Приложение 2. Вопросы к экзамену или зачету.
[6]
[7] |
Замечательным
моим учителям и родственникам
Волковым Владимиру Петровичу и Ольге Ивановне
посвящается
Учебное пособие содержит основные понятия, термины и средства создания Webсайтов и Web-приложений: VBScript, HTML 4.0, ASP, PHP, СУБД MySQL, phpMyAdmin, Dreamweaver 4 с примерами и упражнениями. Приводится обзор и сравнительный анализ средств, технологий и сред разработки сайтов и Web-приложений. В конце некоторых пунктов даны контрольные вопросы и вопросы для самопроверки с ответами (прил. 1). По этим вопросам проводятся два тестирования на компьютере.
В период изучения курса выполняются 2 лабораторные работы (на основе примеров из пособия) и две контрольные работы (разработка учебного сайта и Web-приложения) и сдается экзамен или зачет (прил. 2).
Порядок изучения и классификация учебного материала
Специализация |
Уровень изучения материала |
||
Начальный |
Основной |
Углубленный |
|
1. Создание Web-страниц |
1.1.1.1, 1,1,1.2, 1.1.5, 1.2.1-1.2.11 |
1.1.1.3-1.1.1.6, 1.1.2.1-1.1.2.2, 1.2.12-1.5 |
1.1.2.3, 1.1.3, 1.6-1.10 |
2.Разработка Web-приложений |
2.1, 2.2, 2.3, 2.10, 2.11 |
2.4, 2.5, 2.7, 2.14 |
2.6, 2.8, 2.9, 2.12, 2.13, 2.15 |
Свои предложения и замечания можно посылать по электронной почте: Plehev@Yandex.ru
Автор желает читателю настойчивости и успехов в изучении учебного материала.
World Wide Web (WWW) глобальная компьютерная сеть на сегодняшний день содержит миллионы сайтов. Для навигации в WWW используются специальные программы Web-браузеры. Вся информация в Web-браузере отображается в виде Web-страниц, которые являются основным элементом cайтов и объединяют в себе различные виды информации: текст, графику, звук, анимацию и видео.
Содержание данного пункта софрмировано на основе открытых материалов, опубликованных в Интернет.
1.1.1.1. HTML
Язык HTML (HyperText Markup Language - язык разметки гипертекста) составляет основу технологии гипертекста. Гипертекстовый документ содержит так называемые гиперссылки. Текстовые гиперссылки обычно выделяются цветом и подчеркиванием, хотя это необязательно. Гиперссылки позволяют пользователю немедленно перейти к нужному документу, независимо от места его физического расположения.
Язык разметки документов - это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы “<” и “>”, внутри которых помещались названия инструкций и их параметры.
Язык HTML не является собственно языком программирования; это есть средство описания структуры документа, его стиля и связей его с другими документами.
Для унификации обмена данными Тимом-Бернерсом Ли в 1990 году был разработан протокол HTTP (HyperText Transfer Protocol, протокол передачи гипертекстовых файлов).
HTML является упрощенной версией стандартного общего языка разметки - SGML (Standart Generalised Markup Language), который был утвержден ISO (меэжународная организация по стандартизации) в качестве стандарта еще в 80-х годах. Этот язык предназначен для создания других языков разметки. Контроль за правильностью использования дескрипторов осуществляется при помощи специального набора правил, называемых DTD - описаниями, которые используются программой клиента при разборе документа. Для каждого класса документов определяется свой набор правил, описывающих грамматику соответствующего языка разметки.
Гораздо более простой и удобный, чем SGML, язык HTML позволяет определять оформление элементов документа и имеет некий ограниченный набор инструкций - тэгов, при помощи которых осуществляется процесс разметки. Инструкции HTML, в первую очередь, предназначены для управления процессом вывода содержимого документа на экране программы-клиента и определяют этим самым способ представления документа, но не его структуру. В качестве элемента гипертекстовой базы данных, описываемой HTML, используется текстовый файл, который может легко передаваться по сети с использованием протокола HTTP.
Появилась возможность организовать доступ многочисленных пользователей (клиентов) к HTML-документам, находящимся на так называемых серверах (англ.: to serve - служить, обслуживать). Ясно, что и на компьютере пользователя, с которого происходит обращение к серверу, и на сервере должно быть установлено специальное программное обеспечение:
- сервер должен не только хранить документы, но и уметь быстро находить их по запросу клиента;
- клиент (браузер) должен распознать HTML-код и визуализировать его, представить в легко воспринимаемом виде.
По инициативе Тима-Бернерса Ли в июле 1994 года на базе Массачуссетского технологического института (Massachussets Institute of Technlogies, MIT) был создан World Wide Web consortium (или просто W3C) (Тим-Бернерс Ли возглавил его). Основная цель W3C - обеспечить как можно большую совместимость программного обеспечения web-публикаций. W3C не является административным органом, это нечто вроде форума для выработки компромиссных решений в области web-технологий. Консорциум принимает на рассмотрение любые проекты и предложения. Спецификации, разработанные W3C, не обязательны для применения, но консорциум ведет работу по их пропаганде. HTML был ратифицирован World Wide Web Consortium.
1.1.1.2. Динамический HTML.
До появления версий 4.0 Internet Explorer и Netscape Navigator сценарии могли изменять содержание и внешний вид страниц, только используя метод write.document при загрузке страницы. Любой сценарий, выполняемый позже, может посылать команды браузеру, такие как запрос на загрузку новой страницы, вывод окна предупреждения или изменение значения поля формы, но как только страница загружена, сценарий не может изменить HTML-код и это является большим недостатком.
Динамический HTML устроняет этот недостаток, позволяя вставлять блоки HTML, удалять и заменять их или изменять свойства объектов после отображения страницы на экране. Браузер автоматически обновляет новые свойства и (или) новый HTML-код.
Динамический HTML строится на двух принципах.
1) Объектная модель документа (DOM) описывает способ организации и названия объектов в браузере, а также определяет, какие объекты и свойства могут быть изменены и какие значения они могут принимать.
2) Событийная модель описывает способ передачи управления сценариям - какие действия посылают сценарии на выполнение.
1.1.1.3. Язык гипертекстовой разметки XML.
Международная организация W3C утвердила спецификацию "Extensible Markup Language (XML) 1.0 в начале февраля 1998г. В настоящее время появляются новые языки, созданные на основе XML, возникают многочисленные Web-сервера, использующие эту технологию.
Современные приложения нуждаются не только в языке представления данных на экране клиента (типа HTML), но и в механизме, позволяющем определять структуру документа, описывать содержащиеся в нем элементы. HTML обладает несложным набором команд и вполне успешно справляется с задачей описания текстовой информации и отображением ее на экране программы просмотра - браузера. Однако сами отображаемые данные никак не связаны с теми тэгами, которые используются для форматирования, поэтому у программ-анализаторов нет возможности использовать тэги HTML для поиска нужных нам фрагментов документа. Т.е. встретив, например, такое описание
<font color="красный">роза</font>,
программа просмотра будет знать, каким цветом отобразить текст, содержащийся внутри тэгов <font></font> и, вероятно, отобразит его правильно, но ей абсолютно безразлично, в каком месте документа встретился этот тэг, в какие другие тэги заключен текущий фрагмент, существуют ли вложенные в него фрагменты, правильно ли построены отношения между объектами. Такое "безразличие" к структуре документа приводит к тому, что поиск или анализ информации внутри него ничем не будет отличаться от работы со сплошным, не разбитым на элементы текстовым файлом.
Другим существенным недостатком HTML можно назвать ограниченность набора его тэгов. DTD - правила для HTML определяют фиксированный набор дескрипторов и поэтому у разработчика нет возможности вводить собственные, специальные тэги.
Таким образом, можно утверждать, что HTML уже сегодня не удовлетворяет в полной мере требованиям, предъявляемым современными разработчиками к языкам подобного рода. И ему на смену был предложен новый язык гипертекстовой разметки XML.
XML (Extensible Markup Language) - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания. Таким образом, если, например, мы считаем, что для обозначения элемента роза в документе необходимо использовать тэг <цветок>, то XML позволяет свободно использовать определяемый нами тэг и мы можем включать в документ фрагменты, подобные следующему:
<цветок> роза </цветок >
Набор тэгов может быть легко расширен. Если, предположим, мы хотим также указать, что описание цветка должно по смыслу идти внутри описания оранжереи, в которой он цветет, то просто задаем новые тэги и выбираем порядок их следования:
<оранжерея > < цветок >роза</цветок ></оранжерея >
Если мы хотим посадить туда еще несколько цветочков, то должны внести следующие изменения:
< оранжерея >
< цветок > роза </цветок > < цветок >тюльпан</цветок >
</оранжерея >
Таким образом, у разработчиков появляется уникальная возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа.
Еще одним из очевидных достоинств XML является возможность использования его в качестве универсального языка запросов к хранилищам информации. Кроме того, XML-документы могут выступать в качестве уникального способа хранения данных, который включает в себя одновременно средства для разбора информации и представления ее на стороне клиента. В этой области одним из перспективных направлений является интеграция Java и XML - технологий, позволяющая использовать мощь обеих технологий при построении машинно-независимых приложений, использующих, кроме того, универсальный формат данных при обмене информации.
XML позволяет также осуществлять контроль за корректностью данных, хранящихся в документах, производить проверки иерархических соотношений внутри документа и устанавливать единый стандарт на структуру документов, содержимым которых могут быть самые различные данные. Это означает, что его можно использовать при построении сложных информационных систем, в которых очень важным является вопрос обмена информацией между различными приложениями, работающими в одной системе.
1.1.1.4. Macromedia Flash
Применение графики в традиционных форматах сжатия изображений GIF, JPEG и PNG существенно замедляет загрузку страниц.
Альтернативным инструментом создания анимации является программный продукт - Macromedia Flash. Flash обладает многими преимуществами.
Применение векторной (vector) графики, которая в действительности представляет собой ряд математических формул, описывающих размер, цвет и местоположение формы. Векторная графика состоит из линий и кривых, тогда как растровая (bitmapped) - из небольших точек растра, или пикселей (pixels). Применение математических формул является главным преимуществом отображения графики и сохранения небольшого размера файлов, что особенно важно для Web.
Возможность сжатия анимации, графики и звука. Такое сжатие файла обусловливает свойство по-токовой передачи (streaming), которое позволяет отображать сайт в Web-браузере до полной загрузки его содержимого. Это означает, что одна векторная графика сайта отображается, в то время как другая графика, звук и анимация все еще загружаются.
Интерактивность во Flash может состоять из самых разных свойств. Помимо неограниченных возможностей применения простой графики, анимации или крупных заголовков, в любой объект или область сайта можно вводить полноценные навигационные свойства: кнопки, меню или фрагменты анимации, с помощью которых конечный пользователь перемещается по сайту. А задавая действия (actions), можно создавать интерактивные фильмы. Для создания интерактивных элементов управления во Flash предоставляется язык создания сценариев - ActionScript.
Изображения и тест, разработанные во Flash, всегда отображаются ясно и четко, что опять же обусловлено векторной графикой.
Flash помогает пользователю рисовать. В частности, Flash может распознавать основные геометрические формы в процессе их создания. При этом она заменяет небрежно нарисованную форму правильной геометрической формой, которую, как предполагается, пользователь пытается нарисовать. Например, если быстро нарисовать овал или окружность, создав круглую форму, Flash сделает эту форму более плавной и круглой, доведя ее до идеального овала или окружности. Кроме того, Flash помогает создавать прямые и плавные линии.
В состав Flash входит инструмент, который создает основу для большинства качественных Flash-фильмов. Этот инструмент - ActionScript - событийно-управляемый язык, встроенный во Flash. ActionScript делает ваши страницы интерактивными. Вы можете реагировать на события с мышки или с клавиатуры, можете выполнить какие-либо действия при проигрывании определенного кадра.
Для того чтобы овладеть ActionScript в полной мере, желательно уже иметь опыт программирования (предпочтительно на С++, JavaScript).
1.1.1.5. Язык VRML
Язык VRML (Virtual Realty Modelling Languagy) предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве.
Vrml-файл представляет собой обычный текстовый файл, интерпретируемый браузером. Поскольку большинство браузеров не имеет встроенных средств поддержки vrml, для просмотра Vrml-документов необходимо подключить вспомогательную программу - Vrml-браузер, например, Live3D или Cosmo Player.
Как и в случае с HTML, один и тот же vrml-документ может выглядеть по-разному в разных VRML-браузерах. Кроме того, многие разработчики VRML-браузеров добавляют нестандартные расширения VRML в свой браузер.
Cуществует немало VRML-редакторов, делающих удобней и быстрее процесс создания Vrml-документов.
1.1.1.6. Мультимедйные средства и редакторы
Приведем еще некоторые средства разработки:
Для разработки Web-приложений могут использоваться:
1. Языки разметки: HTML, XHTML, XML, CSS и др.
2. Языки сценариев, которые исполняются на стороне клиента, в самом браузере, а результат выполнения, выводящие на экран: JavaScript, JScript, ECMAScript, VBScript, jQuery.
3. Языки серверных сценариев, код которых выполняется на сервере, а результат формирует окончательную страницу и выдает в браузер посетителя: PHP, Perl, ASP, JSP, Parser, ColdFusion и другие. Эти языки не работают без специализированных серверов, например, Apache, IIS. Часто они работают в сочетании с базами данных (MySQL, PostgreSQL, SQLite, Oracle, MSSQL, Firebird, Access и др.) для обращения к которым используются разновидности языка SQL.
4. Смешанная клиентско-серверная технология AJAx, при использовании которой клиент (браузер) и сервер обмениваются данными без перезагрузки страницы (в отличии от языков серверных сценариев), что ускоряет работу.
5. Трехзвенная клиентско-серверная технология, которая также состоит из клиента и сервера. Но серверная часть в этой технологии представляет собой сервер приложений и сервер БД. А в качестве клиента выступает Webбраузер. Такая система очень проста для пользователя. Ему необходимо знать только адрес сервера приложения и наличие Webбраузера на рабочем компьютере. Все данные представляются в виде HTMLразметки с использование графики (jpeg, gif, flash), каскадных слоев CSS и JavaScript. Передача запросов от клиента к серверу приложений происходит по средствам CGIинтерфейса. Сервер приложений общается с сервером БД, используя другой интерфейс, зависящий от того, на основе каких средств строится конкретная информационная система.
6. Встраиваемая растровая графика. Браузеры воспринимают форматы: JPG, GIF и PNG.
7. Технология Flash (язык ActionScript). Используется как для анимированных векторных графических вставок в отдельных фрагментах web-страниц, так и для построения целых сайтов. Векторная графика (например, формат SVG) поддерживается ограниченно.
8. Технология апплетов Java. Позволяет создавать интересные визуальные эффекты.
9. Программы, исполняемые на сервере в помощь серверным языкам. Например, подули сервера для выполнения сценариев по времени (corn). Или программа для уменьшения копии изображений.
Многие из этих технологий часто взаимодействуют друг с другом и являются взаимодополняющими, а иногда даже необходимыми в некоторых случаях.
В следующих пунктах более подробно остановимся на некоторых средствах и технологиях
1.1.2.1. Клиентские приложения
JavaScript - это язык управления сценариями просмотра гипертекстовых страниц Web на стороне клиента.
К возможностям JavaScript можно, например, отнести следующее:
отображать изменяющиеся данные, например, текущее время;
программировать переменное содержание в зависимости от даты, браузера пользователя или других условий;
изменять внешний вид элементов страницы, если пользователь щелкнул мышью или провел курсор мыши над элементом.
JavaScript не позволяет работать на уровне машинных кодов, однако вы получаете доступ ко многим возможностям браузеров, Web-страниц, а иногда и системы, в которой работает браузер. JavaScript обходятся без компиляции, а вашему браузеру не придется загружать виртуальную машину для выполнения программного кода.
JavaScript также работает в объектно-ориентированной архитектуре, напоминающей Java или C++. Такие возможности языка, как конструкторы или наследование на базе прототипов, добавляют в схему разработки новый уровень абстракции, что способствует многократному использованию программного кода.
Одна из главных причин, по которой Web-разработчики приняли JavaScript - возможность выполнения на стороне клиента многих функций, которые ранее выполнялись исключительно на стороне сервера. Лучшим примером является проверка форм: элементы формы можно проверить до того, как пользователь передаст информацию Web-серверу. Это приводит к уменьшению количества транзакций HTTP, а также заметному снижению вероятности ошибки при повторном заполнении формы. Кроме того, JavaScript позволяет читать и записывать cookie.
VBScript делает примерно то же самое, что JavaScript, только программный код очень похож на Visual Basic. Visual Basic Script - подмножество языка Visual Basic [5]. VBScript позволяет решать задачи, связанные с Internet, а именно создавать сценарии (или скрипты) управления объектами (кнопками, списками, ниспадающими меню и т. д.) на Web-страничках. С помощью VBScript можно быстро создавать собственные страницы или даже писать игры. И все это размещается внутри HTML-документа.
Коротко о некоторых особенностях VBScript
VBScript отличается от JavaScript следующим:
• в конце оператора не ставится точка с запятой;
• знак равенства используется как для присвоения значений переменным, так и для выполнения операции сравнения;
• блоки операторов выделяются не фигурными скобками, а парами ключевых слов if...endif, do...loop, и while...wend.
Так же как в JavaScript, переменные вводятся по мере необходимости, а их тип определяется по контексту. VBScript поддерживает почти все встроенные функции Visual Basic. На Web-страницах VBScript выглядит следующим образом:
<script language="VBScript"> <!
document.write("URL=" + document.location) >
</script>
Тэги <SCRIPT> и </SCRIPT> практически такие же, как и раньше, а язык определяется как VBScript. Тэги <! и > - те же самые, но без знака комментариев //.
Основной недостаток VBScript состоит в том, что его поддерживает только Internet Explorer.
Java - один из самых значительных шагов вперед в области разработки сред программирования. Язык HTML был необходим для статического размещения страниц во “Всемирной паутине” WWW (World Wide Web). Язык Java потребовался для качественного скачка в создании интерактивных продуктов для сети Internet.
Три ключевых элемента объединились в технологии языка Java и сделали ее в корне отличной от всего, существующего на сегодняшний день.
Java предоставляет для широкого использования свои апплеты (applets) - небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML.
Каждый апплет - это небольшая программа, динамически загружаемая по сети - точно так же, как картинка, звуковой файл или элемент мультипликации. Главная особенность апплетов заключается в том, что они являются настоящими программами. Апплет не просто проигрывает один и тот же сценарий, а реагирует на действия пользователя и может динамически менять свое поведение.
Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов.
Программы на Java не могут вызывать глобальные функции и получать доступ к произвольным системным ресурсам, что обеспечивает в Java уровень безопасности, недоступный для других языков.
Java создавалась как средство создании интерактивных сетевых программ. В Java реализовано несколько интересных решений, позволяющих
Необычайная способность Java исполнять свой код на любой из поддерживаемых платформ достигается тем, что ее программы транслируются в некое промежуточное представление, называемое байт-кодом (bytecode). Байт-код, в свою очередь, может интерпретироваться в любой системе, в которой есть среда времени выполнения Java. Байт-код легко переводится непосредственно в “родные” машинные коды (Just In Time compilers) “на лету”. При этом достигается очень высокая производительность (Symantec JIT встроен в Netscape Navigator).
Язык Java проще для изучения, чем другие другие языки программирования, например C++.
Основой популярности Java являются встроенные классы-абстракции, сделавшие его языком, действительно независимым от платформы. Библиотеки, подобные MFC/COM, OWL, VCL, NeXTStep, Motif и OpenDoc прекрасно работают на своих платформах, однако сегодня главной платформой становится Internet.
Python (Питон) - это объектно-ориентированный, интерпретируемый, переносимый язык сверхвысокого уровня. Интерпретатор Питона может быть перенесён на любую платформу, будь то Unix, Windows, Linux, RiscOS, MAC, Sun. При написании кода на Питоне вы не должны заботиться о конечной платформе, кроме тех случаев, когда вы используете специфические модули для данной системы. Таким образом, Питон представляет серьёзную угрозу для Java, обеспечивая лёгкую переносимость, одновременно сочитая в себе средства доступа к ресурсам операционной системы. Модули Питона могут быть с лёгкостью использованы в программах на С++. Питон идеален в качестве cgi скриптов для веб-страниц, так как использует быстрый, эффективный и мощный интерпретатор. Питон может служить как в качестве языка для обучения, так и в качестве языка для разработки больших систем. Он прост, мощен и его очень легко освоить. Программы на Питоне можно написать в два раза быстрее, чем на С, используя структуры высокого уровня, но по мощности он приближается к C.
1.1.2.2. Серверные приложения
С помощью сценариев для сервера можно получить доступ к файлам, базам данных и другим ресурсам, хранимым на сервере, а также к централизованным ресурсам сервера, таким как электронная почта или факс-служба. Функционирование в непротиворечивой и управляемой среде - еще одно преимущество выполнения сценариев на сервере. Ваш код выполняется только на одной версии единственного сервера, а не на множестве версий множества браузеров и типов компьютеров и другой цифровой техники.
Однако и для использования сценариев на стороне сервера имеется три основных препятствия.
1) Запуск скриптов на сервере зачастую требует получения специальных прав от Web-мастера или системного администратора.
2) Для взаимодействия со сценариями, выполняющимися на сервере, пользователь должен щелкнуть мышкой на ссылке или на кнопке на странице, а затем ожидать, когда сервер выполнит сценарий и перешлет ответ. Взаимодействие с использованием динамического HTML происходит быстрее.
3) Для тестирования сценариев для сервера требуется иметь собственный WWW-сервер, предпочтительно того же типа, что и промышленный вариант.
Программирование на стороне сервера в настоящее время является необходимым условием для решения широкого спектра задач. Оно позволяет:
получать и обрабатывать на сервере данные, введенные пользователем при помощи формы;
динамически создавать web-документы, не зависящие ни от платформы, ни от браузера клиента;
обеспечивать динамический доступ к данным, находящимся на сервере, в частности, к серверным базам данных (при таком способе доступа HTML-документ автоматически изменится, как только изменятся хранящиеся на сервере данные);
использовать серверные компоненты, предназначенные для решения типовых задач (таких, например, как циклическая смена рекламных баннеров и др.);
осуществлять аутентификацию пользователя;
получать информацию о браузере клиента;
создавать и читать ключики на стороне клиента.
Технология «клиент-сервер» CGI - Common Gateway Interface является стандартом интерфейса (связи) внешней прикладной программы с информационным сервером типа HTTP, Web сервер.
Большое количество World Wide Web приложений основано на использовании внешних программ, управляемых Web сервером. Использование данных программ позволяет строить Web приложения с динамически обновляемой информацией, хранящейся в базах данных или генерирующейся в зависимости от бизнес-правил решаемых задач. Для связи между Web сервером и вызываемыми программами широко используется Common Gateway Interface (CGI), имеющий реализации, как для Windows-ориентированных программ, так и для приложений, функционирующих в среде Unix.
Обычно гипертекстовые документы, извлекаемые из WWW серверов, содержат статические данные. С помощью CGI можно создавать CGI-программы, называемые шлюзами, которые во взаимодействии с такими прикладными системами, как система управления базой данных, электронная таблица, деловая графика и др., смогут выдать на экран пользователя динамическую информацию.
Таким образом, программа-шлюз запускается WWW сервером в реальном масштабе времени. WWW сервер обеспечивает передачу запроса пользователя шлюзу, а она в свою очередь, используя средства прикладной системы, возвращает результат обработки запроса на экран пользователя. Программа-шлюз может быть закодирована на языках C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script. Как выполнимый модуль, она обычно записывается в поддиректорий с именем cgi-bin WWW сервера.
Интернет вообще и WWW в частности работает по технологии «клиент-сервер», то есть все программное обеспечение разделяется на клиентскую и на серверную части. Также между ними разделены и функциональные обязанности. Важным для понимания моментом является то, что клиент не знает и не обязан знать принципы работы и реализацию внутренних алгоритмов сервера, а сервер не вмешивается в дела клиента. Для взаимодействия этих частей разработан специальный протокол (в частном случае протокол HTTP), и все взаимодействие между клиентом и сервером осуществляется исключительно в рамках данного протокола. Вашему браузеру все равно, какое программное обеспечение стоит на сервере, какая там операционная система, где физически лежат запрашиваемые документы на сервере (и лежат ли вообще, ведь они могут и генерироваться на лету специальными программами). Сервер тоже не вмешивается в дела вашего браузера, серверу абсолютно все равно, что сделает клиент с переданной информацией, как он ее будет отображать, сохранит на диске или проигнорирует - серверу до этого дела нет. Взаимодействие клиента и сервера происходит по принципу «запрос-ответ». Клиент посылает запрос, сервер обрабатывает его и посылает ответ:
Рассмотрим более детально все этапы соединения по протоколу HTTP:
1. Формирование запроса клиентом. (Браузер формирует запрос из URL, набранного пользователем, из щелчка на ссылке либо из данных формы).
2. Установка соединения с сервером (если установить соединение не удается, то на этом HTTP-транзакция закончится и клиент выдаст пользователю сообщение об ошибке).
3. Посылка запроса и ожидание ответа от сервера (все, что требуется от клиента, это чтобы запрос был в корректном формате).
4. Сервер принимает запрос (об этом и следующем этапе клиенту ничего не известно).
5. Сервер обрабатывает запрос.
6. Генерация ответа.
7. Прием ответа клиентом.
8. Разрыв соединения.
9. Обработка данных клиентом (вывод или сохранение данных).s
Обычно под запросом к серверу понимается URL (это унифицированная форма «заказа» данных на сервере). К собственно URL могут еще «прилагаться» некоторые данные, чаще всего это данные форм. При установке соединения с сервером сначала происходит трансляция символьного доменного имени, такого, как www.siemens.com, в IP-адрес, а затем осуществляется непосредственно создание TCP/IP-соединения с данным IP. Когда данные HTTP-запроса посланы серверу, клиент просто ожидает, пока не придет ответ. Пока нет обращений от клиентов, сам HTTP-сервер просто «спит» в ожидании запросов. Когда клиент устанавливает соединение, сервер «просыпается» и, приняв данные запроса, приступает к их обработке. Что именно сервер делает с запросом - известно только самому серверу. Единственный результат всех хитрых манипуляций - это выдача ответа, которого и ожидает клиент.
После того как сервер выдал ответ, он разрывает соединение и вновь «погружается в сон». Естественно отметить, что в случае возникновения ошибки HTTP-транзакция может закончиться на любом из этих этапов.
Если документ не найден или если для доступа к нему у вас нет прав, то выдается код ошибки. А если все нормально, то информация, содержащаяся в документе, включая сопутствующие данные о его типе, выдается в виде ответа.
Технология SSI (Server Side Includes, включения на стороне сервера) - это директивы, вставляемые в HTML-код и служащие для передачи указаний серверу. SSI позволяют "вставлять" фрагменты одних документов в другие. Конечно, это можно сделать непосредственно в текстовом редакторе, но если, например, в несколько документов вставляется один и тот-же фрагмент, к тому же часто изменяемый, использовать SSI-вставки много удобнее.
Сервер интерпретирует SSI-директивы и выполняет соответствующие действия. Использование SSI-вставок позволяет динамически формировать странички в зависимости от различных параметров (например, типа браузера).
Преимущества SSI проявляются тем сильнее, чем больше по объему сайт, имеющий повторяющиеся элементы кода на разных страничках. Для того, чтобы сервер знал, что страничка не обычная, а содержит SSI-директивы, используется специальное расширение: sHTML или shtm. Для того, чтобы указать серверу, какой блок нужно вставить и в каком месте странички, используется специальная форма записи в виде комментария:
<!--#команда параметр="значение" -->
При просмотре сформированного исходника HTML-файла пользователь не увидит никаких признаков SSI, т.к. браузер получает уже готовый HTML-код.
Первое преимущество SSI с точки зрения дизайнера заключается в том, что при таком подходе web-мастеру, занимающимуся поддержкой сайта, можно не бояться случайно испортить дизайн. Элементы сложной верстки скрыты за счет использования SSI, и поддержка содержимого страничек становится гораздо более легким и приятным делом.
Второе - это возможность мгновенной замены дизайна сайта, не требующая переделывания страничек. Для смены дизайна достаточно переписать SSI-вставки, формирующие внешний вид сайта.
SSI является дополнением к CGI, предоставляющее web-программисту множество удобств.
Спецификации ISAPI (Internet Server Application Programming Interface) определяет правила взаимодействия между Web-сервером и дополнительными программами.
Несомненным преимуществом CGI является универсальность. CGI-сценарии могут быть написаны на разных языках и выполняться на компьютерах с различной архитектурой. Если при написании сценария вы учли все правила, то можете быть уверены, что созданная вами программа будет корректно взаимодействовать с любым Web-сервером. Простота CGI также способствует широкому распространению этого стандарта.
Однако, наряду с преимуществами, CGI-сценарии обладают некоторыми недостатками; главным из которых считается неэффективное использование ресурсов. Каждый из запросов клиента, предполагающий вызов сценария, порождает отдельный процесс на компьютере-сервере. Как известно, для выполнения независимого процесса требуется гораздо больше ресурсов, чем для работы потока в составе процесса.
Стремление повысить производительность и снизить затраты ресурсов привело к созданию корпоративных стандартов. Наиболее известными из них являются NSAPI и ISAPI.
Основное отличие ISAPI-программы от CGI-сценария состоит в том, что ISAPI-программа представляет собой не исполняемый файл, а динамическую библиотеку (DLL). Благодаря этому появилась возможность запускать программу не как отдельный процесс, а как поток, принадлежащий Web-серверу. Для выполнения потока требуется значительно меньше ресурсов, чем для работы независимого процесса. Поток использует адресное пространство породившего его процесса и работает намного быстрее, чем отдельный процесс.
По окончании выполнения процесс выгружается из памяти, а при поступлении следующего запроса снова загружается с диска. Это также не способствует эффективной работе CGI. При интенсивном поступлении запросов необходимость постоянного обмена с диском создает дополнительную нагрузку на сервер. В отличие от CGI-сценария, ISAPI-программа, окончив свою работу, как правило, остается резидентной в памяти и используется для обработки последующих запросов.
Однако иногда преимущества ISAPI-программ оборачиваются недостатками. Если за универсальность CGI-сценариев пришлось платить недостаточной производительностью, то в качестве платы за высокую производительность создатели ISAPI-программ жертвуют универсальностью. Арсенал языков, имеющихся в распоряжении разработчиков ISAPI-программ, значительно беднее, чем у их коллег, создающих CGI-сценарии - только C++.
Поскольку программа данного типа выполняется как поток, порожденный сервером, она использует адресное пространство сервера. Следовательно, ошибка ISAPI-программы может не только вызвать ее аварийное завершение, но и вывести из строя сервер.
Программы, использующие спецификацию ISAPI, делятся на две категории.
1) Расширения. Функционально они мало чем отличаются от CGI-сценариев. Подобно CGI-сценариям, расширения реализуют дополнительные возможности Web-сервера, но строятся совершенно по-другому.
2) Фильтры. Это особый класс программ. Если расширения дополняют возможности Web-сервера, то фильтры изменяют его поведение.
ISAPI-расширение представляет собой динамическую библиотеку (DLL), которая связывается с Web-сервером в процессе его работы. В данной библиотеке должны экспортироваться, т.е. быть доступными для вызова, две функции: GetExtensionVersion() и HttpExtensionProcf).
Особенности выполнения ISAPI-расширений, а также основные отличия программ данного типа от CGI-сценариев проще всего выяснить, рассматривая процедуру вызова расширения, а также назначение указанных выше функций и параметров, передаваемых при их вызове.
В отличие от расширения, которое вызывается лишь тогда, когда в запросе клиента явно указан URL программы, ISAPI-фильтр получает управление при каждом обращении клиента к серверу. Программа-фильтр загружается в память при запуске Web-сервера и остается резидентной в течение всего времени работы сервера.
Perl - интерпретируемый язык, приспособленный для обработки произвольных текстовых файлов, извлечения из них необходимой информациии и выдачи сообщений. Он также удобен для написания различных системных программ. Этот язык прост в использовании, эффективен, но про него трудно сказать, что он элегантен и компактен.
В настоящее время язык получил большое распространение как инструмент создания исполняемых модулей WWW-сервера. Существующие пакеты расширения обеспечивают доступ к SQL-серверам непосредственно из Perl-программы. Это позволяет использовать его для решения всех задач, возникающих при обеспечении WWW-доступа к базам данных. Perl эффективен также при обработке произвольных структур данных: существующих отчетов, списков, карточек в электронном виде.
Perl - самый широко используемый язык для CGI-программирования, и для этого есть много веских причин:
Perl легко выучить: его синтаксис напоминает другие языки (например С). При ошибке выдается подробное сообщение, помогающее быстро локализовать проблему.
Perl способствует быстрой разработке, так как это интерпретируемый язык; исходный код не надо компилировать перед запуском; доступен на многих платформах с минимальными изменениями; содержит очень мощные функции для обработки строк со встроенной в язык поддержкой поиска и замены по регулярным выражениям; обрабатывает двоичные данные так же легко, как и текст; не требует четкого разделения на типы: числа, строки и логические выражения являются обычными скалярами; взаимодействует с внешними приложениями очень просто и обеспечивает собственные функции для работы с файловыми системами; есть много свободно доступных модулей от CPAN, начиная с модулей для создания динамической графики до интерфейсов с Интернет-серверами и системами управления базами данных.
Perl действительно очень быстрый: считывая исходный файл, он тут же компилирует его в низкоуровневый код, который потом исполняет. Обычно компиляция и исполнение в Perl не воспринимаются как отдельные шаги, поскольку выполняются вместе: Perl запускается, читает исходный файл, компилирует его, запускает и затем завершает работу. Этот процесс повторяется каждый раз, когда запускается сценарий Perl, в том числе CGI-сценарии. Поскольку Perl так эффективен, этот процесс происходит достаточно быстро, чтобы обрабатывать все запросы не на самых загруженных серверах. Однако следует обратить внимание, что в системах Windows это гораздо менее эффективно из-за необходимости создания новых процессов.
РНР изобретен Расмусом Лердорфом в конце 1994 года. Первая версия выпущена в 1995 году под именем «Инструментарий Персональных Домашних Страниц», затем она была переработана и названа PHP/FI Version 2 (FI модуль обработки данных для форм). Также была добавлена поддержка баз данных mSQL.
Разработка интерпретатора РНР приняла форму организованного командного процесса, ядро интерпретатора разрабатывает компания Zend.com. При этом РНР распространяется свободно: его последнюю версию можно загрузить с сайта PHP.net. Модули РНР поставляются в комплекте с сервером Apache, в комплектах систем Linux.
Изначально аббревиатура РНР означала Preprocessor of Home Pages - препроцессор домашних страниц. Это язык внедряемых в HTML-страницы сценариев, исполняемых на сервере. По большей части его синтаксис заимствован из таких языков, как С, Perl, Java, и при этом добавлена масса возможностей, которых этим языкам недостает.
РНР наделен практически полным набором функциональности, о которой (до появления РНР) мог только мечтать web-программист. Его цель - позволить максимально быстро создавать динамически генерируемые web-страницы. С полным основанием можно заявить, что изучение и использование РНР будет выгодно как начинающим, так и профессиональным программистам.
Основными конкурентами РНР являются технологии JSP (Java Server Pages и Java Scriptlets), ASP (Active Server Pages), Perl, SSI (Server Side Includes), Cold Fusion Server Pages.
Основные достоинства РНР:
бесплатен; постоянно совершенствуется; работает на UNIX и Windows платформах;
допускает работу с большинством СУБД;
имеет широкий набор функций (более 3 тыс.);
допускает объектно-ориентированное программирование;
способен использовать протоколы HTTP, FTP, SNMP, NNTP, РОРЗ, net sockets и другие;
позволяет выполнять все операции, что и перечисленные его конкуренты, и даже работать с файлами графики. Можно также запускать РНР-скрипты как интерпретируемые файлы и компилировать исполняемые приложения (в том числе с поддержкой графического интерфейса GTK).
ASP и ASP.NET в составе Microsoft.NET представляют простую среду периода выполнения для Web - Active Server Pages (ASP) как часть сервера Internet Information Server (IIS), включенного в Windows NT 4 Option Pack. IIS обслуживает Web-страницы, запрашиваемые пользователем. ASP позволяет программистам реализовывать алгоритмы динамического создания страниц на IIS, состоящих из статического HTML и кода сценариев. Когда пользователь запрашивает ASP-страницу, IIS должен ее найти и активизировать ASP-процессор. ASP-процессор должен прочитать страницу и один к одному скопировать содержащиеся на ней HTML-элементы в выходную страницу. В нашем примере атрибут style устанавливает голубой цвет текста. При этом также интерпретируются элементы сценариев, расположенные между ограничителями <% %>. Этот код, должен выполнять алгоритм, выдающий в качестве результата HTML-строки, которые ASP-процессор должен скопировать в выходную страницу в те места, где были элементы сценария. Результирующая страница, собранная из статических HTML-элементов и HTML, динамически сгенерированного сценарием, должна быть передана клиенту. Для простых задач ASP применять относительно легко, что является признаком качества этой технологии.
<HTML style="color:#OOOOFF;">
Время есть: <% =time X> on <X =date X>
</HTML>
Технология Microsoft ASP представляет собой совокупность серверных средств для динамического создания Web-документов.
Активные серверные страницы (Active Server Pages, ASP), созданные Microsoft для собственного веб-сервера, сейчас доступны для многих серверов. Сервер ASP интегрирован в веб-сервер и не требует отдельного процесса. Он позволяет программистам совмещать код и HTML-страницы вместо того, чтобы писать отдельные программы. Для ASP существуют модули, позволяющие делать то же самое, используя CGI. ASP поддерживают различные языки программирования, самый популярный из которых Visual Basic, хотя JavaScript также поддерживается. Кроме того, существует версия Perl от ActiveState, которую можно использовать в Windows с ASP.
Microsoft .NET готовая инфраструктура для решения общих проблем Интернет-приложений. Это прикомпоновываемая среда периода выполнения, работающая в ОС Windows 2000.
Сервис, обеспечиваемый .NET:
NET Framework - среда периода выполнения, облегчающая написание полноценного надежного кода в сжатые сроки, управление, развертывание и модификацию этого кода. Написанные вами программы и компоненты выполняются в этой среде. Она дает программистам в период выполнения такие классные возможности, как автоматическое управление памятью (сборка мусора) и упрощенный доступ ко всем службам ОС. Она добавляет массу вспомогательных функций вроде простого доступа к Интернету и базам данных. Кроме того, она обеспечивает новый механизм повторного применения кода - более простой в использовании и в то же время более мощный и гибкий, чем СОМ. Развертывать .NET Framework проще, так как она не требует настройки реестра. Она также поддерживает на системном уровне стандартизированный механизм управления версиями. Все это доступно программистам на любом .NET-совместимом языке.
ASP.NET (следующая версия Active Server Pages) - это новая среда, работающая на Internet Information Server (US), заметно упрощающая написание кода для создания HTML-страниц. ASP.NET предлагает новый, не зависимый от языка способ создания кода и привязки его к запросам Web-страниц - .NET Web Forms - управляемую событиями программную модель взаимодействия с элементами управления. Она делает программирование Web-страниц аналогичным программированию форм Visual Basic. ASP.NET содержит развитые средства управления сеансами и функции защиты. Она надежнее, и производительность ее значительно выше в сравнении с ASP. Microsoft .NET предлагает новый набор служб, позволяющих серверу предоставлять свои функции любому клиенту на любой машине с любой ОС.
По мере расширения Web и увеличения потребностей пользователей Web-разработчикам потребовались совершенствование двух ключевых свойств исполняющей среды: простоты программирования и качества выполнения. ASP.NET и явилось таким усовершенствованием. ASP.NET похожа на оригинальную ASP и большая часть кода может быть переведена на нее практически без изменений. Но внутренняя реализация ASP.NET полностью переделана с тем, чтобы задействовать возможности .NET Framework.
ASP.NET отделяет HTML от алгоритмов, создавая фоновый код (code-behind). Вместо того чтобы перемешивать HTML с кодом, код пишется в отдельном файле, на который есть ссылка на ASP-странице. В результате такого разделения Microsoft смогла усовершенствовать среду разработки и отладки Visual Studio.NET, которая используется при разработке Web-приложений.
JAVA-servlets (сервлеты) - это высокопроизводительные платформо-независимые server-side-пpиложения, написанные на Java и составляющие реальную конкуренцию таким технологиям, как CGI, PHP3, Perl, ASP.
Java-сервлеты были созданы в Sun. Сервлеты похожи на CGI-сценарии тем, что это код, создающий документы. Тем не менее, сервлеты, поскольку они используют Java, должны быть скомпилированы перед запуском как классы, которые динамически загружаются веб-сервером при запуске сервлетов. Интерфейс отличается от CGI. JavaServer Pages или JSP - это другая технология, позволяющая разработчикам встраивать Java в веб-страницы, наподобие ASP.
К преимуществам сервлетов можно отнести.
Исключительно высокая скорость работы. Быстpодействие сервлетов объясняется тем, что они, во-пеpвых, пpедставляют собою уже скомпилиpованный и оптимизиpованный код (а в случае с JIT-ом - ещё и пpеобpазованный в машинный) и, во-втоpых, выполняются в единожды загpуженной и инициализиpованной Java-машине. Таким образом, экономятся ресурсы на запуск обработчика/паpсеpа скpипта, необходимые, например, для Perl или PHP3 (в некоторых ОС, в частности, в OS/2 - это очень серьезная экономия), и ресурсы (как память, так и время), затрачиваемые на непосредственно предкомпиляцию (интерпретацию) кода (что необходимо для тех же Perl, PHP, REXX).
Переносимость. В данном случае принцип "write once run everywhere" действует безотказно. Сервлеты, написанные в соответствии со спецификацией от Sun и не использующие какие-то особенности конкретного веб-сервера, работают безо всякой переделки или перекомпиляции под любыми, порой весьма далёкими друг от друга платформами, будь то Solaris, FreeBSD или OS/2. В связи с этим разработчик может совершенно свободно выбирать, в какой системе ему удобнее работать - он ни коим образом не привязан ни к серверу, ни к будущей целевой платформе.
Работа с реляционными СУБД из Java унифицирована (для этого существует специальный пакет java.sql), удобна и отвязана от специфичных для конкретной СУБД тонкостей. Всё, что Вам нужно - это найти для своей СУБД ODBC-дpайвеpы (а они сейчас существуют практически для всех совpеменных баз данных, зачастую даже по нескольку pазновидностей), и далее можно пользоваться совеpшенно стандаpтными механизмами. А при переходе на другую СУБД, например, c MySQL на Oracle, достаточно будет просто добавить в CLASSPATH новый драйвер и поменять URL для подключения к другой базе. Ни одного изменения в коде
Перспективность, современность технологий.
Технология pаботы сеpвлет-сеpвеpа.
Рассмотрим это на примере модуля JServ к веб-серверу apache.
В момент старта сервера вместе с ним стартует и ява-машина с так называемым servlet-wrapper'ом или средой, в которой в дальнейшем и предстоит исполняться сервлетам. Строго говоря, JServ - это и есть та самая среда. Он целиком написан на Java и занимается непосредственно загрузкой и исполнением сервлетов, следуя спецификации Sun, а также обменом данными с собственно веб-сервером. В последнем для этого должен присутствовать специальный модуль mod_jserv (его необходимо добавить при компиляции и сборке apache, или подключить в виде внешнего модуля).
При получении запроса на документ, приходящийся на специально оговоренный URL или каталог (обычно это что-нибудь вроде /servlets/), apache с помощью модуля mod_jserv передает этот запрос JServ'у, который определяет, какой сервлет должен этот запрос обработать, загружает этот сервлет (если он ещё не был загружен) и затем возвращает веб-серверу тот текст или поток данных, который был сформирован в результате работы сервлета.
Изначально сервер "пуст" - при его старте сервлеты обычно не загружаются (хотя есть возможность принудительно инициализировать нужные сервлеты при старте сервера). При появлении запроса нужный сервлет ищется в списке уже загруженных и, при необходимости, стартуется и инициализируется.
После этого он остается постоянно загруженным в Java-машине (и предкомпилированным, если Java-машина содержит JIT) и при последующих запросах просто вызывается соответствующий его метод для их обработки. Преимущества такой идеологии очевидны. Функционально это аналогично вызову простой подпрограммы внутри обычного сервера и проиходит очень быстро и эффективно. Кроме того, заметный выигрыш дают такие вещи, как единожды проведенная инициализация, возможность хранения глобальных данных или поддержка множественных клиентских сессий, ведущаяся самим сеpвеpом (а не сеpвлетами, pазpаботчики котоpых в значительной степени избавлены от изобpетания велосипедов). Например, можно установить одно единственное соединение с базой данных, и пользоваться им при обработке запросов - немалая экономия, учитывая то, что из тех же скриптов на perl или php приходится каждый раз создавать новое соединение, восстанавливать параметры сессии и т.п.
Конечно же, существует возможность принудительной выгрузки отдельных сервлетов из памяти в случае необходимости, а также возможность автоматического распознавания изменения сервлетов и их перезагрузки. Иными словами, при обновлении того или иного сервлета нет необходимости перезагружать весь веб-сервер или JServ, достаточно просто положить новую версию на место старой, и она будет автоматически загружена в память при следующем запросе (естественно, при этом будет сначала произведено корректное завершение работы старой версии, путём вызова специального метода, а затем загрузка и инициализация новой).
Пакет Cold Fusion от Macromedia предназначен для использования под ОС Windows и позволяет обращаться к различным базам данных, поддерживающим интерфейс ODBC через WWW-интерфейсы. Пакет имеет коммерческий статус, его "evaluation copy" является свободно-распространяемой. Для доступа к базам данных используются конструкции языка DBML - расширения языка HTML, дополненного средствами доступа к БД через ODBC. Документы на языке DBML обрабатываются на серверной части, в результате чего создается HTML-документ.
Пакет может эффективно использоваться в качестве обработчика запросов WWW к исходным базам данных или информационному хранилищу.
ColdFusion от Macromedia в большей степени чем РНР различает страницы с кодом и HTML-страницы. В HTML-страницах могут быть дополнительные теги, вызывающие функции ColdFusion. В ColdFusion доступны несколько стандартных функций, и разработчики могут создавать собственные функции как расширения. ColdFusion был первоначально написан для Windows, но теперь доступны версии и для Unix. Интерпретатор ColdFusion встроен в веб-сервер.
ActiveX - технология Microsoft, предназначенна для написания сетевых приложений. Она предоставляет программистам наборы стандартных библиотек, значительно облегчающих процесс кодирования. Если раньше при написании программ использовались механизмы OLE (OLE Automation, OLE Documents, OLE Controls,...), основанные на компонентной объектной модели (COM - Component Object Model), то теперь библиотеки OLE переписаны так, чтобы обеспечивать функциональность, достаточную для написания сетевых приложений. Таким образом, теперь при написании программ используется DCOM (Distributed Component Object Model) - распределенная компонентная объектная модель, а реализуют ее библиотеки ActiveX, которые по объему оказались гораздо меньше, чем библиотеки OLE, а по скорости - быстрее. Сохранилась и совместимость - любой программный компонент OLE будет работать с библиотеками ActiveX.
Все технологии OLE и ActiveX, построены на основании, обеспеченном СОМ. СОМ - определяет стандартный механизм, с помощью которого одна часть программного обеспечения предоставляет свои сервисы другой и который работает во всех описанных выше случаях. Общая архитектура сервисов в библиотеках, приложениях, системном и сетевом программном обеспечении позволяет СОМ изменить подход к созданию программ.
В начале 1996 года Microsoft ввела в оборот новый термин ActiveX. Поскольку самым динамично развивающимся направлением в компьютерной индустрии является Internet, именно здесь наиболее естественно могут найти свое место программы, написанные с использованием технологии ActiveX. Не случайно в последнее время понятия ActiveX и Internet часто встречаются рядом. В то же время технология ActiveX имеет значительно более универсальную область использования.
Стандарт ActiveX позволяет программным компонентам взаимодействовать друг с другом по сети независимо от языка программирования, на котором они написаны. С помощью ActiveX можно "оживить" страницы Web эффектами мультимедиа, интерактивными объектами или сложными приложениями.
ActiveX включает в себя клиентскую и серверную части, а также библиотеки для разработчика: программные элементы ActiveX - компоненты, работающие на компьютере-клиенте, но загружаемые в первый раз с сервреа Web. С их помощью можно демонстрировать разнородную информацию, включающую видео и звук без запуска дополнительных программ. Более того, эти программные компоненты могут использоваться в приложениях, написанных на любых популярных языках программирования, включая Java (Visual J++), Visual Basic, Visual C++.
Active Scripting поддерживает любой популярный макроязык, включая Visual Basic Script и JScript (реализация компанией Microsoft языка сценариев JavaScript). Макроязыки могут использоваться для объединения на одной странице нескольких программных элементов ActiveX или Java, обеспечивая их взаимодействие между собой.
Документы ActiveX позволяют открыть и обрабатывать в окне Microsoft Internet Explorer документ любого формата (например, файл Microsoft Excel или Word).
Виртуальная машина Java позволяет любой программе просмотра Internet, поддерживающей технологию ActiveX (например, Internet Explorer 3.0) выполнять программные компоненты Java и обеспечивать их взаимодействие с программными компонентами ActiveX.
ActiveX Server Framework обеспечивает серверные функции ActiveX, включая поддержку безопасных соединений, доступ к базам данных и другие.
Средства разработки позволят использовать знакомые системы программирования Microsoft и других фирм для создания компонентов ActivX. К их числу относятся Visual Basic, Visual C++, Macromedia Shockwave, Adobe Photoshop, Borland Delphi, средства программирования Sybase и другие.
Основные преимущества использования технологии ActiveX:
Быстрое написание программного кода. Программирование сетевых взаимодействий становится очень похожим на программирование для отдельного компьютера.
Открытость и мобильность. Спецификации технологии недавно были переданы в Open Group как основа открытого стандарта. Кроме того, Microsoft совместно с компаниями Metrowerks и Bristol заканчивает реализацию технологий ActiveX для платформ Macintosh и UNIX.
Возможность написания приложений с использованием знакомых средств разработки. Программные элементы ActiveX могут быть созданы с помощью Visual Basic, Visual C++, Borland Delphi, Borland C++, любых средств разработки на Java.
Большое количество уже существующих программных элементов ActiveX, которые бесплатно могут применяться на серверах Web и в приложениях независимых разработчиков. Кроме того почти любой программный компонент OLE совместим с технологиями ActiveX и может применяться без модификаций в сетевых приложениях.
Технология ActiveX основана на широко используемых стандартах Internet (TCP/IP, HTML, Java) с одной стороны и стандартах, введенных в свое время Microsoft и необходимых для сохранения совместимости (COM, OLE).
Клиентская технология ActiveX (Active Desktop) реализуется на машине-клиенте с помощью библиотек, поставляемых вместе с Internet Explorer 3.0. В дальнейшем эти библиотеки будут дополняться и переписываться, в частности, наиболее значимые обновления этих библиотек на клиенте следует ожидать после выхода NetShow, продукта, предназначенного для оптимальной передачи по сети данных мультимедиа.
Программные компоненты ActiveX могут быть установлены автоматически на компьютер пользователя по сети с удаленного сервера, причем будет загружен код, подходящий для конкретной платформы клиента, будь то Macintosh, Windows или Unix.
Разработчик Web-страниц может либо сам запрограммировать элементы ActiveX, используя популярные языки программирования Visual C++, Visual Basic или Java, либо использовать существующие.
Используя языки сценариев ActiveX, программисты могут обеспечить взаимодействие различных элементов ActiveX, Java, других программ на клиентском компьютере и различных частей самого Internet Explorer. Например, программный элемент синхронизации может обновлять страницу Web через определенные промежутки времени. Можно также периодически запускать программный элемент, привлекающий внимание пользователя. Имеются реализации Visual Basic Scripting Edition, являющегося подмножеством Visual Basic, и JScript. Кроме того, разработчик может написать интерпретатор собственного языка сценариев и добавить его в систему.
С ActiveX Documents знаком каждый, кто работал с составными документами. С помощью Internet Explorer можно работать, например, с таблицами Microsoft Excel и файлами других офисных приложений. Это делает программу просмотра универсальным средством, способным не только отображать файлы в формате HTML и осуществлять переходы по ссылкам, но и поддерживающим работы с документами любых приложений и даже запуск программ.
Серверная технология ActiveX (Active Server) реализована с помощью Microsoft Internet Information Server 3.0. С помощью ActiveX можно писать программы на языках сценариев (сейчас это VBScript), выполняющиеся на сервере. Если раньше разработчикам приходилось использовать такие средства, как Microsoft Visual C++ для написания динамически загружаемых библиотек, использующих специальные вызовы Internet Server API, то теперь возможно написание приложений на языке сценариев. Это существенно упрощает разработку, сокращает время написания программы и минимизирует затраты. Программы, основанные на технологиях Active Server на порядок производительнее программ, основанных на Common Gateway Interface (CGI). Это достигается оптимизацией процессов ActiveX на сервере, учитывающей архитектуру Windows NT.
С помощью языков сценариев на сервере можно осуществлять доступ к системам управления базами данных, поддерживающим стандарт ODBC, и использовать механизм транзакций.
Поскольку подход к использованию технологий ActiveX на сервере стандартизован, программисты могут не только разрабатывать приложения, способные выполняться на серверах, но и реализовывать свои схемы взаимосвязи серверных приложений и сервисов, создавать собственные интерпретаторы серверных языков сценариев. Для этого требуется предварительное приобретение лицензии у Open Group.
1.1.2.3. Поддержка состояния
HTTP - это протокол без сохранения состояния, он определяет, как веб-клиенты и серверы общаются друг с другом, чтобы предоставлять пользователям документы и другие ресурсы. К сожалению, HTTP не обеспечивает прямой способ идентификации клиентов, чтобы отслеживать их при запросе нескольких страниц. Однако есть способы отслеживать пользователей непрямыми методами.
Веб-разработчики называют отслеживание пользователей поддержкой состояния. Ряд взаимодействий определенного пользователя с нашим сайтом - это сессия. Информация, которую мы собираем для пользователя, это информация сессии. Возьмем онлайн-магазин: чтобы покупатели могли просматривать продукты, добавлять что-то в корзину и затем расплачиваться за все выбранное, сервер должен обеспечить каждому пользователю собственную корзину. В этом случае сбор отдельных элементов из информации приветствуется.
Можно добавить идентификатор в строку запроса или как дополнительную информацию внутри URL-документа. Когда пользователи перемещаются по сайту, CGI-приложение на лету генерирует документы, передавая идентификатор из документа в документ. Это позволяет нам отслеживать все документы, запрошенные каждым пользователем, и порядок, в котором они были запрошены. Браузер посылает эту информацию нам через строку статуса.
Скрытые поля форм позволяют встраивать «невидимую» информацию в виде имя-значение в формы так, чтобы пользователь не увидел ее, не посмотрев исходный код HTML-страницы. Как и обычные поля форм и значения, эта информация посылается CGI-приложению, когда пользователь нажимает кнопку отправки.
Все современные браузеры поддерживают cookie на стороне клиент что позволяет хранить информацию на машине клиента и перед ' вать ее обратно на сервер при каждом запросе. Можно использовать эту технологию для хранения данных на стороне клиента, которы будут доступны нам, когда в дальнейшем пользователь запросит ресурсы с сервера. Cookie посылаются обратно клиентом в строке заголовка HTTP Cookie.
Обычно cookie на стороне клиента - это самый мощный способ поддержки состояния, но он требует что-то и от клиента. Другие технологии работают независимо от клиента, но у обеих есть ограничения на количество страниц, которые можно отследить.
Системы управления контентом (Content Management Software - программное обеспечение для управления содержимым сайта) позволяют легко создать базовый Web-проект, а Web-интегратор получает возможность развернуть масштабный проект в приемлемые сроки.
Во времена, когда системы управления контентом практически не применялись разработка очередного Web-проекта была сопряжена с созданием кода разметки каждой страницы и тяжелым программированием и интеграцией графического оформления в каждую страницу. Процесс занимал огромное количество времени.
Современные системы управления контентом снимают необходимость постоянного программирования. Достаточно выбрать готовый модуль, из тысячи ранее созданных и протестированных. Интеграция в систему не займет много времени, так как все дополнения делаются по единому стандарту.
Начало развитие Web-среды можно обозначить серединой 90ых г. Этот период характеризовался относительно невысоким уровнем развития Web-технологий, а многие динамические Web-проекты могли создаваться только программистами.
Вся динамика реализовывалась через CGI и другие сложные технологии, поэтому обычной пользователь, создающий собственный проект, мог рассчитывать только на статичный базовый проект масштаба сайта и не более того. Такой сайт обычно представлял собой набор статичных HTMLстраниц, подготовленных в WYSIWYG1 HTML редакторах, которые начали появляться примерно с середины 1995 года. После набора, страницы объединялись ссылками (для осуществления возможности межстраничных переходов) и размещались на сервере. Вся работа по обновлению информации и проверке работоспособности проекта перекладывалась на его автора. Так, например, если требовалось изменить ссылку на странице, автор должен был найти эту страницу среди остальных, затем внести в нее изменения и снова загрузить страницу на сервер. Если же требовалось не просто изменить существующую страницу, а добавить новую, то приходилось также решать вопросы, связанные с логическим и физическим внедрением последней в весь проект. И если объем страниц возрастал, то «справляться» с ними становилось еще сложнее. А изменять и расширять динамические проекты было еще более проблематично.
Такое положение длилось относительно недолго, и в дополнение к статичным HTMLстраницами CGI программированию появились более «дружественные» технологии ASP (конец 1996 г.), ColdFusion (июнь 1995 г.), а позже и PHP (2ая версия вышла в 1997 г.). Новые технологии позволили совместить разметку HTMLстраниц и несложный программный код, сделав тем самым пассивные HTMLстраницы активными. Активность последних позволила легко организовать интерактивное взаимодействие с пользователями, ведь каждый раз при обращении к одной и той же активной странице пользователь мог получать новые данные. В то же время стали создаваться активные страницы для автоматизации определенных действий, например, процесса загрузки файлов на сервер или же процесса создания новых страниц. Такие полезные страницы постепенно собирались во вспомогательные пакеты. Подобные пакеты применялись в типовых задачах, однако их возможностей не всегда хватало и многие клиенты предпочитали заказывать индивидуальные системы управления под свой собственный проект. Эти заказные системы изначально не были универсальными когда требовалось изменять либо расширить их функциональность, заказчику приходилось снова обращаться к разработчикам. Вскоре и сами разработчики пришли к решению о необходимости создания универсальных систем. Таким образом и появились первые универсальные коммерческие системы управления.
Дальнейшая эволюция CMS привела к системам управления Web-проектом. Сейчас системы управления это не только удобная оболочка-менеджер для пользователя, но и мощный инструмент для Web-разработчика Благодаря таким системам, все реже возникает необходимость в разработке Web-проектов «с нуля» подготовленному пользователю или интегратору достаточно просто выбрать, установить и настроить существующую систему, чтобы быстро и без дополнительных финансовых затрат получить приемлемый результат профессионального уровня.
К пользователям систем управления можно причислить всех тех, кто хоть как-то с ними взаимодействуе.
Посетители это самая многочисленная и самая значимая группа пользователей. Без них любой проект перестал бы развиваться (а возможно и вообще существовать), поэтому за их внимание и ведется столь жесткая борьба. Посетитель, он никогда не вникает в технические подробности ему абсолютно безразлично, на базе какой системы управления функционирует разрабатываемый проект, ему важен результат информация и способ ее получения. Систему управления посетитель не видит в таком виде, в каком ее видят доверенные участники проекта, вся система для него это страницы с материалами, навигационные элементы, формы обратной связи, подсказки и т.д., но не более того. Посетитель это типичный потребитель, и чем проще и быстрее интересная информация «извлекается» из вашего проекта, тем меньше он задумывается о других, альтернативных проектах. Поэтому недостаточно создать удобный и хорошо настроенный проект, необходимо также позаботиться и о его содержании оно должно быть интересным и актуальным, так вы сможете привлечь больше посетителей.
Контент-менеджеры, модераторы, редакторы, администраторы это доверенные лица, которым делегирован набор дополнительных прав. Пользователям такого уровня система управления представляется в расширенном виде к интерфейсу системы добавляются дополнительные элементы управления или целые административные разделы. В таких разделах администратор может легко и быстро добавлять например новых пользователей, а модератор может вносить правки в оставленные посетителями сообщения и делать другие разрешенные администратором действия.
программисты и интеграторы - пользователи cms «как продукта».
Рассмотрим два типа классификации CMS.
1) Классификация по степени открытости. Многие пользователи уже успели попробовать такие продукты как OpenOffice, Firefox, Linux, а также другие известные программы и системы, которые распространяются не просто бесплатно, но и с открытыми исходными кодами, что означает, что каждый желающий может вносить изменения в исходный код таких программ и даже распространять их в модифицированном виде, оказывать помощь и объединяться с другими участниками по идейным интересам.
Рассмотрим основные достонства открытых систем.
Главным преимуществом открытых продуктов является их доступность открытый продукт можно не только свободно получать, но и быстро обновлять, ведь новые версии таких продуктов выходят с завидной регулярностью, а исправление найденных ошибок не выливается в очередное ожидание заплаток или сервиспаков, как это обычно происходит с коммерческими решениями. Открытые продукты предоставляют свободу выбора и действий, а также дают возможность с минимальными издержками осуществлять миграцию с одного решения на другое, если существующее не удовлетворяет требованиям заказчика.
Открытые продукты благодаря заимствованиям стороннего открытого кода, а также взаимоподдержке развиваются порой быстрей своих коммерческих конкурентов. Благодаря свежим идеям и неустанной поддержке со стороны сообщества, открытые продукты способны не только конкурировать с коммерческими решениями, но и занимать доминирующие позиции на рынке. Примечательно, что сейчас уже и коммерческие разработчики присоединились к подобной инициативе многие из них уже включают в состав своих продуктов открытые решения.
Любой желающий, от простого пользователя до программиста, может стать участником открытого проекта, ведь большим интернациональным открытым проектам всегда требуются локализаторы (переводчики), тестировщики и другие специалисты.
Программист / организация, выбирая за основу открытые решения, избавляет себя от необходимости подстраивания под чужой корпоративный «черный ящик». Также из открытого продукта можно позаимствовать новые и / или интересные идеи, что не только не запрещается, а даже приветствуется. Открытые проекты и продукты практически всегда ориентируются на стандарты, а не идут вразрез с ними. Это значительно упрощает процесс доработки продукта, а также гарантирует совместимость с другими продуктами, поддерживающими стандарты.
Любой специалист в своей области, получая исходные тексты открытых программ, имеет возможность провести анализ продукта и вынести свое заключение относительно его надежности, безопасности, совместимости и т.д.
Открытый продукт можно «пересобрать» с учетом своих собственных требований и тем самым получить максимальный результат.
Все продукты можно разделить на две группы. В первую группу следует отнести все открытые продукты, во вторую коммерческие и бесплатно распространяемые продукты.
2) Классификация по разработчику системы. В роли разработчика может выступать как открытое сообщество со своими идейными лидерами, так и целая коммерческая организация с серьезным штатом сотрудников. Для удобства отнесем проекты сообществ к первой группе, а проекты организаций, соответственно, ко второй. Для того чтобы понять, чьи продукты все же лучше, следует рассмотреть типичные сценарии появления новых CMS и других систем.
В мире существует довольно много свободных профессионалов, ценящих свой труд и свободу. Они никогда не соглашаются на роль эксплуатируемого звена, они предпочитают самостоятельно находить заказы и работать без посредников (а для больших проектов даже собирать целые команды) и, как результат, получать за свой труд достойное вознаграждение. В своем большинстве это идейные лидеры, которые не желают мириться с текущим положением вещей. Так или иначе, но в своей практике им приходится применять различные «решения» (готовые идеи и продукты). Со временем они понимают, что существующие решения обладают рядом недостатков (ограниченная функциональность, закрытость и т.д.) либо малопригодны в среде новых технологий, и тогда они берут на себя смелость создать нечто новое и более доступное. Так появляется новая идея. После воплощения задуманного, на свет появляется и «решение», пока еще, возможно и сырое, но уже перспективное. Далее автор принимает решение сделать все наработки общедоступными так открывается новый проект. Это приводит к тому, что в скором времени, у проекта, появляются и свои последователи образуется сообщество. Именно благодаря сообществу и его мощной поддержке в дальнейшем, все последующие «решения» будут эволюционировать (идея при этом останется неизменной). Как итог: уже через несколько лет полностью готовое и стабильное «решение» начнет вытеснять коммерческие продукты, а новый проект превратится в достояние сообщества.
Ко второй группе были отнесены коммерческие системы. Системы такого класса разрабатываются преимущественно Web-студиями и крупными интеграторами. Многие из ныне существующих коммерческих систем зародились в периоде между 1999 г. и 2003 г. именно тогда начали стремительно появляться все популярные на данный момент Web-студии, которые в первые годы своего существования и стали создавать собственные системы управления.
Современная CMS должна позволять, не прибегая к дополнительному программированию, выполнять: редактирование содержимое страниц, включая добавление, удаление графики; добавление новых страниц; изменение структуры сайта и различных мета данных; настройку регистрационных форм; управление опросами, голосованиями и форумами; вывод статистики посещений; распределение прав по управлению сайтом среди пользователей и др.
Далее, приведем основные CMS.
2z project - предназначенная для создания новостных сайтов или блогов. Бесплатный аналог DataLife Engine (DLE). Система появилась совсем недавно, но, даже не смотря на это, она является очень мощным инструментом в создании веб-сайта. 2z project превосходит DLE, по огромному количеству настроек, по удобству административной части. Административная часть системы не перегружена огромным количеством графических элементов, благодаря чему управление системой ускоряется (особенно не для пользователей широкого канала связи).
Drupal (drupal.ru) является универсальной для создания сайта любой сложности. В стандартную поставку скрипта входит не большое количество модулей, но их будет вполне достаточно, что бы построить полноценный сайт, при чем любой направленности, будь то новостной портал или домашняя страница.
Etomite это бесплатная система управления сайтом, имеющая много функций. В системе имеется модуль генерации мета тегов, если ваш сервер поддерживает работу файла .htaccess, то у вас есть возможность включения модуля SEO Friendly URL. В системе так же используется такая технология как AJAX. Для создания сайта на Etomite достаточно базовых знаний HTML, времени на интеграцию дизайна уйдет немного.
HostCMS это бесплатная система управления сайтом, предназначенная для создания веб-сайтов любой направленности (от сайта визитки до интернет магазина), без особых знаний php, HTML и css. Требования хостинга для работы системы довольно, малы, работает на любом shareware хостинге, только обязательным требования является наличие Zend Optimizer. Не смотря на такой богатый потенциал системы, она довольна, легка в управлении, для управления не понадобятся даже знания HTML, а вот для создания веб-сайта на HostCMS уже понадобятся хотя бы начальные знания HTML и css, для более глубокого изучения системы уже понадобятся знания xsl программирования.
Joomla это бесплатная система управления контентом, написанная на языке PHP и использующая в качестве хранилища содержания базу данных MySQL. Joomla является свободным программным обеспечением, защищённым лицензией GPL. Одной из главных особенностей «Joomla» является относительная простота управления при практически безграничных возможностях и гибкости при изготовлении сайтов. Название «Joomla» фонетически идентично слову «Jumla», которое в переводе с языка суахили означает «все вместе» или «единое целое».
CMS Joomla включает в себя различные инструменты для изготовления веб-сайта. Важной особенностью системы является минимальный набор инструментов при начальной установке, который обогащается по мере необходимости.
В состав к обеспечению Joomla входят огромное количество различных расширений, модулей, компонентов позволяющих решить практически любую задачу:
легкая смена шаблона, нет ни какой привязанности к определенному шаблону. Шаблоны легко меняются как для пользовательской части, так и для административной части;
веб-сайты от простых до сложнейших корпоративных;
формы регистрации, различные способы e-mail связи, ISQ коммуникации, форумы, чаты;
интернет телефония, видео чаты и конференции и т.п.;
выполнить любую медийную функцию фото, видео, аудио галереи, презентации, флеш эффекты и т. д.;
обеспечивает многопользовательскую работу с новостями, статьями и статичными материалами позволяет построить полнофункциональное средство массовой информации в интернете;
создать современный коммерческий сайт, интернет магазин с сотнями категорий и тысячами товаров, системами поиска и сортировки, расчетом скидок и стоимости доставки десятками способов, приёмом платежей в десятках валют, практически любыми электронными платежами, sms, кредитными картами, банковскими квитанциями;
мультиязычность, сайт может поддерживать сразу несколько языков;
многоуровневая система регистрации пользователей и распределения прав между ними.
Joomla является одной из самых мощных систем портального типа, огромное количество модулей поставляемых в дистрибутиве будет достаточно что бы без проблем запустить сайт.
Для работы Joomla на хостинге требуется наличие php, MySQL и модуля mod rewrite. Из - за большого количества расширений, при большой посещаемости может потребоваться более мощный сервер (хостинг провайдер).
В плане интеграции дизайна, Joomla довольно проста, сам процесс не сложный, но довольно длительный из - за большого количества стилей в css файле. Система не будет сложна даже новичку.
Limbo это бесплатная система управления сайтом из семейства joomla, но в отличии от joomla она работает на текстовых файлах, т.е. без базы данных MySQL. Система, конечно же, уступает по функционалу joomla, но, не смотря на это на ней можно сделать не плохие сайты, со своей задачей она справляется отлично. Огромным плюсом этой системы является работы ее на текстовых файлах, это будет особенно полезно у кого нет большого количества баз данных на хостинге. Конечно, большую посещаемость выдержать она не сможет, но при посещаемости до 1000 уникальных посетителей она будет работать отлично, даже на дешевом хостинге. Limbo отлично подойдет начинающему вебмастеру.
LinkorCMS - бесплатная модульная система управления сайтом, работающая на текстовых файлах или MySQL. Система изначально разрабатывалась как легкая, простая в установке и управлении, а так же гибкая и быстрая работе, что не мало важно при создании сайтов на шаред хостинге. Система довольно легко расширяема, разработка шаблона не занимает много времени, а управление контентом не составит труда даже тому, кто мало знаком с работой сайтов. LinkorCMS подходит для создания сайта небольшого портала, домашней странички или сайта визитки фирмы. Основные предустановленные модули: лента новостей; страницы; опросы; гостевая книга; архив файлов; статьи; фотогалерея; пользователи; многоуровневые (древовидные) комментарии; настраиваемые формы обратной связи; модуль обратной связи; рассылки; поиск; форум; модуль управления базой данных; аудит; управление КЭШем.
Системные требования:
Операционная система Linux/Unix или Windows.
Сервер с поддержкой PHP 5 >= 5.2.0.
Желательно: MySQL любой версии, GD, MbString, Iconv.
Modx это бесплатная система управления сайтом созданная по стандартам W3C с использованием технологии Ajax. Система Modx поправу имеет большое количество модулей для удобства продвижения сайтов. Modx является именно конструктором сайтов, потому что на основе ее можно создать любой сайт.
mxBB это бесплатный модуль для создания портала на основе популярного скрипта форума phpBB. Скрипт прост в установке, в него интегрируется почти любой дизайн, имеется большое количество модулей для расширения функциональности, общая админка с форумом. Требования к хостингу минимальны, достаточно наличие php и какой-либо базы данных. Если у вас есть форум и вы хотите без проблем создать свой портал, при этом сохранив структуру форума и всех пользователей то mxBB именно, то, что вам надо.
Nucleus CMS это бесплатная CMS для создания новостного сайта или блога. Nucleus CMS является одной из систем поддерживающий возможность создания нескольких сайтов на одном скрипте, т.е. теперь вам не придется ставить на каждый свой сайт отдельно скрипт, а достаточно будет залить Nucleus CMS на один сайта, а остальные сайты сделать алиасами основного, далее система сама разберется, кого и куда направлять. Помимо мультисайтовости в системе предусмотрена гибкая система раздачи прав доступа пользователям.
PHP-Fusion это бесплатная система управления сайтом написанная на языке php и использующая в качестве базы данных MySQL, проста как в установке, так и в управлении. PHP-Fusion отлично подойдет как для сайтов визиток, так и для сайтов порталов, благодаря довольно богатому функционалу (стандартный набор почти любой системы + кое - что добавлено) и большому количеству модификаций, которые можно скачать наофициальном сайте системы. PHP-Fusion это система из серии поставил (выбрав дизайн из огромного количества) и используешь.
PHPShop CMS бесплатная система управления сайтом. Конечно же, полного функционала нам не дают, но встроенных модулей вполне хватит, что бы создать не сложный сайт с минимальными усилиями.
PHPShop CMS имеет удобный и интуитивно понятный интерфейс, в котором управление сайтом сводится к минимуму, вам не потребуется привлекать к работе сайта ни программистов, ни HTML верстальщиков.
В поставку системы входят модули: новостей; от сайта визитки до интернет магазина отзывов; рассылки; баннерной сети; ссылок; опросов и др.
ReloadCMS - бесплатная CMS написанная на языке программирования PHP, использующая для хранения информации текстовые файлы. Отличная не сложная система управления сайтом, имеющая довольно богатый функционал, уже в стандартной поставке имеется все, что надо для запуска веб-сайта, например: новостная лента; гостевая книга; мини чат; файловый архив. ReloadCMS подойдет для не сложного сайта любой направленности.
Run CMS - это бесплатная система управления сайтом портального типа с огромным количеством модулей. Система может использоваться для веб-сайта любой сложности, система проста в установке и управлении, особых знаний для работы с системой не требуется, для интеграции дизайна в систему потребуется средние знания HTML и css. Благодаря различным модулям, таким как gzip сжатие и кэширование страниц, нагрузка на сервер будет минимальна. Для работы Run CMS на хостинге потребуется наличие php и базы данных MySQL.
Seditio это бесплатная система управления сайтом написанная на php, может быть использована для сайтов многой направленности. Собственно Seditio (бывшая LDU) мало, чем отличается от аналогичных скриптов, система проста в управлении, масштабируема благодаря наличию большого количества плагинов, имеется большое сообщество по поддержке скрипта. Даже на основе стандартной поставки вы сможете создать полноценный сайт, все нужные модулю уже включены.
Довольно важными фактами является легкая интеграция дизайна в систему, быстрота генерации страниц и маленькая нагрузка на сервер, что дает возможность установки на недорогой или вовсе бесплатный хостинг.
sNews это скрипт бесплатной системы управления сайтом, очень простой в установке, настройке и интеграции дизайна Скрипт позволит создать не большой новостной сайт или сайт визитку, для порталов sNews не предназначена, но со своей задачей система справляется отлично.
Если нужна система для простеньких сайтов или для сайтов сателлитов, то sNews рекомендуется.
Textpattern это бесплатная система управления сайтом, для разработки сайтов любой сложности. От блога до корпоративного сайта.
Система по праву можно назвать конструктором сайтов, изначально существует несколько версий для определенных задач, а в более менее умелых руках из этой системы можно сделать все что угодно.
Wordpress это бесплатная система управления сайтом, основной задачей которой является, организация блога. Wordpress по сути очень узко специализирован, что делает его крайне пригодным для блогов, даже в стандартной комплектации он имеет все необходимое, что бы вы смогли сразу после установки начать публиковать свои заметки. С момента создания этой системы в 2003 г. было разработано огромное количество модулей, которые позволяют безгранично расширять функционал сайта и делать его более удобным для ваших посетителей и более удобным в плане управления и продвижения.
Еще огромным плюсом системы является наличие большего количества бесплатных шаблонов.
XOOPS это бесплатная система управления сайтом разработанная для различных сайтов, от сайта визитки до большого портала. XOOPS отличное решение для создания динамических сайтов, этот скрипт позволяет без проблем работать с любым количеством контента и с любым количеством посетителей, и все это благодаря отлично оптимизированному коду. XOOPS отлично подойдет и тем кто собирается сделать свою домашнюю страничку, и тем кто хочет сделать большой информационный портал.
Дизайн в систему интегрируется довольно просто, хотя даже на этот случай имеется огромная база уже готовых шаблонов, от вас потребуется минимум знаний фотошопа, что бы просто вписать свое название сайта.
KasperCMS программа, с помощью которой сайтом может управлять обычный пользователь без специальных знаний (создавать, редактировать и удалять разделы и страницы, текст, изображения, товары, новости и т.д.). KasperCMS - это удобная, интуитивно понятная и надежная система администрирования сайта. KasperCMS построена по модульному принципу, т.е к базовой поставке (основные возможности, необходимые для функционирования сайта) могут подключаются дополнительные модули и функции.
KasperCMS имеет открытый исходный код.
Возможности базовой поставки системы управления сайтом: управление структурой сайта; управление настройками сайта;управление администраторами; добавление разделов и страниц сайта (неограниченное количество) управление содержимым страницы при помощи текстового редактора (работа с текстом, изображениями, таблицами на подобии работы с MS Word+поддержка редактирования HTML-кода); возможность хранения изображений на диске и в базе данных; возможность скрытия страниц в визуальной части сайта без удаления страницы; возможность скрытия страниц сайта в меню; форма обратной связи и управление ее настройками; дружественные URL (ЧПУ) (автоматическое создание дружественных URL (ЧПУ) с возможностью ручного редактирования); модуль "карта сайта.
Подключаемые стандартные модули: новости, рассылка, импорт rss, экспорт rss, каталог продукции, новинки и хиты, сортировка по продукции, форма заказа, форма заказа с корзиной, менеджер файлов, фотогалерея, статьи, комментарии, вопрос-ответ, отзывы, вакансии, опросы, поиск по сайту,,версия для печати, авторизация/регистрация, кабинет пользователя, форум
Преимущества: интуитивно понятный интерфейс; ориентированность на простого пользователя компьютера (не программиста); наличие SEO-настроек для всего сайта и отдельных страниц; простой, понятный и функциональный визуальный редактор; автоматическое обновление элементов навигации; расширенные возможности для продвинутых пользователей; поддержка мультиязычных веб-сайтов; применение технологии Drag & Drop (перетащи и брось); широкое применение технологии Ajax; высокая скорость работы; расширяемость; масштабируемость; высокий уровень безопасности.
Технологии: веб-сервер Apache 2, СУБД MySQL 5, PHP 5, AJAX.
Lotus QuickPlacehttp - решение от IBM/Lotus, надстройка над знаменитыми продуктами Lotus Notes & Domino. Предназначена для создания небольших сайтов, организации коллективной работы и создания виртуальных офисов. Предоставляемые системой богатые возможности импорта документов и конвертации их в HTML. В том числе и из MS Word. К недостаткам следует отнести достаточно жесткую функциональность и структуру сайта, ограничения в выборе дизайна. Кроме того, при выборе этой системы следует иметь в виду, что ее стоимость включает стоимость серверной и клиентской части базовых продуктов. Это решение стоит использовать компаниям, для которых важны удобство и надежность групповой работы над публикациями. В описании особенностей системы на сайте сделан упор на возможность мгновенной организации виртуальных офисов. Серьезным плюсом при выборе Lotus QuickPlace будет уже сформированная инфраструктура рабочих мест на платформе Lotus Notes и отсутствие требовательности к дизайну.
CimWebCenterhttp - продукт украинской компании CiM. Предназначен для разработки и сопровождения как небольших веб-сайтов, так и крупных корпоративных и информационных порталов. Система позволяет разграничивать права доступа к разделам сайта между членами административной группы. Имеет возможность редактирования данных как во встроенном WYSIWIG HTML-редакторе, так и в любых внешних редакторах, например: Frontpage, Dreamweaver, HotDog, включая MS Word. Удобный эргономичный интерфейс напоминает традиционный «Проводник» Windows. Позволяет управлять структурой сайта, копировать и перемещать отдельные объекты и папки с публикациями. Шаблоны настраиваются на любой вариант дизайна. Имеется возможность использования большого количества встроенных функций API, а также расширения функциональности за счет функций собственной разработки. CimWebCenter использует наиболее распространенную среди провайдеров хостинговых услуг платформу. Существует в инсталляциях для FreeBSD, Linux, Windows NT/2000. Использует веб-сервер Apache и PHP. В качестве СУБД применяется MySql.
UlterSuitehttp - российская система, важными достоинствами которой является отсутствие ограничений на дизайн и полная совместимость с версиями браузеров (IE, NN, Opera). Использует технологии JAVA, благодаря которой является кросс-платформенной, с SQL-серверами работает через JDBC.
DynaSitehttp - продукт российской компании «Рексофт», предназначен для разработки и сопровождения сайтов любой сложности, имеет компонентную структуру. В требованиях к программному обеспечению обозначена операционная система Windows NT/2000; может использовать любой поддерживающий CGI, ISAPI или NSAPI веб-сервер; из СУБД работает с Sybase Adaptive Server или MS SQL Server. Обратите внимание на то, что система требует использования специального сервера приложений ColdFusion 4.x и более поздних версий.
Q-Publishing 6.0 - продукт компании Quantum Art. Разработчики обещают рекордно короткие сроки создания сайта. Имеется возможность формирования неограниченного числа групп, члены которых будут выполнять определенные обязанности и обладать различными правами при создании, форматировании и доставке динамического контента. Система разработана на основе технологии ASP и базы данных MSSQL. Операционная система, конечно, Windows NT/2000.
1С-Битрикс - профессиональная система управления веб-проектами: сайтами компаний, интернет-магазинами, социальными сетями и сообществами, корпоративными порталами, системами аренды веб-приложений и другими проектами. Продукты «1С-Битрикс» работают на Windows и Unix платформах под управлением PHP и ASP.NET и подходят по функциональным возможностям для 95% современных проектов. Продукты объединяет главная цель - обеспечить понятное, удобное, комфортное и при этом профессиональное управление проектом как для конечного пользователя, так и для разработчика.
Web -сервер это сервер, принимающий HTTPзапросы от клиентов. Обычно в роли клиентов выступают Web-браузеры, и выдающий им HTTPответы, вместе с которыми передаются HTMLстраницы, изображения, файлы, медиа-потоки или другие данные. Web-серверы являются основой Всемирной паутины.
Фактически Web-сервером называют как программное обеспечение обеспечивающее все вышеперечисленные действия, так и компьютер, на котором это программное обеспечение работает. Клиенты получают доступ к Web-серверу по средствам единого указателя ресурсов URLадресу нужной им Web-страницы или другого ресурса располагаемого на сервере.
Единый указатель ресурсов (англ. URL Uniform Resource Locator) это единообразный локатор (определитель местонахождения) Web-ресурса. URL применяется для обозначения адресов почти всех ресурсов Интернета. Стандарт URL закреплён в документе RFC 1738. Сейчас URL позиционируется как часть более общей системы идентификации ресурсов URI, сам термин URL постепенно уступает место более широкому термину URI. Текущая структура и синтаксис URI регулируется стандартом RFC 3986, вышедшим в январе 2005 года. Многие новейшие технологии семантической паутины (например, RDF) базируются на стандарте URI. Сейчас ведущая роль в развитии URI принадлежит Консорциуму Всемирной паутины.
В настоящее время работает около 390 миллионов различных Web-серверов. Среди которых, самыми популярными являются: Apache HTTP-Server от компании Apache и IIS от компании Microsoft.
1.1.4.1. Apache HTTP Server
Apache был первой бесплатной альтернативой Web-серверу от Netscape Communications (в настоящее время известен как Sun Java System Web Server). Приложение доступно для установки на многих платформах, таких как: Unix, FreeBSD, Linux, Solaris, Novell NetWare, Mac OS X, Microsoft Windows и т.д. Apache распространяется как бесплатное программное обеспечение с открытым исходным кодом, что позволяет множеству разработчиков со всего мира участвовать в процессе доработки и выпускать дополнительные надстройки, выполняющие специфические, нужные для определенных целей, функции.
Web-сервер Apache имеет модульную структуру ядра, что помогает разработчику, определившись с целями проекта, использовать именно те средства разработки, которые он планирует, отключив все остальные возможности. Web-сервер поддерживает различные модули интерпретаторов, например: Perl, Python, PHP, TCL. Кроме этого веб-разработчик может использовать модули безопасности и криптографии. В Apache встроена поддержка аутентификации, реализован протокол шифрования SSL, имеется прокси-модуль и модуль создающий отчеты. Кроме этого в возможности веб-сервера входит подключение внешнего модуля сжатия GZIP.
Удобная конфигурация позволяет администратору использовать один Web-сервер для обслуживания нескольких узлов одновременно. В настоящее время Apache входит в комплекты поставки различных решений для производства, Например в Novell NetWare он является Web-сервером по умолчанию, как и в IBM WebSpere. Для организации собственных решений сервер используют Oracle и Borland. Apache также используют и для реализации других задач различной сложности. Одним из примеров является обмен файлов. Пользователь, на своем персональном компьютере устанавливает копию программы и помещая документы в определенную папку, делает их открытыми для всех остальных пользователей зашедших на страницу созданную его веб-сервером.
Анализируя данные за последние годы можно сделать вывод о том, что доля узлов работающих на Web-серверах Apache составляет 52% от числа всех ресурсов сети.
1.1.4.2. Microsoft Internet Information Services (IIS)
В основе IIS лежит полностью модульный Web-сервер, включающий более 40 компонентов, которые можно объединять в компактные Web-серверы, оптимизированные для необходимой роли в топологии приложения. Эти компоненты создаются на основе нового слоя расширяемости, что позволяет разработчикам расширять или замещать практически любую функцию сервера в машинном коде или с помощью Microsoft®.NET Framework. IIS предлагает расширяемость компонентов выполнения, управления и рабочих компонентов, облегчая создание комплексных решений в соответствии с конкретными потребностями.
Интерфейсы API для управления и диагностические компоненты делают процедуры развертывания, администрирования и устранения неполадок сервера значительно проще и удобнее.
Web-сервер IIS поддерживает несколько различных технологий создания Web-приложений: ASP.NET, ASP, CGI, ISAPI.
При помощи CGI и ISAPI к веб-серверу IIS могут подключаться сторонние средства поддержки Web-приложений, например, PHP и Perl.
Одним из интересных и перспективных нововведений в IIS является пакет IIS Media Pack. Два дополнительных бесплатных модуля позволят превратить We b-сервер в современный инструмент медиа-вещания. Новые технологии Microsoft позволяют оптимизировать и грамотно управлять цифровым потоком медиа-данных. Сервер позволяет производить вещание данных в форматах: ASF, AVI, FLV, M4V, MOV, MP3, MP4, RM, RMVB, WMA, WMV.
Еще одним нововведением является встроенная поддержка новой технологии Silverlight, Silverlight 2 и Silverlight 3. Это новая технология представления данных в Интернете, предназначенной для запуска на различных платформах. Она позволяет создавать насыщенные, визуально привлекательные веб-страницы, работающие в различных обозревателях, устройствах и настольных операционных системах (например Apple Macintosh).
При разработке сайта или Web-приложения у разработчика часто возникают различные проблемы (например, вывод диагностических сообщений, неверная работа функций, поиск нужной функции или средства и т.п.). В решении этих проблем помогают поисковые средства Интернет. Например, можно задать в строке поиска текст “Строковые функции PHP” и Вы получите большой список страниц с описанием этих функций. Главное правильно сформулировать текст запроса на поиск, чтобы он макимально точно отражал то, что Вы ищете. В Интеренете много профессиональных разработчиков, которые готовы прийти к Вам на помощь в сложных случаях и поделиться своим опытом, умением и знаниями.
Описание Webстраниц (HTMLдокументов) на языке разметки гипертекстов HTML (Hypertext Markup Language) производится тегами или дескрипторами [2]. Тег имеет вид: <имя тега [атрибуты тега]> ... [</имя тега>] (угловые скобки указываются).
Атрибуры записываются в виде: <имя атрибута>[=”<значение>”]. В значениях вместо кавычек указываются апострофы. Форма записи свободная. Где допускается один пробел, можно указывать несколько пробелов. Браузер игнорирует их. Для вставки пробела используется неразрывный пробел в виде “ ”. Перенос (специального символа переноса нет) можно делать в любом месте, где допускается пробел. Пробелы указываются после имен тегов. Строчные и прописные буквы воспринимаются одинаково. Однако для совместимости с XNTML (SGML, XML) рекомендуется использовать строчные буквы. Длина строки и число тегов в строке не ограничены. Рассмотрим основные теги и их атрибуты.
<HTML> ... </HTML> начало и конец документа.
<HEAD> ... </HEAD> заголовочная часть документа.
<TITLE> ... </TITLE> название документа в строке заголовка браузера.
<BODY> ... </BODY> тело документа, выводимое на экран.
<DIV> ... </DIV> раздел документа с атрибутами форматирования. Допускается вложенность разделов.
<!-- ... //--> комментарии в коде HTML (могут занимать несколько строк).
<H1>...</H1> - <H6>...</H6> подзаголовки с уменьшением размера.
<BR> разрыв, который равнозначен символу возврата каретки.
<P>,<P> ... </P> обозначение абзаца, абзац с атрибутами абзаца.
<PRE> ... </PRE> предварительное форматирование текста.
<NOBR> ... </NOBR> строка без разрыва.
<B>...</B>, <STRONG> ...</STRONG> полужирный шрифт.
<I>...</I>, <EM> ... </EM> и <U>...</U> курсив и подчеркивание.
<BIG>...</BIG> увеличение размера текста относительно обычного.
<SMALL>...</SMALL> уменьшение размера текста.
<STRIKE>...</STRIKE> зачеркнутый текст.
Align атрибут выравнивания текста (в тегах DIV, P и др.): слева (Left), справа (Right), по центру (Center), по ширине (Justify).
Пример. <P ALIGN=“CENTER“>Текст по центру</P>
Text, Link, Alink, Vlink, Bgcolor, Background цвет текста и ссылки по умолчанию, цвет активной ссылки и после ее посещения, цвет фона, размещение фонового изображения (Background=”url”) соответственно.
Значение цвета может задаваться функцией RGB(r, g, b), именованными константами (136 констант) [см. пример из п.1.6.6) или числовыми шестнадцатеричными RGBконстантами вида #999999, где первые две цифры (от 0 до FF16) интенсивность красного, средние две цифры интенсивность зеленого и последние интенсивность синего цветов (BGCOLOR=“rgb(0,255,0)”, BGCOLOR=“#00FF00“, BGCOLOR=“green”).
<FONT> ... [</FONT>], <BASEFONT> текущий и умалчиваемый шрифт.
Атрибуты тега: Size (размер или приращение к умалчиваемому размеру, если указан знак плюс или минус), color (цвет), face (список названий шрифтов через запятую, в порядке убывания приоритета. Выберется из списка первый из существующих в браузере.
<UL>...</UL>,<OL>...</OL> маркированный, нумерованный список. Допускается вложенность списков.
<LI> элемент списка (<UL><LI> Иванов <LI> Петров </UL>) .
Value=”n” атрибут задает номер элемента списка.
<IMG src=“URL или имя файла с изображением“> вывод изображения.
<HR> вывод горизонтальной линии.
Атрибуты изображений
Width, Height ширина и высота изображения в пикселях.
Border наличие (1) или отсутствие (0) рамки вокруг риcунка.
Align выравнивание по левому (Left), правому (Right), верхнему (Top) и нижнему (Bottom) краям или по середине (Middle).
Alt всплывающая подсказка и наименование рисунка при его отсутствии.
Events=”имя сценария” имя запускаемого сценария при наступлении одного из событий (Events): OnClick, OnDblClick, OnMouseDown, OnMouseUp, OnMouseOver, OnMouseMove, OnKeyPress, OnKeyDown, OnKeyUp.
HSpace/VSpace свободное пространство по горизонтали/вертикали.
<TABLE>...</TABLE>, <CAPTION>...</CAPTION>,<TR>...</TR>, <TD>... </TD> начало и конец описаний всей таблицы, ее заголовка, строки и единичной ячейки соответственно. Допускается вложенность таблиц.
Атрибуты таблицы
Align выравнивание содержимого ячейки: left (влево), right (вправо), middle (по центру).
Border ширина границы таблицы в пикселях или в процентах (%).
Cellspacing ширина интервала между ячейками.
Cellpadding отступ значения в ячейке от ее границы.
Width ширина таблицы в пикселях или в процентах от окна браузера (%).
Атрибуты строк таблицы
Align, Valign выравнивание по горизонтали и вертикали.
Атрибуты заголовка таблицы
Align заголовок помещается над/под таблицей (Top/Bottom) или слева/справа (Left/Right). Заголовок следует сразу за <TABLE>.
Атрибуты ячеек таблицы
Width, Height Align, Valign ширина, высота ячейки (в пикселях или в процентах от размера всей таблицы) и выравнивание.
Char символ, по которому выравнивается текст.
Colspan/Rowspan=”n” объединить N ячеек строки/столбца в одну ячейку.
Bgcolor, Background=”URL” цвет фона и фоновый рисунок (URL адрес).
Пример описания таблицы из двух строк и двух столбцов.
<HTML><HEAD> <TITLE>Пример таблицы</TITLE></HEAD>
<BODY>
<TABLE border=“1“ width=“585“>
<TR><TD> Ячейка 1,1 </TD><TD> Ячейка 1,2 </TD></TR><BR>
<TR><TD> Ячейка 2,1 </TD><TD> Ячейка 2,2 </TD></TR><BR>
</TABLE>
</BODY>
</HTML>
Пример расположения рисунка в ячейке таблицы
<TD> <img src=“c:\WIN98\circles.bmp“></TD>
Дополнительные теги
<TFOOT>... </TFOOT>, <THEAD>... </THEAD> группирует строки в нижний или в верхний колонтитул таблицы. Атрибуты: Align, Valign, Char.
<TH>... [</TH>] заглавная ячейка. Атрибуты: Align, Valign, Char.
<A href=”URL, файл, #метка”>...</A> связь с другим документом или с частью данного. Текст или изображение между <A> и </A> вопринимается в качестве гиперссылки в документе. Если по ней щелкнуть, то появится указанный документ или его часть, если используется внутренняя ссылка.
Пример абсолютного связывания с гиперссылкой текстовой.
<A href=”http://www.usue.ru”> Страница УрГЭУ </A>
Пример относительного связывания с гиперссылкой графической.
<A href=“C:\My Documents\HTML_primer\calc.htm“>
<IMG src=“D:\Borland Shared\Images\Buttons\Calculat.bmp“</A>
Пример внутренней ссылки на часть документа (список продающихся товаров) с использованием метки списка “#Tovari”.
<A href=“#Tovari“>Товары </A> ...
<P Name=“#Tovari“> <UL><LI> Молоко <LI> Сахар </UL> </P>
Пример ссылки на адрес электронной почты автора.
<A href=“mailto:Plehev@usue.ru“>письмо Плещёву В.В.</A>
Каждый фрейм оформляется в виде отдельной страницы. Управление фреймами производится из контрольной страницы, которая содержит описание набора (подобие таблицы) фреймов и порядок его заполнения страницами путем задания тегов (пп. 1.6.3, 1.6.5):
<FRAMESET>...</FRAMESET> описание таблицы фреймов. Этот тег заменяет тег BODY.
<FRAME> описание отдельного фреймаячейки таблицы.
Атрибуты тега FRAMESET
Cols/Rows описание вертикальных/горизонтальных фреймов. Описание дается в виде списка чисел (для каждого фрейма его размер в пикселях или в процентах от доступного экрана) или символа “*” (оставшееся место на экране) через запятую (cols=”15%, 25%, *, 2*”, что равносильно cols=”15%, 25%, 20%, 40%”).
Frameborder ширина границы фрейма в пикселях.
Атрибуты тега FRAME
Frameborder ширина границы фрейма в пикселях.
Marginheight/Marginwidth высота/ширина отступа в пикселях.
Name имя фрейма (начинается с латинской буквы или с цифры).
Noresize запрет на изменение размера (значения нет).
Scrolling наличие (yes), отсутствие или вывод при необходимости полосы прокрутки.
Src URL размещаемой страницы во фрейм.
Для динамической загрузки страницы в фрейм по гиперссылке (п.1.2.9) в теге <A> после атрибута href, с именем этой страницы, указывается атрибут Target со значением имени фрейма, в который она загружается (<P><A><href=”Tovati.htm” target=”rightframe”>Товары </A>).
Если в разделе <HEAD> указать тег <BASE Target=”имя фрейма”>, то по умолчанию все страницы будут загружаться в указанный фрейм.
Атрибут Target имеет ряд предопределенных имен фреймов: _blank (новое окно браузера), _self (окно вызова фрейма), _parent (родительский набор фреймов), _top (полное окно браузера, игнорируя все фреймы).
Форма является интерфейсом взаимодействия пользователя с узлом
Теги формы и их атрибуты
<FORM> ... </FORM> начало и окончание описания формы.
Action URL сценарий, выполняемый на сервере для обработки данных из формы.
Method способ передачи данных из форм узлу: Get (добавляет информацию из формы к URL, описанному в атрибуте Action), Post (передает данные в теле запроса). Способ определяется провайдером.
<TEXTAREA>...</TEXTAREA>начало и окончание текстовой области
Name, Rows, Cols имя области, число строк в области и ее ширина.
<SELECT> ... </SELECT> задание списка значений для выбора
Name, Events,Tabindex, OnFocus, OnBlur, OnChange - приведены далее в описании тега <INPUT>.
Size число значений в окне выбора. Если Size отсутствует, то будет выпадающий список (п. 1.6.8.4).
Multiple множественный выбор (значение отсутствует).
Описание каждого элемента списка приводится в теге:
<OPTION атрибуты> элемент [</OPTION>]
Selected, Disabled предварительный выбор, запрет на выбор.
Label более короткая метка варианта выбора.
Value начальное значение элемента
<INPUT> создание управляющих элементов (объектов) в форме.
Alt, Events краткое описание, встроенные события (п.1.2.7).
Accesskey комбинация клавиш для активизации объекта при их нажатии, при нажатой клавише Alt.
Disabled недоступность (значение отсутствует).
Tabindex номер порядка активизации объекта клавишей Tab.
Type, Name, Value тип, имя, начальное значение (надпись) объекта.
Size ширина объекта в пикселях (для Text, Password в символах).
Maxlength предельное количество символов в объекте.
OnFocus/OnBlur имя сценария, запускаемого при получении/потере фокуса.
OnChange имя сценария, запускаемого при потере фокуса ввода, а его значение было изменено после получения фокуса.
Рассмотрим типы объектов.
Поле ввода (Type=”Text”) позволяет ввести текст из одной строки.
Атрибут без значения ReadOnly запрещает изменение значения поля; атрибут OnSelect задает имя сценария, выполняемого при выделении текста в поле. Для размещения полей в отдельных строках используется тег <BR>.
Пример поля ввода под именем Fam длиной до сорока символов с умалчиваемым значением “Иванов“.
<INPUT TYPE=“TEXT“ NAME=“Fam“ VALUE=“Иванов“ Maxlength=”40”>
Поле ввода пароля (Type=”Password”) аналогично полю ввода, но вводимые символы отображаются на экране звездочками.
Флажки или независимые переключатели (Type=”Checkbox”) позволяют выбрать возможные варианты. Дополнительный атрибут Checked (без значения) позволяет включить флажок при его описании и определить выбор данного флажка (можно использовать и атрибут Value) в процедурах обработки документа (п. 1.6.8.2).
Зависимые переключатели или радиокнопки (Type=”Radio”) аналогичны флажкам, но выбрать можно только одну из группы этих кнопок. Все кнопки из одной группы дожны иметь одинаковые имена (п. 1.6.8.2).
Кнопка (Type=”Button”) позволяет вызвать процедуры (сценарии) обработки событий (обычно OnClick), связанных с кнопкой (п. 1.6.8.1).
Для создания кнопок можно воспользоваться отдельным тегом:
<BUTTON артибуты> содержимое </BUTTON>
Основные атрибуты тега BUTTON: Name, Disabled, Type (button, submit, reset), Accesskey, Tabindex, Events, OnFocus, OnBlur.
Содержимым могут быть и другие теги, например теги изображений.
Пример кнопки с изображением
<HTML><HEAD><TITLE>Работа с кнопкой</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub ClickKnopka1: Alert “Щелчок“: End Sub </SCRIPT></HEAD>
<BODY> <FORM NAME=“Form1“>
<BUTTON name=“knopka1“ value=“Кнопка1“ type=“button“
Onclick=“ClickKnopka1“ Accesskey=“k“> OK
<IMG src=“c:\WIN98\circles.bmp“ width=“50“ height=“50“ Alt=“Кольца“>
</BUTTON></FORM>
</BODY>
</HTML>
Кнопка передачи (Type=”Submit”, Type=”Image”) подтверждает выбор и отправляет данные на сервер (п. 1.6.8.1). Графический вид этой кнопки задается типом Image, изображение атрибутом Src=”URL”.
Кнопка сброса (Type=”Reset”) обеспечивает сброс текущих значений объектов и установку умалчиваемых значений (п. 1.6.8.4).
Кнопка выбора файла (Type=”File”) выводит окно выбора файла.
Скрытый объект (Type=”Hidden”) без изображения на экране. Обычно использутся для автоматического ввода дополнительных данных.
Можно форму со всеми объектами или отдельный ее элемент оформить в виде ActiveXэлемента (п.14.1) и включить его в HTMLстраницу. Это позволяет использовать язык Visual Basic при создании страниц.
Доступ к компонентам (элементам и формам) ActiveX, выполняемым на клиентской машине, реализуется тегом: <OBJECT>...</OBJECT> с атрибутами: ID (идентификатор компонента на странице), ClassID (после текста “CLSID:” указывается идентификатор GUID, идентифицирующий компонент и хранящийся в системном реестре), Codebase (файл с компонентом, если компонент отсутствует в системном реестре), AccessKey, Align, Class (класс стиля), Data (URL данные для компонента времени выполнения), Datasrc (идентификатор элемента управления, с которым связывается компонент), Events, Standby (сообщение, выводимое при загрузке объекта), Height, Language (язык, используемый в атрибутах событий), Name (имя компонента), Style (атрибуты стиля компонента), Type (MIMEтип процессора сценариев), TabIndex, Width.
Для компонента необходимы атрибуты: ID, ClassID или Codebase.
После загрузки компонент обычно устанавливает свои свойства и их значения путем использования тега <PARAM атрибуты> с атрибутами: ID (имя элемента), Name и Value (имя и значение свойства), Datafld (поле базы, связанное с компонентом, ValueType (тип значения: data (строка), ref (URL), object (ID объекта). Один тег описывает один параметр. Эти теги располагаются между <OBJECT> и </OBJECT>.
Пример вывода AciveXэлемента Calendar (календарь) для выбора нужной даты (рис.1.2.12.1). Вызовем редактор реестра из строки запуска программ командой RegEdit. Найдем идентификатор GUID для календаря в колонке Data или в строке статуса. Для поиска компонента по его имени можно воспользоваться командой поиск ^F.
Рисунок - 1.2.12.1. Вид страницы с ActiveX Calendar
<HTML><HEAD><TITLE>Работа с кнопками</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka1_OnClick процедура обработки нажатия кнопки Knopka1
Alert “Выбрана дата “ & Form1.calendar.Value вывод выбранной даты
End Sub 'конец процедуры кнопки “Вывести выбранную дату”
Sub Knopka2_OnClick 'процедура обработки нажатия кнопки Knopka
Form1.calendar.Value=DateValue(date()) установка текущей даты
End Sub 'конец процедуры “Установить текущую дату”
</SCRIPT></HEAD>
<BODY> <FORM NAME=“Form1“> <P ALIGN=“Center“>
<OBJECT ID=“calendar“ width=“250“ height=“150“
ClassID=“CLSID:8E27C92B-1264-101C-8A2F-040224009C02“>
</OBJECT> </P> <P ALIGN=“Center“>
<INPUT TYPE=“button“ NAME=“Knopka1“
VALUE=“Вывести выбранную дату“>
<INPUT TYPE=“button“ NAME=“Knopka2“
VALUE=“Установить текущую дату“></P>
</FORM></BODY></HTML>
<CENTER> ... </CENTER> центрирует содержимое на странице.
<CITE> ... </CITE> определяет цитату или ссылку.
<CODE> ... </CODE> определяет фрагмент компьютерного кода.
<DEL> ... </DEL>, <INS> ... </INS> определяет фрагмент, удаленный из предыдущей версии документа или вставленный в документ.
<DFN> ... </DFN> определяет экземпляр термина.
<KBD> ... </KBD> определяет текст как вводимый с клавиатуры.
<LABEL> ... </LABEL> помечает управляющий элемент формы. Атрибуты: Events, For (связывает метку с элементом), AccessKey,OnFocus, OnBlur.
<META> информация о документе. Атрибуты: Name (имя свойства), Content (содержание, значение свойства).
<PRE> ... </PRE> предварительно отформатированный текст.
<SAMP> ... </SAMP> текст, выводимый программой, сценарием.
<SUB> ... </SUB>,<SUP> ... </SUP> выводит нижний или верхний индекс по отношению к основному тексту.
<TT> ... </TT> выводит текст моноширинным текстом.
Стиль представляет собой набор свойств (опций) редактирования. Существуют три типа стилей (в порядке их применения): встраиваемые (включение атрибута Style=”свойства” в нужный тег), внедряемые (использование тега <STYLE> в разделе <HEAD>), связываемые (использование эталонного листа внедренных стилей для всего узла и хранящегося в файле с расширением .css (mystyle.css)). Вызов файла mystyle.css имеет вид: <HEAD>...<LINK rel=stylesheet href=”mystyle.css” type=”text/css”> ...
Свойство стиля записывается в виде: {имя свойства: значение свойства}. Несколько свойств можно объединить в список через символ точка с запятой. Перед внедряемым свойством или списком свойств указываются селекторы (имена тегов) через запятые, для которых применяются эти свойства (H1, H2, H3 {font-family: sans-serif; font:14pt; color: #cccccc;}).
У всех свойств есть значение inherit, которое означает, что принимается значение родительского элемента.
Примеры встроенного и внедренного стиля соответственно.
<BODY STYLE=“{background-image: url('c:\WIN98\circles.bmp');}“>
<STYLE> body {background-image: url('c:\WIN98\circles.bmp');}</STYLE>
Свойства текста
Text-indent длина отступа в первой строке блока (P {text-indent: 40px}).
Text-Align выравнивание: left, center, right, justify (P {text-align: right}).
Text-decoration оформление текста: none (отсутствует), underline (подчеркивание), overline (надчеркивание), line-through (перечеркивание), blink (мерцание). Пример: P {text-declaration: underline}.
Text-transform перевод букв: none, capitalize (первая буква слова прописная), uppercase/lowercase (прописные/строчные).
Text-indent, Margin-left, Margin-right, Margin-top, Margin-bottom отступ и поле абзаца слева, справа, сверху, снизу в пунктах (pt), сантиметрах (cm), дюймах (in) и пикселях (px) соответственно.
Letter-spacing/Word-spacing интервал между буквами/словами: none (по умолчанию), число (P {letter-spacing: 0.4em}).
White-space обработка пробелов: normal (сворачиваются, если это необходимо для размещения элемента), pre (обрабатываются как указано в коде), nowrap (всегда сворачиваются). Пример: P {White-space: pre}.
Свойства цвета и фона
Color цвет текста (DIV {color: rgb(0,0,255)}).
Background-image фоновое изображение: none (нет), URL адрес изображения ({background-image: URL('c:\WIN98\circles.bmp')}).
Background-repeat направление заполнения экрана копиями фонового изображения: repeat (по горизонтали и вертикали), repeat-x (по горизонтали), repeat-y (по вертикали), no-repeat (не повторяется).
Background-pozition положение фонового изображения: top (вверху), center (в центре), bottom (внизу), left (слева), right (справа) ({Backgroundpozition: top center}).
Background-attachment прокрутка фонового изображения вместе с документом (scroll) или фиксируется (fixed).
Background установка всех параметров фона сразу (P {background blue URL('roza.gif') repeat fixed top right}) .
Свойства шрифтов
Fontfamily список названий шрифтов через запятые в порядке убывания приоритета. Многословные названия заключаются в кавычки (BODY {Fontfamily: “Time New Roman”, courier, serif}).
Fontstyle начертание: normal (обычное), italic (курсив), oblique (наклон).
Fontvariant вывод строчными буквами (small-caps), normal (обычное).
Fontweigth толщина шрифта: normal (обычная), bold (полужирные), bolder (жирный), lighter (светлый), число (толщина от 100 до 900).
Fontsize высота шрифта: xx-small (очень маленький), small (маленький), medium (средний), large (большой), x-large (очень большой), xx-large (крайне большой), larger (больше), smaller (меньше), число ({font-size:16pt}).
Background установка всех параметров шрифта сразу (P {font: itlic bold 16pt}) .
VBScript (Visual Basic Scripting Editor, http://msdn.microsoft.com/scripting/vbscript) является подмножеством языка VBasic (например, можно использовать переменные только типа Variant), отсутствуют возможности работы с файловой системой клиента и с пользовательским интерфейсом, поддерживает связь с внешней средой через HTMLдокумент и др. [5].
В сетевой среде WWW используются понятия “сервер” и “клиент”.
Серверкомпьютер содержит информационные ресурсы (Webдокументы, файлы) и предоставляет услуги клиенту.
Клиентом является компьютер, браузер которого формирует и посылает запрос на сервер о предоставлении ему некоторого Webресурса, например Webдокумента. Сервер возвращает клиенту Webдокумент в виде HTMLкода, который интерпретируется и представляется браузером клиента в виде Webстраницы. Допускается обработка и на стороне клиента, например контроля вводимой информации. Существуют и другие языки для создания Webстраниц, например Perl, JavaScript. Браузер Netscape Navigator не поддерживает VBScript.
Для получения доступа к данным сервера с любого Webбраузера, а не только на котором Windows и клиент использует Visual Basic, фирмой Microsoft разработана технология ASP (Active Server Pages активных серверных страниц) [1, 4]. Клиент готовит текстовый ASPфайл любым текстовым редактором или визуальными средствами Front Page, помещает его в созданный каталог на Webсервере с режимом доступа Execute. Каталог создается программой Internet Service Manager из группы программ Internet Information Server (IIS). Можно поместить все ASPфайлы в каталог Script, создаваемый по умолчанию при установке IIS, но лучше создать собственный каталог. ASPфайлы обычно выполняются на сервере, и результаты в виде HTMLкода отправляются клиенту и предоставляются в виде Webстраницы. Разработчик Webстраниц может использовать HTMLкод и код VBScript, который называется сценарием (Script). Сценарий позволяет “оживить” страницы (динамически измененяя объекты страниц, формируя расчетные поля, осуществляя доступ к базам данных и др.).
Tеги <SCRIPT> и </SCRIPT> задают начало и окончание сценария. Тег <SCRIPT> имеет следующие основные атрибуты:
LANGUAGE={“VBScript” | “JavaScript”} язык сценария;
RUNAT=”Server” задает место исполнения сценария на стороне сервера. По умолчанию выполнение сценария в браузере.
SRC=”URL” местоположение внешнего сценария.
DEFER сценарий не выводит содержимое документа.
Вместо <SCRIPT LANGUAGE=“VBScript” RUNAT=”Server”> и </SCRIPT> могут использоваться символы <% и %> (сокращенная запись).
Размещение сценария в HTML-документе имеет несколько вариантов (между тегами <HEAD>, </HEAD> и <BODY>, </BODY>).
Существует несколько способов вызова сценария. Характерный для Visual Basic основывается на объявлении процедуры, имя которой состоит из имени элемента управления и названия события, обрабатываемого процедурой, разделенных символом подчеркивания. Данная процедура будет запускаться всякий раз при генерировании указанным объектом заданного события.
Пример размещения сценария между тегами <HEAD> и </HEAD>.
<HTML>
<HEAD> <TITLE> Обработка нажатия кнопки </TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick процедура обработки нажатия кнопки Knopka
Alert “Кнопка нажата“ вывод сообщения
End Sub 'конец процедуры
</SCRIPT>
</HEAD>
<BODY BGCOLOR=“White“> <!-- цвет фона=белый //-->
<P ALIGN=“Center“><INPUT TYPE=“button“ NAME=“Knopka“
VALUE=“Кнопка“></P>
</BODY>
</HTML>
Пример размещения сценария между тегами <BODY> и </BODY>.
<HTML><HEAD><TITLE>Обработка нажатия кнопки </TITLE></HEAD>
<BODY BGCOLOR=“WHITE“>
<SCRIPT LANGUAGE=“VBSCRIPT“>
DOCUMENT.WRITE “Здравствуйте!“ 'вывод текста
</SCRIPT>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“ NAME=“Knopka“
VALUE=“Кнопка“></P>
<SCRIPT LANGUAGE=“VBSCRIPT“>
SUB Knopka_ONCLICK: ALERT “Нажали кнопку!“: END SUB
</SCRIPT>
</BODY>
</HTML>
Существует еще один вариант вызова. При помощи атрибута FOR тега <SCRIPT> можно задать объект, обработчик события которого располагается непосредственно под тегом <SCRIPT> без Sub и End Sub, а само событие объявляется атрибутом EVENT.
Пример использования атрибутов FOR и EVENT тега <SCRIPT>.
<HTML><HEAD><TITLE>Нажатие кнопки</TITLE></HEAD>
<BODY BGCOLOR=“WHITE“>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Кнопка“></P>
<SCRIPT FOR=“Knopka“ EVENT=“OnClick“ LANGUAGE=“VBScript“>
ALERT “Нажали кнопку!“
</SCRIPT>
</BODY>
</HTML>
Можно вызвать сценарии непосредственно из описания HTML-элемента, если процедуру надо вызывать для нескольких разных объектов. В текст описания HTML-элемента добавляется атрибут onclick=“ProcEvent”.
Пример вызова процедуры ProcEvent с параметром (номер нажатой кнопки) при нажатии кнопки Knopka1 или Knopka2.
<HTML>
<HEAD><TITLE>Вызов процедуры с параметром ProcEvent (p)</TITLE>
<SCRIPT LANGUAGE=“VBSCRIPT“>
Sub ProcEvent(p): ALERT “Нажата кнопка“&P: End Sub
</SCRIPT>
</HEAD>
<BODY BGCOLOR=“WHITE“>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka1“ ONCLICK=“ProcEvent(1)“
VALUE=“Кнопка1“></P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka2“ ONCLICK=“ProcEvent(2)“
VALUE=“Кнопка2“></P>
</BODY>
</HTML>
Существует возможность включать код на уровне сценария. Для этого его следует разместить после тега <SCRIPT>, чтобы он выполнялся автоматически после первой загрузки.
Пример включения кода процедуры на уровне сценария.
<HTML><HEAD><TITLE>Пример сценария с кодом</TITLE></HEAD>
<BODY BGCOLOR=“WHITE“>
<SCRIPT LANGUAGE=“VBScript“>
DOCUMENT.WRITE “Строка 1<BR>“: DOCUMENT.WRITE “Строка 2“
</SCRIPT>
</BODY>
</HTML>
Internet Explorer является иерархической моделью из многих объектов, которыми можно оперировать при помощи VBScript, используя их свойства, методы и события. Рассмотрим основные объекты.
Объект Window представляет собой окно браузера и является начальным (корневым) объектом модели Internet Explorer.
Свойства
DefaultStatus умалчиваемое значение строки состояния браузера.
Document ссылка на объект Document в текущем окне.
Self, Status ссылка на текущее окно, на строку состояния.
Frames ссылка (имя фрейма или его номер) к массиву фреймов текущего окна.
Name, Parent имя окна, ссылка на родительский объект.
Top ссылка к самому верхнему в иерархии объекту Window.
DialogTop, DialogLeft, DialogHeight, DialogWidth позиция левого верхнего угла, высота и ширина окна, созданного методом ShowModalDialog в пикселях.
Методы
Alert <строка сообщения> вывод сообщения с кнопкой OK.
<переменная>=Confirm <строка сообщения> вывод сообщения с кнопками OK, Cancel. Возвращает True/False после надажия клавиши OK/Cancel.
<переменная>=Prompt (<строка сообщения>,<умалчиваемое значение>) - запрос на ввод.
Window.Focus/Window.Blur получение/потеря фокуса.
Window.Open (URL,<имя нового окна>,<параметры>) открытие страницы с адресом URL в новом окне. Параметры задают список ключевых параметров: Directories=Yes (вывод панели Links), Height/Width (высота/ширина окна), Location=Yes (наличие панели адресов), Menubar=Yes (наличие меню), Resizable=Yes (возможность изменения размеров окна), Scrollbars=Yes (наличие полосы прокрутки), Status=Yes (отобразить строку состояния), ToolBar=Yes (отобразить панель инструментов).
Window.Close закрытие окна.
Window.Scroll=”Yes/No” показывает/скрывает полосу прокрутки.
<переменная>=Window.ShowModalDialog(URL[,<аргументы>[,<возможности>]]) выводит диалоговое HTMLокно.
X=Window.SetTimeOut <имя процедуры>, <интервал> задает имя процедуры, выполняемой один раз через временной интервал (в миллисекундах). Переменная X используется для отключения таймера методом ClearTimeOut.
Window.ClearTimeOut X отключение таймера.
Window.Navigator URL - загрузка новой страницы по адресу URL.
Window.ExecScript(<процедура>[,<язык процедуры>]) запуск процедуры.
Window.ShowHelp(URL[,<аргументы>]) выводит файл справки.
События
OnLoad/OnUnLoad после загрузки/выгрузки документа.
OnFocus/OnBlur при получении/потере фокуса.
OnHelp после нажатия клавиши F1, когда окно находится в фокусе.
Cобытие реализуется в процедуре:Window_<имя события>.
Пример использования методов Confirm и Alert.
<HTML>
<HEAD> <TITLE> Метод Confirm</TITLE>
<SCRIPT LANGUAGE=“VBSCRIPT“>
Sub Knopka_OnClick
if Confirm(“Выберите кнопку!“) then Alert“OK“ Else Alert “Cancel“
End Sub
</SCRIPT>
</HEAD>
<BODY BGCOLOR=“#FFFFFF“>
<P ALIGN=“CENTER“>
<FONT COLOR=“Green“ SIZE'“4“> Метод </FONT>
<FONT COLOR=“Green“ SIZE=“5“>
<EM><B>Confirm</B></EM></FONT> </P>
<FORM METHOD=“POST“>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Тестирование метода Confirm“> </P>
</FORM>
</BODY>
</HTML>
Пример использования метода Prompt.
<HTML>
<HEAD> <TITLE>Пример использования метода Prompt</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick: Alert Prompt(“Введите текст“,“текст“): End Sub
</SCRIPT>
</HEAD>
<BODY BGCOLOR=“WHITE“>
<P ALIGN=“CENTER“>
<FONT COLOR=“Red“ SIZE=“4“>Метод Prompt</FONT> </P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Тестирование метода Prompt“> </P>
</BODY>
</HTML>
Пример загрузки новой страницы в отдельное окно методом Open.
<HTML> <HEAD> <TITLE>Пример использования метода Open</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
Options=“Toolbar=Yes, Location=Yes, Directories=Yes, Status=Yes,“ + _
“menubar=Yes, scrollbars=No, resizable=Yes, width=300, height=400“
Window.Open “http://www.usue.ru“, “usue“,Options
End Sub
</SCRIPT> </HEAD>
<BODY BGCOLOR=“WHITE“>
<P ALIGN=“CENTER“>
<FONT COLOR=“Red“ SIZE=“4“> Метод Open</FONT> </P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Для открытия окна нажмите кнопку“></P>
</BODY>
</HTML>
Пример использования метода Close.
<HEAD> <TITLE>Пример использования метода Close</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick: Window.Close: End Sub
</SCRIPT> </HEAD>
<BODY>
<P ALIGN=“CENTER“> <FONT SIZE=“4“>Метод Close</FONT></P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Для закрытия окна нажмите кнопку“> /P>
</BODY>
</HTML>
Пример работы с таймером. Если кнопка нажата в течение одной секунды, то появляется сообщение “Кнопка нажата”, иначе “Нажмите кнопку”.
<HTML><HEAD><TITLE>Пример работы с таймером</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
x=SetTimeout(“Alert('Нажмите кнопку!')“,1000)
Sub Knopka_OnClick: ClearTimeout x:Alert “Кнопка нажата“: End Sub
</SCRIPT> </HEAD>
<BODY> <P ALIGN=“CENTER“> Метод SetTimeout </P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Нажмите кнопку“> </P> </BODY>
</HTML>
Пример загрузки новой страницы методом Navigtor.
<HTML> <HEAD> <TITLE> Загрузка новой траницы</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
Navigate Prompt(“Введите URL адрес “,“http://www.usue.ru“)
End Sub
</SCRIPT> </HEAD>
<BODY> <P ALIGN=“CENTER“>Метод Navigator</FONT> </P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“VALUE=“Новая Web-страница“></P> </BODY>
</HTML>
Пример процедуры Window_OnLoad обработки события OnLoad.
<HTML> <HEAD> <TITLE>Пример события OnLoad</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Window_OnLoad: Alert “Нажмите на кнопку выбора“: End Sub
Sub Knopka_OnClick
If Confirm (“Выберите кнопку“) Then Alert “OK“ Else Alert “Cancel“
End Sub
</SCRIPT> </HEAD>
<BODY> <P ALIGN=“CENTER“>Событие OnLoad</P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Кнопка выбора“> </P> </BODY>
</HTML>
Событие OnLoad можно описать в теге <BODY> при помощи атрибута OnLoad=”<имя процедуры>”.
Пример вызова процедуры обработки события OnLoad в теге Body.
<HTML> <HEAD><TITLE>Событие OnLoad в теге BODY</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub ProcLoad: Alert “Нажмите на кнопку выбора“:End Sub
Sub Knopka_OnClick
If Confirm (“Выберите кнопку“) Then Alert “OK“ Else Alert “Cancel“
End Sub
</SCRIPT>
</HEAD>
<BODY OnLoad=“ProcLoad“>
<P ALIGN=“CENTER“>Событие OnLoad</P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Кнопка выбора“> </P> </BODY>
</HTML>
Пример процедуры обработки события OnUnLoad.
<HTML> <HEAD><TITLE>Событие OnUnLoad в теге BODY</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Window_OnUnLoad: Alert “До свидания“ : End Sub
Sub Knopka_OnClick: Window.Close : End Sub
</SCRIPT>
</HEAD>
<BODY><P ALIGN=“CENTER“>Событие OnUnLoad</P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Выход“> </P> </BODY>
</HTML>
Пример вызова процедуры события OnUnLoad в теге Body.
<HTML> <HEAD><TITLE>Событие OnUnLoad в теге BODY</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub ProcLoad: Alert “До свидания“ : End Sub
Sub Knopka_OnClick: Window.Close : End Sub
</SCRIPT> </HEAD>
<BODY ONUNLOAD=“ProcLoad“>
<P ALIGN=“CENTER“>Событие OnUnLoad</P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Выход“> </P> </BODY>
</HTML>
Объект Frame (п. 1.2.10) подобен объекту Window и имеет те же свойства, методы и события.
Объект хранит информацию о текущем URL.
Свойства
Hash гиперссылка (хеш) внутри самого документа. В URL хеш указывается после символа “#”. Сама хешссылка приводится в теге:
<A> Name=”хешссылка” </A>
Host, HostName,Href, PathName, Protocol возвращает имя сервера и номер порта (www.usue.ru), имя сервера, текущий URL, путь к текущему документу, протокол передачи данных соответственно.
Search строка запроса для поисковых машин.
Пример работы с двумя фреймами UpperFrame, LowerFrame (файлы Frame1.htm, Frame2.htm) с кнопкой для их перестановки (рис. 1.6.3.1).
<HTML>
<HEAD> <TITLE>Пример работы с двумя фреймами</TITLE></HEAD>
<FRAMESET Rows=“40%, 60%“>
<FRAME NAME=“UpperFrame“ SRC=“Frame1.htm“>
<FRAME NAME=“LowerFrame“ SRC=“Frame2.htm“>
</FRAMESET>
</HTML>
HTMLкод документа Frame1.htm верхнего фрейма UpperFrame
<HTML><HEAD><TITLE>Верхний фрейм UpperFrame</TITLE></HEAD>
<BODY>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
If Right(Top.Frames(0).Location.Href,10)=“Frame1.htm“ Then
Top.LowerFrame.Location.Href=“Frame1.htm“
Top.UpperFrame.Location.Href=“Frame2.htm“
Else
Top.LowerFrame.Location.Href=“Frame2.htm“
Top.UpperFrame.Location.Href=“Frame1.htm“
End if
End Sub
</SCRIPT>
<P ALIGN=“CENTER“>
<FONT COLOR=“Blue“ SIZE=“4“>
<B>Верхний фрейм UpperFrame</B>
</FONT> </P>
<P ALIGN=“CENTER“> <INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Фреймы поменять местами“> </P>
</BODY>
</HTML>
HTMLкод документа Frame2.htm нижнего фрейма LowerFrame
<HTML><HEAD><TITLE>Нижний фрейм LowerFrame</TITLE> </HEAD>
<BODY BGCOLOR=“WHITE“>
<P ALIGN=“CENTER“>
<FONT COLOR=“Red“ SIZE=“6“>
<B>Нижний фрейм LowerFrame</B>
</FONT> </P> </BODY>
</HTML>
Рисунок - 1.6.3.1. Вид окна с двумя фреймами
Объект предназначен для получения информации о браузере.
Свойства (только для чтения)
AppCodename, AppName, UserAgent возвращает код браузера (Mozila для Microsft Internet Explorer 4.0), имя браузера (Microsft Internet Explorer), идентификатор типа браузера.
Пример работы с объектом Navigator
<HTML> <HEAD> <TITLE>Пример Navigator</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
Alert Navigator.AppCodeName + chr(13) + chr(10) + _
Navigator.AppName + chr(13) + chr(10) + _
Navigator.AppVersion + chr(13) + chr(10) +Navigator.UserAgent
End Sub
</SCRIPT> </HEAD>
<BODY><P ALIGN=“CENTER“>Свойства объекта Navigator </P>
<P ALIGN=“CENTER“> <INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Вывод свойств“ </P> </BODY>
</HTML>
Объект является массивом документов (отсчет с единицы), открытых за сеанс работы. Это позволяет повторно загрузить нужный документ.
Свойства
Length число документом в массиве.
Window.Back Window.Forward n пропуск на N документов назад/вперед.
Window.History.Go n переход на документ по номером N.
Пример. Составим страницу из двух фреймов. Верхний фрейм содержит две кнопки Вперед и Назад для просмотра массива документов и кнопку Новый документ для запроса URL (адреса) нового документа. Загружаемые документы выводятся в нижний фрейм.
<HTML><HEAD> <TITLE>Пример History </TITLE> </HEAD>
<FRAMESET Rows=“40%, 60%“>
<FRAME NAME=“UpperFrame“ SRC=“FrameOpen.htm“>
<FRAME NAME=“LowerFrame“ SRC=“FrameShow.htm“>
</FRAMESET>
</HTML>
HTMLкод документа FrameOpen верхнего фрейма UpperFrame
<HTML> <HEAD> <TITLE>Открытие документа</TITLE> </HEAD>
<BODY>
<SCRIPT LANGUAGE=“VBScript“>
Sub NewDocum_OnClick
adr=Prompt(“Введите адрес документа“, “http://www.usue.ru“)
if adr <> Empty Then Top.LowerFrame.Location.Href = adr
End Sub
Sub Forward_OnClick: Top.LowerFrame.History.Forward 1: End Sub
Sub Back_OnClick: Top.LowerFrame.History.Back 1: End Sub
</SCRIPT>
<P ALIGN=“CENTER“>
<INPUT TYPE=“BUTTON“
NAME=“NewDocum“ VALUE=“Новый документ“> </P>
<P ALIGN=“CENTER“>
<INPUT TYPE=“BUTTON“ NAME=“Back“ VALUE=“Назад“>
<INPUT TYPE=“BUTTON“ NAME=“Forward“ VALUE=“Вперед“> </P>
</BODY>
</HTML>
HTMLкод документа FrameShow нижнего фрейма LowerFrame
<HTML><HEAD><TITLE>Просмотр</TITLE></HEAD> </HTML>
Объект содержит описание документа.
Свойства
Anchors - массив гиперссылок, присутствующих в документе.
AlinkColor, LinkColor/Vlink Color цвет активной ссылки, цвет гипертекстовой ссылки, которую пользователь не/уже посетил.
BGColor/FgColor - цвет фона/текста документа.
Title заголовок документа.
Cookie передача маленьких порций (“пирожков”) документа.
LastModified - дата последнего изменения документа.
Location возвращает объект Location с информацией о текущем URL.
Referrer возвращает URL предыдущего объекта Location.
ActiveElement возвращает элемент в фокусе.
ReadyState состояние загружаемого документа: недоступен (1), загружается (2), доступен, но загружен не полностью (3), доступен и загружен полностью (4).
Domain, URL имя узла с документом, URL документа.
Body - возвращает ссылку на объект BODY.
ParentWindow возвращает ссылку на объект Window с документом.
Selection возвращает ссылку на текущий объект Selection.
Методы
Close закончить запись в документ и его отображение.
Open открытие нового потока для методов Write и WriteLn (формирование новой страницы).
Clear способ расположения текста по отношению к плавающим изображениям: после всех изображений (1); после всех изображений, выравненных по левому (2) или правому (3) краю.
Write/WriteLn (<текст>) вывод HTML в открытый поток без/с добавлением символа возврата каретки (Document.Write (“<H2> Пример </H2>”)). На практике HTML не различает символ возврата каретки, потому Write и WriteLn равнозначны. Кавычки внутри символьной константы изображаются апострофами (Document.Write “<P ALIGN='Center'>”). Метод позволяет динамически формировать Webстраницы.
ExecCommand (<команда>[, <значение> [,{-1|0}]]) выполнение команды, которая возвращает указанное значение с предоставлением графического интерфейса (-1).
QueryCommandEnabled (<команда>), QueryCommandSupported (<команда>) возвращает истину, если команда доступна.
QueryCommandValue(<команда>) возвращает текущее значение команды.
QueryCommandText(<команда>) возвращает строку, ассоциированную с командой.
ElementFromPoint(x,y) - возвращает элемент, которому принадлежит точка с координатами x,y.
QueryCommandState (<команда>) - возвращает состояние команды.
QueryCommandIndeterm (<команда>) - сообщает, находится ли команда в неопределенном состоянии.
CreateElement(<тег>) возвращает ссылку на созданный тег.
События: OnClick, OnMouseOver, OnDblClick, OnKeyPress, OnMouseDown, OnMouseMove, OnMouseUp, OnKeyDown, OnKeyUp, OnMouseOut (выход за пределы документа), OnReadyStateChange (при изменении состояния готовности документа), OnHelp.
Эти события аналогичны одноименным событиям в Visual Basic.
Пример использования свойств LastModified и Title.
<HTML><HEAD><TITLE>Свойства документа</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
Alert Document.LastModified + chr(13) + chr(10) + Document.Title
End Sub
</SCRIPT></HEAD>
<BODY> <P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Свойства“></P></BODY>
</HTML>
Пример использования свойств BGColor, FGColor.
<HTML><HEAD><TITLE>Цвета</TITLE>
<SCRIPT LANGUAGE=“VBScript“> DIM A(15)
A(1) =“WHITE“ : A(2) =“BLACK“ : A(3) =“BLUE“ : A(4) =“RED“
A(5) =“YELLOW“: A(6) =“AQUA“ : A(7) =“FUSHIA“: A(8) =“GRAY“
A(9) =“LIME“ : A(10) =“MAROON“: A(11)=“NAVY“ :A(12)=“OLIVE“
A(13)=“PURPLE“: A(14) =“SILVER“ : A(15)=“TEAL“
I=1:J=2: DOCUMENT.BGCOLOR=A(I):DOCUMENT.FGCOLOR=A(J)
Sub FG_ONCLICK : IF I=15 THEN I=0
I=I+1: DOCUMENT.FGCOLOR=A(I): End Sub
Sub BG_ONCLICK: IF J=15 THEN J=0
J=J+1: DOCUMENT.BGCOLOR=A(J): End Sub
</SCRIPT>
</HEAD><BODY><CENTER><H2>Работа с цветом</H2>
<P> <INPUT TYPE=“BUTTON“ NAME=“FG“
VALUE=“Следующий цвет текста“>
<INPUT TYPE=“BUTTON“ NAME=“BG“
VALUE=“Следующий цвет фона“>
</P></CENTER></BODY>
</HTML>
Пример вывода методом Write текста в текущий документ.
<HTML><HEAD><TITLE>Пример использования метода Write</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Document.Write “<P ALIGN='Center'><FONT COLOR='Blue'“
Document.Write “SIZE='7'><B>Здравствуйте!“
Document.Write “</B></FONT></P>“
Document.Close
</SCRIPT></HEAD>
</HTML>
Пример динамического формирования новой Webстраницы методом Write.
<HTML><HEAD><TITLE> Формирование новой страницы </TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka_OnClick
Document.Open 'открытие нового потока (страницы)
Document.Write “<P ALIGN='Center'><FONT COLOR='Red'“
Document.Write “SIZE='7'>Новая страница</FONT></P>“
Document.Close 'закрытие новой страницы и ее отображение
End Sub
</SCRIPT></HEAD><BODY>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“ NAME=“Knopka“
VALUE=“Новая страница“></P></BODY>
</HTML>
Объект представляет собой массив гиперссылок. Гиперссылка должна иметь имя, например LinkUsue в теге:
<A HREF=”http://www.usue.ru.” Name=”LinkUsue”> УрГЭУ </A>
Свойства (только для чтения)
Hash, Href, Host, HostName, PathName, Port, Protocol, Search аналогичны одноименным свойствам объекта Location (п. 1.6.3).
Target имя конечного окна или фрейма для гиперссылки.
Length число гиперссылок в объекте Links.
События
OnMouseOver указатель мыши установлен на гиперссылке.
OnMouseMove указатель мыши перемещается по гиперссылке. Координаты указателя мыши (x, y) можно получить в виде:
X=Window.Event.OffSetX, Y=Window.Event.OffSetY.
OnClick щелчок на гаперссылке.
Пример обработки события OnMouseOver: вывод текста “Описание гиперссылки“ в строке состояния.
<HTML><HEAD><TITLE>Подсказка о гиперссылке</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Ssilka_OnMouseOver:Window.Status=“Описание гиперссылки“:End Sub
</SCRIPT></HEAD> <BODY> <P ALIGN=“CENTER“>
<A HREF=““ NAME=“Ssilka“> Установка статуса </A></P></BODY>
</HTML>
Пример обработки событий OnMouseMove (вывод текущих координат указателя мышки в строке состояния) и OnClick (вывод сообщения).
<HTML><HEAD><TITLE>Вывод координат указаталя мыши </TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Ssilka_OnClick: Alert “Щелчок по гиперссылке“: End Sub
Sub Ssilka_OnMouseMove()
Window.Status=“x=“&Window.Event.OffsetX&“y=“&Window.Event.OffsetY
End Sub
</SCRIPT></HEAD><BODY>
<P ALIGN=“CENTER“><A HREF=““ NAME=“Ssilka“
<FONT SIZE=“5“> Гиперссылка</FONT></A> </P></BODY>
</HTML>
Объект представляет собой массив якорей документа (отсчет с нуля).
Свойства (только для чтения)
Count, Length число якорей в массиве объекта Anchors.
Name имя якоря (Document.Anchors(2).Name).
Объект представляет собой массив форм документа (отсчет с нуля).
Свойства (аналогичны соответствующим атрибутам тега <FORM>)
Action ссылка на серверный сценарий или CGIприложение, обрабатывающее данные, переданные из формы (Document.FormTovar.Action=” http://www.usue.ru/CGI-BIN/FormTovar.CGI”).
Elements ссылка на объект Element, содержащий массив встроенных элементов тега <INPUT> и ActiveX тега <OBJECT>.
Encoding способ представления формы.
Method метод передачи данных из формы серверу (GET, POST).
Target окно или фрейм, используемый для результатов обработки формы.
Метод Submit позволяет отправить данные из формы на сервер.
Событие Submit возникает перед работой метода Submit (контроль пересылаемых данных).
Объект представляет собой массив элементов формы (отсчет с нуля) и является дочерним по отношению к объекту Forms.
Свойство Count (Length) возвращает число элементов (Window.Document.FormTovar.Elements.Count или Document.Forms(0).Elements.Count).
К элементу можно обращаться по его имени (Window.Document.FormTovar.Knopka).
Свойства общие для элементов объекта Elements
Form ссылка на родительскую форму для получения доступа к ее свойствам (Window.Document.FormTovar.Knopka.Form.Method=”Get”).
Name, Value имя и надпись на кнопке или значение поля ввода.
1.6.10.1. Кнопки (Button, Reset, Submit)
Существуют три типа кнопок: обычная (Button), сброса значений элементов формы (Reset) и передачи данных из формы на сервер (Submit).
Метод Click программно имитирует щелчок пользователя по кнопке без генерации события OnClick.
Пример работы с кнопками (рис. 1.6.10.1.1). В поле NadpisKnopka3 вводится наименование нижней кнопки Knopka3. Верхняя кнопка Knopka1 заменяет название кнопки Knopka3. Средняя кнопка Knopka2 выводит свойства кнопки Knopka3. Кнопка Knopka3 передает данные на сервер.
<HTML><HEAD><TITLE>Работа с кнопками</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka1_OnClick формирование имени нижней кнопки Knopka3
Document.Form1.Knopka3.Value=Document.Form1.NadpisKnopka3.Value
End Sub
Sub Knopka2_OnClick вывод сообщения со свойствами нижней кнопки
NS = chr(13) + chr(10)
S = “Имя кнопки: “ & Document.Form1.Knopka3.Name & NS & _
“Число элементов в форме: “ & _
Document.Form1.Knopka3.Form.Elements.Length & NS & _
“Надпись на кнопке: “ & Document.Form1.Knopka3.Value
MsgBox s,0, “Свойства нижней кнопки“
End Sub
Sub Knopka3_OnClick: Alert “Щелчок по нижней кнопке“: End Sub
</SCRIPT></HEAD><BODY BGCOLOR=“WHITE“>
<FORM NAME=“Form1“>
<P ALIGN=“CENTER“>
<INPUT TYPE=“TEXT“ NAME=“NadpisKnopka3“ VALUE=““>
<INPUT TYPE=“BUTTON“ NAME=“Knopka1“
VALUE=“Заменить надпись нижней кнопки“></P>
<P ALIGN=“CENTER“> <INPUT TYPE=“BUTTON“
NAME=“Knopka2“ VALUE=“Вывести свойства нижней кнопки“></P>
<P ALIGN=“CENTER“>
<INPUT TYPE=“submit“NAME=“Knopka3“VALUE=“Кнопка Submit“></P>
</FORM></BODY>
</HTML>
Рисунок - 1.6.10.1.1. Вид страницы после нажатия средней кнопки
1.6.10.2. Переключатели (CheckBox, Radio)
Свойство Checked выбран (True) или нет (False) переключатель.
Метод Click программно имитирует щелчок пользователя по кнопке без генерации события OnClick.
Пример работы с двумя независимыми переключателями и с кнопками установки, сброса всех флажков и вывода установленных флажков.
<HTML><HEAD><TITLE>Независимые переключатели</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka1_OnClick обработка кнопки установки всех флажков
For i=0 to 1:Document.Form1.Elements(i).Checked=True:Next:End Sub
Sub Knopka2_OnClick обработка кнопки сброса всех флажков
For i=0 to 1: Document.Form1.Elements(i).Checked=False:Next:End Sub
Sub Knopka3_OnClick обработка кнопки вывода выбранных флажков
NS=chr(13)+chr(10): S=“Выбраны флажки: “+NS
For i=0 to 1: If Document.Form1.Elements(i).Checked Then _
S=S+Document.Form1.Elements(i).Value+NS
Next: Alert S: End Sub
</SCRIPT></HEAD>
< BODY>
<FORM NAME=“Form1“><P ALIGN=“CENTER“>
<TABLE> <TD>Флажок 1<TD><INPUT TYPE=“checkbox“
NAME=“Flag1“ VALUE=“1“><TR>
<TD>Флажок 2<TD><INPUT TYPE=“checkbox“
NAME=“Flag2“ VALUE=“2“><TR> </TABLE> </P>
<P ALIGN=“CENTER“> <INPUT TYPE=“BUTTON“ NAME=“Knopka1“
VALUE=“Установить все флажки“>
<INPUT TYPE=“BUTTON“ NAME=“Knopka2“ VALUE=“Сброс флажков“>
<INPUT TYPE=“BUTTON “NAME=“Knopka3“ VALUE=“Вывод флажков“> </P>
</FORM>
</BODY>
</HTML>
Пример работы с двумя зависимыми переключателями (изменения цвета фона формы) и с кнопкой восстановления первоначального вида.
<HTML>
<HEAD><TITLE>Зависимые переключатели</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub RadioColor(i)обработка события OnClick для iго переключателя
If i = 0 Then Document.BgColor=“Red“ выбран первый переключатель
If i = 1 Then Document.BgColor=“Green“ выбран второй переключатель
End Sub
Sub Knopka_OnClick обработка кнопки восстановления формы
Document.BgColor = “White“
Document.Forms(0).Elements(0).Checked = True
End Sub
</SCRIPT>
</HEAD>
<BODY BGCOLOR=“WHITE“>
<FORM METHOD=“POST“> <P ALIGN=“CENTER“>
<FONT SIZE=“6“>Цвет фона</FONT></P> <P ALIGN=“CENTER“>
<INPUT TYPE=“radio“ ONCLICK=“RadioColor(0)“
CHECKED NAME=“CvetFona“ VALUE=“K“
<FONT SIZE=“4“>Красный</FONT> <BR>
<INPUT TYPE=“radio“ ONCLICK=“RadioColor(1)“
CHECKED NAME=“CvetFona“ VALUE=“Z“
<FONT SIZE=“4“>Зеленый</FONT></P>
<P ALIGN=“CENTER“><INPUT TYPE=“BUTTON“
NAME=“Knopka“ VALUE=“Сброс“></P>
</FORM>
</BODY>
</HTML>
1.6.10.3. Поля ввода (Text, TextArea, Password)
Методы Blur/Focus, Select потеря/установка фокуса, выделение текста в поле.
Пример работы с полями (рис. 1.6.10.3.1).
Рисунок - 1.6.10.3.1. Вид страницы с полями ввода
<HTML>
<HEAD><TITLE>Пример полей ввода</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Knopka1_OnClick обработка кнопки добавления поля в область
Document.Form1.TextA.Value = Document.Form1.TextA.Value + _
Document.Form1.TextT.Value: Document.Form1.TextT.Value = ““
End Sub
Sub Knopka2_OnClick: Document.Form1.TextA.Select: End Sub выделение
Sub Parol_OnChange добавление текста пароля в область редактирования
Document.Form1.TextA.Value = Document.Form1.TextA.Value + _
“Пароль: “+Document.Form1.Parol.Value: Document.Form1.Parol.Value=““
End Sub
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME=“Form1“>
<P ALIGN=“CENTER“><TEXTAREA ROWS=“3“ COLS=“50“
NAME=“TextA“> Начальное значение области </TEXTAREA> </P>
<P ALIGN=“CENTER“>
<INPUT TYPE=“TEXT“ NAME=“TextT“ VALUE=“Начальное значение“>
<FONT COLOR=“BLUE“ SIZE=“3“>
<B>Текстовое поле</B></FONT><BR>
<INPUT TYPE=“PASSWORD“ NAME=“Parol“>
<FONT COLOR=“BLUE“ SIZE=“3“>
<B>Пароль</B></FONT><BR> </P>
<P ALIGN=“CENTER“>
<INPUT TYPE=“BUTTON“ NAME=“Knopka1“ VALUE=“Добавить в область“>
<INPUT TYPE=“BUTTON“ NAME=“Knopka2“
VALUE=“Выделить область“> </P>
</FORM>
</BODY>
</HTML>
1.6.10.4. Списки выбора (Select)
Свойства
Length число элементов в списке.
SelectIndex номер выбранного элемента массива Options (отсчет с нуля).
Options массив элементов списка, который имеет следующие свойства: число элементов в списке (Length), признак выбора (1) или не выбора (0) элемента (Selected), номер выбранного элемента (SelectIndex), значение элемента (Text).
Методы Focus/Blur активизация/деактивизация элемента списка.
Пример использования списка арифметических операторов при работе калькулятора (рис. 1.6.10.4.1).
Рисунок - 1.6.10.4.1. Вид страницы калькулятора
<HTML>
<HEAD><TITLE>Калькулятор</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub Vih_OnClick обработка кнопки вычисления
oper=Document.Form1.Oper.Options _
(Document.Form1.Oper.SelectedIndex).Text
x=CDbl(Document.Form1.X.Value): y=CDbl( Document.Form1.Y.Value)
Select Case oper вычисление результата
Case “+“ : r= x+y : Case “-“ : r=x-y : Case “*“ : r=x*y : Case “/“ : r=x/y
Case “^“ : r=x^y : Case “ln“: r=LOG(x)
End Select
Document.Form1.R.Value=r вывод результата в поле R
End Sub
</SCRIPT>
</HEAD>
<BODY>
<P ALIGN=“CENTER“> <FONT SIZE=“5“>Калькулятор</FONT></P>
<FORM NAME=“Form1“> <P ALIGN=“CENTER“>
<INPUT TYPE=“TEXT“ SIZE=“12“ NAME=“X“> <BR>
<SELECT NAME=“Oper“ SIZE=“1“> <OPTION> + <OPTION> -
<OPTION>*<OPTION>/<OPTION>^ <OPTION>ln </SELECT> <BR>
<INPUT TYPE=“TEXT“ SIZE=“21“ NAME=“Y“> <BR> = <BR>
<INPUT TYPE=“TEXT“ SIZE=“21“ NAME=“R“> </P>
<P ALIGN=“CENTER“>
<INPUT TYPE=“button“ NAME=“Vih“ VALUE=“Вычислить“>
<P ALIGN=“CENTER“> <INPUT TYPE=“reset“ NAME=“Ohistit“
VALUE=“Очистить“> </P>
</FORM>
</BODY>
</HTML>
Application объект (приложение) создает переменные приложения, доступные всем пользователям.
Пример.
<%Application.Lock блокировка приложения
Application.(“Time”)=Now объявление переменной Time=Now
Application.UnLock разблокировка приложения
%>
Event объект используется для получения дополнительной информации о произошедшем событии.
Основные свойства
FromElement/ToElement возвращает имя элемента, который покидает/находится указатель мыши в событиях MouseOut или MouseOver.
Button возвращает кнопку мыши, операция с которой вызвала событие.
SrcElement возвращает элемент, вовлеченный в событие.
X, Y определяет координаты мыши.
ShiftKey, CtrlKey, AltKey возвращает True, если при возникновении события была нажата клавиша Shift, Ctrl или Alt соответственно.
Request объект (запрос) используется для разбора полученных данных от клиента. Передача данных реализуется кнопкой типа Submit или одноименным методом объекта Forms. При этом значения всех текстовых полей формы упаковываются в виде <имя поля>=<значение поля> и передаются на сервер в формате открытого текста. Этот текст и разбирает данный объект. Его основное свойство Form (имя поля) возвращает значение указанного поля в форме (п. 1.9).
Response объект (ответ) управляет содержимым страницы, которую ASP возвращает браузеру.
Основные свойства объекта Response
ReturnValue позволяет передать значение (-1 истина, 0 ложь) из обработчика события.
Expires время устаревания страницы в кэше (0 устаревает немедленно, что заставляет обновлять страницу при ее повторном использовании).
Status устанавливает строку состояния, передаваемую сервером.
Основные методы объекта Response
Write записывает текстовую информацию в HTMLдокумент. Для сокращения записи можно использовать знак равно вместо Response.Write (две следующих записи будут эквивалентны: =”<P>” и Response.Write ”<P>”).
AddHeader добавить к странице заголовок.
BinaryWrite записать в страницу двоичные данные для объектов
Clear стирает данные в буфере вывода ASPстраницы.
End прекращает работу ASPстраницы и посылает результат клиенту.
Flush пересылает данные буфера клиенту и очищает буфер.
Redirect URL переход клиента по заданному адресу.
Server объект (сервер) содержит функции по обслуживанию сервера.
Основные методы объекта Server
CreateObject(ProgID) создание экземпляра компонента ActiveX для использования его в ASPсценарии (п. 1.9).
Transfer (URL) переход клиента по заданному адресу.
Execute (URL) выполнить указанную страницу как часть текущей.
Для работы с текстовым файлом с разделителями используется ActiveXэлемент Tabular Data Control (TDC).
Свойства
DataURL адрес текстового файла.
FieldDelim символразделитель полей (,).
FilterColumn имя поля, по которому производится фильтрация данных.
FilterCriterion - операция сравнения в фильтре (=, <>, >, <, >=, <=).
FilterValue значение, с которым сравнивается значение поля.
RowDelim символ конца записи, по умолчанию возврат каретки.
SortColumn, SortAscending имя поля сортировки и порядок сортировки: по возрастанию (True) или убыванию (False).
TextQualifier символ, ограничивающий значение текстового поля (“).
UseHeader первая строка содержит имена полей (True).
Метод Reset - пересортировка данных.
Пример. Составим страницу (рис. 1.8.1) для просмотра текстового файла с фамилиями и телефонами (рис. 1.8.2).
Рисунок - 1.8.1. Вид страницы просмотра Рисунок - 1.8.2.Телефоны
<HTML><HEAD><TITLE>Список телефонов</TITLE>
<SCRIPT LANGUAGE=“VBScript“>
Sub KnopkaNext_OnClick 'процедура обработки кнопки “Вперед”
form1.data1.recordset.MoveNext метод перехода к следующей записи
if.form1.data1.recordset.EOf then Form1.data1.recordset.moveLast
End Sub
Sub KnopkaPrev_OnClick 'процедура обработки кнопки “Назад”
form1.data1.recordset.MovePrevious
if form1.data1.recordset.BOf then Form1.data1.recordset.moveFirst
End Sub
</SCRIPT>
<BODY>
<FORM NAME=“Form1“>
<OBJECT ID=“Data1“
ClassID=“CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83“>
<PARAM Name=“DataURL“ Value=“C:\My Documents\HTML_primer\telefon.txt“>
<PARAM Name=“UseHeader“ Value=“True“>
</OBJECT>
<INPUT TYPE=“text“ SIZE=“30“ DATASRC=#Data1 DATAFLD=“Fam“>
<INPUT TYPE=“text“ SIZE=“6“ DATASRC=#Data1 DATAFLD=“Tel“><P>
<INPUT TYPE=“button“ NAME=“KnopkaPrev“ VALUE=“Назад“>
<INPUT TYPE=“button“ NAME=“KnopkaNext“ VALUE=“Вперед“> </P>
</FORM>
</BODY>
</HTML>
Для работы с базой обычно используется компонент ADO. Для иcпользования именованных констант компонента ADO следует подключить файл ADOVBS.INC с описанием этих констант командой:
<!-- #INCLUDE FILE=“ADOVBS.INC“-->
Пример ASPстраницы вывода в алфавитном порядке фамилий сотрудников с адресами в табличной форме из таблицы Sotrudniki базы Kadri (СУБД Access), выполняемой на сервере.
<!-- #include file=“adovbs.inc“-->
<HTML><HEAD><TITLE> Таблица сотрудников </TITLE></HEAD> <BODY>
<TABLE BORDER> <!-- заголовок таблицы-->
<TR> <TD><B> Фамилия </TD><TD> Адрес</B> </TD> </TR><BR>
<% Set rs = Server.CreateObject(“ADODB.RecordSet“) 'создание объекта RS
rs.Open “Select Fam, Adress From Sotrudniki Order By Fam“,”DSN=Kadri”
Do Until rs.EOF цикл чтения и формирования строк таблицы
Response.write(”<TR><TD>” & rs.Fields(“Fam”) & ”</TD>” & _ колонка 1
“<TD>” & rs.Fields(“Adress”) & ”</TD></TR><BR>” колонка 2
rs.MoveNext переход к следующей записи таблицы
Loop конец цикла чтения строк таблицы
rs.close: set rs = Nothing закрытие набора
%>
</TABLE> </BODY></HTML>
Пример добавления записей с помощью ASP и формы HTML. Вначале создадим форму для ввода данных о новом сотруднике. Атрибут Action указывает на файл AddSotrudniki.asp с текстом ASPстраницы, которая и будет добавлять новую запись о сотруднике в базу.
<HTML><HEAD><TITLE> Добавление записей </TITLE></HEAD>
<BODY>
<FORM METHOD=post ACTION=“/Pleshev/AddSotrudniki.asp“
<P> Фамилия <INPUT TYPE=“text“ NAME=“ZFam“><BR>
Адрес <INPUT TYPE=“text“ NAME=“ZAdress“> <BR>
<INPUT TYPE=“submit“ NAME=“Save“ Value=“Сохранить“ </P>
</FORM>
</BODY>
</HTML>
Создадим ASPстраницу (файл AddSotrudniki.asp), которая будет переносить данные из формы в базу.
<!-- #include file=“adovbs.inc“-->
<HTML> <HEAD> <TITLE> Включение записей </TITLE></HEAD>
<BODY>
<% Set rs = Server.CreateObject(“ADODB.RecordSet“) 'создание объекта RS
Set cn = Server.CreateObject(“ADODB.Connection“) 'создание объекта CN
cn.Open ”DSN=Kadri;” : Set rs.ActiveConnection=cn
rs.CursorType=adOpenKeyset: rs.LockType=adLockOptimistic
rs.Source=”Sotrudniki” : rs.Open открытие таблицы Sotrudniki
rs.AddNew добавление пустой записи
rs.Fields(“Fam”)=Request.Form(“ZFam”) ZFAM посылается в поле Fam
rs.Fields(“Adress”)=Request.Form(“ZAdress”) ZAdress посылается в Adress
rs.Update сохранение записи в таблице Sotrudniki
генерация страницы с результатами выполнения операции добавления
Response.write(rs.Fields(“Fam”) & “<BR>” & rs.Fields(“Adress”) & “<BR>” & _
”<P>Подтверждение сохранения записи </P>”)
rs.close: cn.close: set cn=Nothing : set rs=Nothing закрытие набора
%>
</BODY>
</HTML>
Рассмотрим основные элементы окна среды (рис. 1.10.1.1).
Рисунок - 1.10.1.1. Окно среды Dreamweaver
Палитра объектов содержит объекты, которые размещаются на странице. Она имеет несколько разных вариантов (панелей), которые могут быть открыты при помощи выпадающего списка в верхней части палитры объектов.
Рассмотрим панели этой палитры [3].
Панель Common objects основные объекты (слева направо, сверху вниз).
Image (картинка) - графический элемент.
Rollover Image (перекатыш) - конструкция, которая имитирует анимированную кнопку, изменяющую свой вид при наведении на нее.
Table, Tabular data таблица, готовая таблица с данными (например, из Exсel).
Navigation Bar - навигационная панель.
Horizontal Rule (линейка) - декоративный элемент - линейка (обычно используется как разделитель абзацев).
Draw Layer - вставляет на страничку слой (как в PhotoShop).
Line Break - вставляет в тексте мягкий перенос.
E-mail Link - ссылка на электронный адрес.
Date (дата) - вставка в документ текущей даты.
Flash/ShockWave - вставляет флэш/Shockwave-анимацию.
Generator/FireWorks - вставляет заготовку Generator/объект FireWorks.
Applet/ActiveX - вставляет Java-апплет/ActiveX.
Plugin - вставляет объект, проигрываемый плагином.
SSI - вставляет внешний HTMLфайл.
Панель Invisibles позволяет добавлять в исходный код странички: закладки, комментарии, ява-скрипты, неразрывные пробелы.
Панель Head помогает добавлять различные описания и свойства странички (такие, как мета-теги, ключевые слова, описания странички), устанавливать параметры обновления странички, указывать базовую ссылку (ссылку по умолчанию),
указывать ссылки и др.
Панель forms объекты, размещаемые на форме.
Form, Text field, Button форма, текстовое поле, кнопка. Checkbox, Radio button переключатель, радиокнопка.
List/Menu, Filefield выпадающий список/меню, ввод данных. Imagefield, Hidden filed поле картинки, скрытое поле.
Jump menu переход по щелчку мышки на другую страничку.
Поле Category окна настройки Preferences содержит заголовки страниц параметров настройки (рис. 1.10.2.1).
Рассмотрим некоторые страницы настройки.
На странице General (Рисунок - 1.10.2.1) чаще настраивают параметры:
Options и Add Extension when saving - при сохранении документов автоматически будет добавляться указанное расширение файла.
Maximum Number of History Steps число запоминаемых шагов для возможности восстановления нужного шага для исправления ошибки (рекомендуется увеличить это число, например до 100).
Страница CSS Styles (рис. 1.10.2.2) устанавливает возможность использования сокращенной записи некоторых CSS стилей (п. 1.2.14).
Рисунок - 1.10.2.1. Страница General окна настройки
Рисунок - 1.10.2.2. Страница CSS Styles окна настройки
Страница Fonts/Encoding (рис. 1.10.2.3) позволяет настроить тип кодировки символов и основные шрифты, которыми будет отображаться текст и размеры этих шрифтов. Поле Default Encoding нужно установить кодировку Windows-1251 при работе под Windows. Если вы настроите не так как нужно, то Dreamweaver просто начнет автоматически перегонять набранный вами текст в коды (например, можно получить “iieiue eca?ao”).
Рисунок - 1.10.2.3. Страница Font/Encoding окна настройки
Рассмотрим основные средства и приемы работы с Dreamweaver на основе инструкционных материалов, подготовленных С.И. Рыковым.
Вначале создадим каталоги для элементов сайта (рис. 1.10.3.1).
Риc. 1.10.3.1. Структура каталогов с элементами сайта
В корневом каталоге Test разместим веб-страницы (.HTML-файлы), в каталоге Images - картинки (фотографии, элементы дизайна и многое другое) и в каталоге CSS файлы стилей (п. 1.2.14).
Для начала работы со страничкой нужно иметь структуру этой странички. Делается эта структура при помощи модульной сетки. Рассмотрим пример такой сетки (рис. 1.10.3.2).
Рисунок - 1.10.3.2. Пример модульной сетки
Logo - логотип странички (броский рисунок для привлечения внимания).
Menu, SubMenu - главное меню сайта и подменю текущего раздела.
Text - основное наполнение, занимает весь экран (контент).
Copyright - "подвальный" раздел для баннеров, кнопок, копирайтов и др.
Для начала войдите в свой сайт (выберите его из списка) и создайте новый файл командой New File. На панели справа появится файл Untitled.Htm, который стоит сразу переименовать в Index.Htm или Default.Htm (так обычно указывается название первой головной странички сайта). Двойным щелчком открываем созданный файл и видим чистый белый лист (заготовка документа), на котором будем создавать нашу страничку.
Зададим основные свойства нашей странички командой Modify/Page Properties (^J) и появится окно свойств (рис. 1.10.4.1).
Рисунок - 1.10.4.1. Окно свойств
Title - название странички, отображаемое в заголовке окна браузера.
Background Image - фоновый рисунок (не используем).
Background/Text - цвет фона/текста (белый/черный).
Links - цвет ссылок (темно-синий).
Visited Links - цвет посещенных ссылок (фиолетовый).
Active Links - цвет текущей активной ссылки (темно-красный).
Left/Top Margin, Margin Width/Height - отступ от края страницы до начала контента слева/сверху и его ширина/высота.
Document Encoding - кодировка документа.
Tracing image - кладет на фон полупрозрачную картинку для точного совмещения дизайна в HTML с наброском, сделанным в PhotoShop.
Разместим на форме таблицу. Появится окно свойств (рис. 1.10.5.1).
Рисунок - 1.10.5.1. Окно свойств создаваемой таблицы
Зададим свойства таблицы: 3 ряда (Rows), 2 колонки (Columns), отступы (Cell Padding, Cell Spacing) и бордюр (Border) нулевые, ширина (Width, Percent) таблицы 100% (весь экран). Эти данные полностью совпадают с тем, что мы планировали в начале при разработке модульной сетки.
После нажатия на OK вы получите пустую таблицу, которую нужно форматировать, корректировать и заполнять элементами.
Выделите колонку слева: подводите курсор мышки к самой верхней границе колонки, дожидаетесь появления стрелочки вниз и нажимаете левую кнопку мышки. Можно выделить отдельные ячейки, нажав клавишу Ctrl и, не отпуская ее, щелкайте мышкой по нужным ячейкам.
После выделения укажите ширину колонки - 247 Pix в поле Width нижней плавающей панели - свойства (это поле выделено рамкой).
Проделайте ту же операцию со второй колонкой, только теперь укажите ширину 100%.
Теперь займемся рядами. Для начала щелкните на любой из ячеек верхнего ряда. В левом нижнем углу окна Dreamweaver появится список <body><table><tr><td>. Этот список демонстрирует все теги HTML, которые являются более старшими по отношению к текущему тегу, т.е. показывают иерархию документа. Нажав на <tr> мы сразу получаем выделенный ряд.
Зададим верхнему ряду фон. Для этого снова обратите свое внимание на нижнюю панель - свойства. Там есть поле Bg (background). Нажав на значок папки, вы можете указать файл, который будет играть роль фона. В нашем случае это top_back.gif. То же самое можно сделать, нажав на перекрестье рядом и потянув стрелочку, указать на панели менеджмента сайта нужный файл. В результате верхний ряд таблицы будет залит нужным фоном.
Отформатируем нижний ряд. Для этого выделите его, выберите нижнее поле Bg, а не верхнее, которое использовали для выбора картинки. При нажатии на квадратик со стрелочкой вы увидите меню подобное тому, что изображено выше. Обязательно выключите указанную на рисунке кнопку (нам в данном случае это не нужно). Появившимся курсором пипеткой щелкните по синей части верхнего фона, после чего ваш нижний ряд будет закрашен синим цветом части верхнего фона.
Рассмотрим некоторые приемы работы с таблицами.
Пример. Выделим две ячейки первого столбца, объединим их, покрасим в какой-нибудь цвет и сделаем симметрично с другой стороны то же самое.
Сначала выделяем нужные ячейки. Затем нажимаем на кнопку, указанную на картинке, можно еще и закрасить ячейки.
Выделяем, выбираем цвет. Получаем нужный результат.
Пример копирования ячеек. Выделяем нужный ряд или колонку, копируем ее в буфер (Ctrl+Insert), вставляем ее из буфера (Shift + Insert).
Выберите первую ячейку и разместите в ней поле картинки с логотипом My homepage
Выберите правую верхнюю ячейку таблицы, для которой отвели место под меню. В свойствах измените горизонтальное и вертикальное выравнивание налево и вниз соответственно. Курсор сместится в левый нижний угол ячейки. Напишите текст, состоящий из названий основных
разделов и ссылок на них. Обратите внимание, что текст прижат к нижней части ячейки и целиком находится на синем поле фона. После написания текста измените в
свойствах его форматирование с None на Paragraph. В HTML это означает заключение текста в тег <P></P>. Это позволяет получить строку, с которой будет просто, удобно и легко работать в дальнейшем.
Внешний вид меню можно улучшить: немного приподнять над краем ячейки, покрасить в другой более контрастный цвет и т.п. Сделать это можно при помощи CSS Styles (CSS - стилей). Находятся они в правой нижней части окна Dreamweaver. Нажмите кнопку Show CSS Style, и появится окно CSS Style (рис. 1.10.8.1). Нажмем кнопку New Style, и появится окно New Style (рис. 1.10.8.2).
Рисунок - 1.10.8.1. Окно SCC Styles Рисунок - 1.10.8.2. Окно New Style
Выбираем Make Custom Style и опеределим его (рис. 1.10.8.3).
Рисунок - 1.10.8.3. Окно определения стиля меню
Выделяем наше меню нажатием на букву <P> в нижнем левом углу окна. В панели стилей просто выбираем наш стиль (Menu). Таким образом, стиль на параграф текста мы назначили. Можно проверить, как все это выглядит в браузер, нажав клавишу F12.
Зададим параметры еще нескольким элементам. В отличие от предыдущего раза, когда мы делали свой стиль, теперь мы будем переназначать уже готовый стиль, например стиль параграфа (<P>). Для этого создаем новый стиль, выбираем пункт Redefine HTML Tag и тег P (рис. 1.10.8.4).
Рисунок - 1.10.8.4. Окно New Style
Для параграфа мы укажем конкретный шрифт (Font), размер (Size) и цвет (Color) (рис. 1.10.8.5).
Рисунок - 1.10.8.5. Окно New Style
Кроме параграфа, изменим теги a:link и a:hover. Эти теги отвечают за внешний вид ссылки в стандартном состоянии и в состоянии при наведенной на нее мышки соответственно. Зададим цвет ссылок (белый) и при наведении сделаем изменение Decoration с None на Underline.
Укажем ссылки на основные страницы нашего сайта. Делается это просто - выделяете нужный текст (если это одно слово, то можно просто пару раз щелкнуть по нему мышкой) и пишете в свойствах ссылку. Самих файлов у нас пока (реально на диске) нет, поэтому мы именно пишем нужные нам названия (а не ищем их на диске).
Наша последняя задача - облегчить установку и изменение (при необходимости) нашего меню. Ее можно решить при помощи удобного инструмента Dreamweaver под названием “Библиотека“ (Library).
В появившемся окне нажимаем кнопку создания нового элемента (наше меню должно быть целиком выделено). Все, осталось только назвать наш элемент и при необходимости вставлять его в любой документ при помощи кнопки Insert. Все изменения, которые мы будем вносить в наш элемент, автоматически вносятся во все страницы, на которых он используется.
1.10.9. Форматирование текста
Для создания стиля используется окно New Style (рис. 1.10.9.1).
Рисунок - 1.10.9.1. Окно создания нового стиля
Можно выбрать один из трех вариантов - создать новый стиль, переназначить свойства стандартного HTML-тега и использовать специальные расширения CSS.
После указания имени вашего стиля или выбора стандартного стиля для переназначения появится многостраничное окно настройки стиля. За результатами изменения стиля можно наблюдать в режиме Realtime. Если поле окна настройки помечено звездочкой, это означает, что данный вариант не отображается визуально в Dreamweaver и его нужно проверить в браузере. Рассмотрим страницы окна настройки.
Страница Type определяет вид отдельной буквы: шрифт (конкретный или предлагаемый), размер шрифта (в процентах, пикселями, пунктах и др.), толщина буквы, стиль написания (наклонный, стандартный), вариации написания (например, весь текст набран только строчными или только заглавными буквами), высота базовой линии шрифта (в пунктах, пикселях и др.), регистр букв (большие, маленькие или те и другие), декор (подчеркивание, мигание и пр.), цвет текста (рис. 1.10.9.2).
Рисунок - 1.10.9.2. Страница Type
Страница Background определяет фон всей странички или только заданного абзаца текста: цвет фона (выбираете вариант из стандартных 256 цветов или создаете свой цвет), файл с фоновым изображением, настройку повторения фонового изображения по странице (например, можно задать, чтобы изображение копировалось только по оси X)*, поведение фонового изображения при прокрутке страницы (прокручивается вместе с ней или стоит на месте)*, горизонтальную и вертикальную позицию начала фона, параметры блока текста (расстояние между словами, буквами, вертикальное и горизонтальное выравнивание строки текста, отступ первой строки текста, расстановка дополнительных пробелов между словами и предложениями) (рис. 1.10.9.3).
Страница Box устанавливает ограничения данного куска текста на странице: ширина и высота прямоугольника с текстом, выключки влево или вправо и поведение текста при использовании элемента с выключкой влево или вправо (как текст обтекает подобный объект), отступ от края прямоугольника до расположенных рядом других элементов, отступ от краев прямоугольника до текста (Рисунок - 1.10.9.4).
Рисунок - 1.10.9.3. Страница Background
Рисунок - 1.10.9.4. Страница Box
Страница Border позволит создать бордюр вокруг элемента со всеми необходимыми вам настройками: ширина и цвет бордюра слева, справа, сверху и снизу, стиль бордюра, настройка списков (нумерованного, маркерованного), формат маркера, использование в качестве маркера картинки, позиционирование маркера.
Страница Positining задает местоположение объекта на страничке: тип позиционирования (относительное, абсолютное и т.д.), расположение по Z-координате (в каком слое будет находиться объект), видимый или невидимый объект (может использоваться для создания пустых полей в документе), обработка переполнения (текст весь не помещается), расположение объекта (указание координат вершины, ширины и высоты), отступы со всех сторон в пикселях или других единицах.
Последняя страница задает указание обрыва страницы (в основном для печати) и визуальный эффект - при наведении на объект курсора он может менять свою форму или при загрузке объекта срабатывает один из стандартных фильтров (последнее верно только для Internet Explorer).
Пример создания “Буквицы” для каждого нового параграфа.
Зададим характеристики шрифта (рис. 1.10.9.2). В качестве фона выберем более светлый цвет, чем цвет самого текста (рис. 1.10.9.3). На странице Box укажем, что сам элемент будет сдвинут влево, а элементы вокруг него будут сдвигаться вправо (рис. 1.10.9.4).
При нажатии кнопки Behaviors появится диалоговое окно (рис. 1.10.10.1) В нем можно добавить реакцию на различные события применительно к данному объекту, выбрать, для каких браузеров создаются скрипты и др.
Рисунок - 1.10.10.1. Окно Behaviors и его меню
Для примера сделаем так, чтобы при наведении на пункт меню в строке состояния брoузера выводилось подробное описание данного пункта. Для этого выбираем одну из ссылок меню (например, Новости).
Нажмем кнопку с плюсом (Добавить) и выполним команду Set Text/Set Text of Status Bar (рис. 1.10.10.1). Введем текст, который должен появляться в строке состояния браузера и нажимаем кнопку OK.
Приведем список остальных режимов: Call Javascript (вызов внешнего ява-скрипта по событию), Change Property (изменение свойств объекта), Check Browser (определение типа браузера для перенаправления пользователя на страничку наиболее ему подходящую), Check Plugin (проверяет наличие плагина, например для проигрывания Flash), Control ShockWave or Flash (управление фильмами или флэш ), Drag Layer (перемещает слой), Go To Url (переход по ссылке), Jump Menu, Jump Menu Go (изменение меню), Open Browser Window (открывает окно браузера с заданными размерами и прочими параметрами).
Команды разбиты на несколько групп: создание автоматизированных скриптов, получение дополнительных команд, работа с исходным текстом HTML, работа с таблицами, установка цветовой гаммы сайта и др. (рис. 1.10.11.1).
Рассмотрим некоторые команды.
Start Recording макросы подобные в Word или Actions в PhotoShop: запускаем запись, выбрав команду Start Recording, выполняем нужные действия, выполняем команду Stop Recording. Можно записать целиком создание дизайна для странички, и компьютер сам будет все повторить за вас. Если нужно получить несколько подобных команд, то следует: вызвать палитру History, выполнить несколько действий, выделить их, нажать на стрелочку в правом верхнем углу окна History, выполнить команду Save As Command.
Apply Web Photo Album
форматирование исходного текста. Но пользуйтесь ею аккуратно: если Dreamweaver выделяет часть тегов на вашей страничке желтым цветом, считая их неверными, то он при форматировании их удалит. А он бывает не всегда прав при определении ошибочных тегов.
Рисунок - 1.10.11.1. Меню команд
Format Table оформление всей таблицы. Можно выбрать как из стандартных видов, так и указать свои параметры.
Рисунок - 1.10.11.2. Окно форматирования
таблицы
Sort Table сортировка данной колонки или ряда по заданной формуле. Очень удобно для различных алфавитных списков и т.д.
Set Color Sсheme выбор и применение цветового оформления (цвет фона, текста, ссылок) к страничке (команда похожа на Format Table).
Рисунок - 1.10.11.3. Окно сортировки
Диалоговое окно анимации вызывают командой Window/Timeline (^F9). Основные ее части: название текущей TimeLine, перемещение между кадрами, указание количества FPS.
Пример. Для начала создадим слой, нажав кнопку (рисунок кнопки слева). После этого зададим параметры этого слоя (рисунок справа. Обязательно дайте слою имя. Включим в слой картинку: щелкнули внутри слоя, нажали кнопку вставки картинки и указали нужную картинку.
Выделяем слой, щелкаем правой кнопкой по палитре TimeLine и выбираем пункт Add Object (добавлять можно только картинки и слои).
Переходим на нужный кадр и создаем в нем ключевой кадр (рисунок на пути перемещения объекта). Все промежуточные перемещения Dreamweaver сделает сам. Создадим несколько кадров, зададим для каждого свое положение слоя (простым перемещением его с места на место). Осталось задать частоту кадров (например, 20) и включить галочки AutoPlay и Loop. Посмотрим на результат. На самом деле можно делать более сложные анимационные вещи, перескакивать с кадра на кадр при нажатии определенных кнопок и многое другое.
Вопросы для самопроверки
Контрольные вопросы
Расмус Лердорф в 1995 году разработал РНР (Hypertext Processor). РНР лучше всего охарактеризовать как работающий на стороне сервера встроенный язык сценариев Web, позволяющий разработчикам быстро и эффективно строить динамические web-приложения. С позиций грамматики и синтаксиса РНР напоминает язык программирования С. Одним из главных достоинств РНР является тот факт, что он внедряется прямо в HTML-код.
Механизм РНР просто начинает выполнять код после первой экранирующей последовательности (<?) и продолжает выполнение до того момента, когда он встретит парную экранирующую последовательность (?>).
Хотя РНР обычно рекомендуется использовать в сочетании с HTML, он с таким же успехом интегрируется и в JavaScript, WML, XML и другие языки. Нет проблем и с зависимостью от браузеров, поскольку перед отправкой клиенту сценарии РНР полностью компилируются на стороне сервера. В сущности, сценарии РНР могут передаваться любым устройствам с браузерами, включая сотовые телефоны, электронные записные книжки, пейджеры и портативные компьютеры.
Поскольку РНР не содержит кода, ориентированного на конкретный web-сервер, пользователи не ограничиваются определенными серверами (возможно, незнакомыми для них). Apache, Microsoft IIS, Netscape Enterprise Server, Stronghold и Zeus РНР работает на всех перечисленных серверах. Поскольку эти серверы работают на разных платформах, РНР в целом является платформенно-независимым языком и существует на таких платформах, как UNIX, Solaris, FreeBSD и Windows 95/98/NT.
Средства РНР позволяют программисту работать с внешними компонентами, такими как Enterprise Java Beans или СОМ-объекты Win32.
Содержание данной главы сформировано на основе материалов портала ISO (http://www.iso.staratel.com/InfTech/php/PHP.htm).
При описание PHP в данной главе, устаревшие конструкции и форматы операторов не описываются.
Denwer (Денвер) - включает в себя набор дистрибутивов: инсталлятор (поддерживается также инсталляция на flash-накопитель); Apache, SSL, SSI, mod_rewrite, mod_php; PHP5 с поддержкой GD, MySQL, sqLite; MySQL5 с поддержкой транзакций; система управления виртуальными хостами, основанная на шаблонах; система управления запуском и завершением всех компонентов Денвера; phpMyAdmin (система управления MySQL через Web-интерфейс); эмулятор sendmail и SMTP-сервера (отладочная «заглушка» на localhost:25, складывающая приходящие письма в/tmp в формате .eml); поддерживается работа совместно с PHP, Perl, Parser и т.д.
Широко используется Web-разработчиками для разработки Web-приложений и сайтов на «домашней» (локальной) Windows-машине без необходимости выхода в Интернет. Главная особенность Денвера удобство при установке всех полностью взаимодействующих компонент Web-разработчика и удаленной работе сразу над несколькими независимыми проектами и возможность размещения на Flash-накопителе.
PHPTriad - всеобъемлющий пакет для Win32, который включает все актуальные средства разработки в Интернет: PHP, Apache, MySQL, phpMyAdmin. Самостоятельно инсталлируется и настраивается.
DevelStudio - позволяет создавать полноценные программы на языке PHP с поддержкой графического интерфейса.
Notepad++ - редакторов исходных текстов. Редактор поддерживает подсветку синтаксиса многих языков, в число которых входит и PHP. Но он не является полноценной средой разработки (notepad-plus-plus.org).
NetBeans ide - полноценная среда разработки. Для корректной работы NetBeans необходимо перед её установкой установить пакеты Sun JDK или J2EE SDK (netbeans.org).
PhpStorm - имеется удобная настройка и использование отладчика, работает быстро. Индивидуальная лицензия стоит 99$ (www.jetbrains.com).
Zend Studio - реализованы удобные подсказки и советы, содержащие не только текст, но и наглядные иллюстрации. Настраиваемый интерфейс также довольно удобен. Помимо PHP поддерживается редактирование HTML и JavaScript. Имеется возможность автоматического завершения наиболее востребованных элементов кода. Есть встроенный браузер, позволяющий видеть результаты обработки кода, не выходя из программы. Программа платная (www.zend.com).
Eclipse PDT содержит все инструменты для разработки. Редактор кода построен по такой схеме, что можно редактировать несколько файлов одновременно. Встроенный браузер показывает результаты обработки кода непосредственно в Eclipse PDT без необходимости перехода в штатный браузер компьютера. Поддерживается редактирование и синтаксическая подсветка для HTML и JavaScript. Производительность на порядок выше и все необходимые для разработки средства работают отлично. Имеет возможность подключения дополнительных модулей, расширяющих функционал. Коллекция плагинов для Eclipse поражает своим разнообразием и позволяет добавить как новые возможности по работе с PHP, так и с многими другими языками программирования (www.eclipse.org).
PHP Base Library - утилита для PHP-разработчиков.
PHP Coder - редактор и интегрированная среда для разработки скриптов на PHP. Автозавершение, менеджер проектов, подсветка синтаксиса, документация по языку. Требует интерпретатор PHP.
PHP Expert Editor - интерфейс и большинство функций заимствованы из DzSoft PHP Editor. Имеетя проверка синтаксиса и отладка с точками останова. В дистрибутив также входит DBG Listener.
PHPGeM - программа для ускорения создания PHP-скриптов, работающих с таблицами.
Все параметры конфигурации находятся в файле php.ini, который по умолчанию копируется в каталог /usr/local/lib/ в процессе установки.
Общие параметры конфигурации.
short_open_tag [on | off] - определяет возможность использования коротких тегов <?...?> наряду со стандартными тегами.
precision [integer] - задает количество значащих цифр, отображаемых в вещественных числах.
max_execution_time [integer] - определяет максимальную продолжительность выполнения сценариев РНР в секундах.
error_reporting [1-8] - определяет уровень выдачи сообщений об ошибках в РНР. Чем выше значение (1 - обычные ошибки; 2 - обычные предупреждения; 4 - ошибки лексического анализатора; 8 - замечания), тем «чувствительнее» РНР реагирует на ошибки.
display_errors [on | off] - управляет выводом информации об ошибках в браузере.
log_errors - определяет, следует ли регистрировать ошибки в файле. При включении параметра log_errors файл, в котором регистрируются ошибки, назначается при помощи параметра error_log.
error_log [filename] - определяет файл, в котором регистрируются ошибки при включенном параметре log_errors.
Существуют два основных варианта оформления перехода в РНР:
1) стандартные теги: <?php print "Добро пожаловать в мир PHP!": ?>;
2) Короткие теги: <? print " Добро пожаловать в мир PHP!"; ?>
По умолчанию короткие теги не используются, их нужно специально активизировать. Это можно сделать двумя способами: указать ключ - enable-short-tags при компиляции РНР или включить параметр short_open_tag в файл php.ini.
В РНР существуют два формата комментариев:
1) однострочные комментарии начинаются с двойного символа «косая черта» (//) или с символа фунта (#);
2) многострочные комментарии - их начало и конец обозначаются символами /* и */.
Основные правила написания программы: в именах переменных и функций большие и малые буквы различаются; в конце каждого оператора (команды) указывается точка с запятой (;); специального символа переноса оператора на другую строчку нет переность можно с любой позиции в которой можно указать пробел (слова не разрываются при переносе оператора); где можно задать один пробел можно задавать несколько пробелов.
Составной оператор (блок операторов) это группа простых или составных операторов, заключенная в фигурные скобки ({}). Составные операторы используются в случаях, когда по синтаксису написания команды требуется написание одного оператора, а необходимо написать группу операторов вот тогда эта группа оформляется в виде составного оператора, то есть заключается в фигурные скобки.
Общепринятые соглашения при описании синтаксиса.
Понятия оператора и команды считаются эквивалентными.
При описании синтаксиса оператора, функции или других программных объектов применяются следующие специальные символы, которые не вводятся в программу (если это не оговорено особо), но поясняют правила написания:
[…] необязательный элемент оператора;
… повторение предыдущего элемента оператора.
В РНР поддерживаются шесть основных типов данных:
1) Целое число не имеет дробной части и представляется последовательностью из одной или нескольких цифр.
Восьмеричные числа начинаются с цифры 0.
Шестнадцатеричные целые числа имеют префикс 0х или 0Х.
2) Вещественное число числа с плавающей точкой отличаются от целых наличием дробной части. Поддерживаются два вещественных формата:
стандартная запись - для представления типичных вещественных чисел скажем, денежных величин (12.45);
научная запись - для представления очень больших и очень малых чисел (5.9736е24).
3) Строковое значение - последовательность символов. Строки могут ограничиваться парой кавычек (" ") или апострофов (' '). Имена переменных в строках, заключенных в кавычки, заменяются соответствующими значениями, а строки в апострофах интерпретируются буквально, даже если в них присутствуют имена переменных,
Строки могут содержать служебные символы (например, \n - новая строка, \r - возврат курсора, \t - горизонтальная табуляция, \\ - обратная косая черта, \$ - знак доллара, \" кавычка).
В строках, заключенных в кавычки, распознаются все существующие служебные символы, а в строках, заключенных в апострофы, только служебные символы «\\» и «\».
Второй вариант синтаксиса ограничения строк, представленный в HTML 4, называется встроенной документацией. В этом варианте синтаксиса строка начинается с символов <<<, за которыми следует некоторый идентификатор, затем строка, присваиваемая переменной. Конструкция заканчивается вторым экземпляром того же идентификатора.
Пример:
$paragraph = <<<DELIM
………
DELIM;
Выбранный идентификатор не должен присутствовать в присваиваемой строке и первый символ завершающего идентификатора (DELIM) должен находиться в первом столбце строки, завершающей конструкцию.
К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией ($s[4]).
4) Массив - список однотипных элементов. Существует два типа массивов, различающиеся по способу идентификации элементов - c числовым и ассоциативным индексом, заключенного в кавычки. По размерности массивы делятся на одномерные и многомерные.
При обращении к элементам одномерных индексируемых массивов используется целочисленный или ассоциативный индекс позицию заданного элемента. Обобщенный синтаксис элементов одномерного массива: $имя [индекс1]; Одномерные массивы создаются присвоением значений элементам. При создании массивов также можно воспользоваться функцией array (). Массив $meat из предыдущего примера создается командой
$mstud = array("Иванов", "Петров", "Сидоров"); или для ассоциативного
$mstud = array(1->"Иванов", 2->"Петров", 3->"Сидоров");
Чтобы включить новый элемент в конец массива, можно просто присвоить значение переменной массива без указания индекса.
Многомерные индексируемые массивы работают практически так же, как и их одномерные прототипы, однако элементы в них определяются несколькими индексами вместо одного.
Обобщенный синтаксис элементов многомерного массива:
$имя[индекс1][индекс2]..[индексN];
Пример ссылки на элемент двухмерного индексируемого массива:
$position = $chess_board[5][4];
В многомерных массивах допускается смешанное индексирование (числовое и ассоциативное).
5) Логический тип данных принимает всего два значения: истинное (true) и ложное (false). Вообще говоря, любое не пустое значение переменной интерпретируется как истина, иначе ложь.
6) - Объект - переменная, экземпляр которой создается по специальному шаблону, называемому классом. В отличие от других типов данных, поддерживаемых в языке РНР, объекты должны объявляться явно. Объявление класса должно предшествовать объявлению объектов, создаваемых на их основе.
Пример объявления класса и последующего создания объектов на его основе:
class appliance {
var power:
function set_power($on_off) { $this->power = $on_off; }
}
...
$blender = new appliance;
Определение класса задает атрибуты и функции, связанные с некоторой структурой данных в данном примере это структура с именем appliance (устройство). У этой структуры имеется всего один атрибут power (мощность). Для изменения этого атрибута создается метод set_power.
Объекты создаются при помощи ключевого слова new. Например, в приведенном выше фрагменте создается объект $blender класса appliance.
После создания объекта $blender можно задать его мощность при помощи метода set_power: $blender->set_power("on");
Термин идентификатор применяется к переменным, функциям и другим объектам, определяемым пользователем. Идентификаторы должны удовлетворять нескольким условиям: состоит из одного или нескольких символов и начинается с буквы или символа подчеркивания. Идентификатор может содержать только латинские буквы, цифры, символы подчеркивания и другие ASCII-символы с кодами от 127 до 255. В идентификаторах учитывается регистр символов. Длина идентификаторов не ограничивается. Идентификатор не может совпадать с каким-либо из стандартных ключевых слов РНР.
Имена переменных являются идентификаторами и начинаются со знака доллара ($). Переменные в РНР. Переменная объявляется при первом ее использовании в программе. Более того, тип переменной косвенно определяется по типу хранящихся в ней данных. Переменные могут объявляться в любой точке сценария РНР, однако от расположения объявления зависит то, откуда можно обращаться к данной переменной.
Область видимости переменных определяется как область доступности переменной в той программе, в которой она была объявлена. В зависимости от области видимости переменные РНР делятся на четыре типа.
1) Локальные - переменная, объявленная внутри функции и на нее можно ссылаться только в этой функции. При выходе из функции, в которой была объявлена локальная переменная, эта переменная и ее значение уничтожаются.
2) Параметры функций - должны быть объявлены в заголовке функции
Параметры объявляются в круглых скобках после имени функции. Объявление параметров практически не отличается от объявления типичной переменной:
// Функция умножает переданное значение на 10 и возвращает результат
function x10 ($value) { $value = $value * 10; return $value;}
После завершения функции параметры уничтожаются.
3) Глобальные - переменные доступны в любой точке программы. Но чтобы изменить значение глобальной переменной, необходимо специально объявить ее как глобальную в соответствующей функции. Для этого перед именем переменной ставится ключевое слово GLOBAL. Пример:
$somevar = 15;
function addit() { GLOBAL $somevar; $somevar++; }
addit(); print "Somevar is $somevar";
Будет выведено значение $somevar, равное 16. Если удалить строку:
GLOBAL $somevar, то будет выведено значение 1.
Альтернативный способ объявления глобальных переменных связан с использованием массива РНР $GLOBALS( ).
Приведем предыдущий пример с использованием этого массива.
function addit() { $GLOBALS["somevar"]; $somevar++; }
addit(); print "Somevar is $somevar";
4) Статические - статическая переменная сохраняет свое значение при повторном вызове. Для объявления статической переменной перед ее именем ставится ключевое слово STATIC (STATIC $somevar;).
РНР определяет текущий тип переменной по началу ее значения.
Явное приведение переменной к типу, отличному от того, который изначально предназначался для нее, называется преобразованием типа. Изменение типа может быть как временным, одноразовым, так и постоянным. Чтобы временно привести переменную к другому типу, достаточно воспользоваться оператором преобразования типа указать нужный тип перед именем переменной в круглых скобках: int - целое число; real, double или float - вещественное число; string строка; array массив; object объект. Преобразование вещественного типа к целому всегда сопровождается округлением.
Любой тип данных можно преобразовать в объект. Переменная становится атрибутом объекта, и ей присваивается имя scalar:
$model = "Toyota"; $new_obj = (object) $model;
Ссылка на исходное строковое значение выглядит так: print $new_obj->scalar;
Операция присваивания обозначается символом равенства (=). В некоторых ситуациях бывает удобно использовать переменные, содержимое которых может динамически интерпретироваться как имя другой переменной.
В РНР поддерживается ряд стандартных переменных, предоставляющих в распоряжение программиста довольно подробную информацию о внутренней конфигурации. Чтобы получить полный список переменных web-сервера, окружения и РНР, определенных для вашей конфигурации системы, достаточно выполнить следующий фрагмент:
while (list($var,$value) = each($GLOBALS)) echo "<BR>$var => $value";
Можно вывести любую из этих переменных по имени. Например, следующая команда выводит IP-адрес пользователя:
print "Привет! Ваш IP адрес есть: $REMOTE_ADDR";
IP-адрес выводится в числовой форме (например, 208.247.106.187).
Константой называется именованная (в именах констант не указывается знак доллара) величина, которая не изменяется в процессе выполнения программы. Константы особенно удобны при работе с заведомо постоянными величинами например, числом π (3,141592) или количеством футов в миле (5280). В РНР константы определяются функцией define( ). После того как константа будет определена, вы не сможете изменить или переопределить ее в этой программе.
Пример.
define("PI", "3.141592");
print "Значении pi есть". PI."<br>";
Выражение описывает некоторое действие, выполняемое в программе. Каждое выражение состоит, по крайней мере, из одного операнда и одного или нескольких операторов.
Операция представляет собой символическое обозначение некоторого действия, выполняемого с операндами в выражении.
В следующей таблице полный список всех операций, упорядоченных по убыванию приоритета.
Операция |
Ассоци-ативность |
Цель |
( ) |
- |
Изменение приоритета |
New |
- |
Создание экземпляров объектов |
! ~ |
П |
Логическое отрицание, поразрядное отрицание |
++ -- |
П |
Инкремент (увеличение на 1), декремент (уменьшение на 1) перед (если указан перед именем переменной) или после (если указан после имени переменной) использования переменной в выражении. |
@ |
П |
Маскировка ошибок |
/ * % |
Л |
Деление, умножение, остаток |
+ - . |
Л |
Сложение, вычитание, конкатенация (объединение операндов) |
<< >> |
Л |
Сдвиг влево, сдвиг вправо (поразрядный) |
< <= > >= |
- |
Меньше, меньше или равно, больше, больше или равно |
== != <> === !== |
- |
Равно, не равно, не равно, тождественно равно (равенство значения и типа), тождественно не равно |
& ^ | |
Л |
Поразрядные операции AND, XOR и OR |
&& || |
Л |
Логические операции AND и OR |
?: |
П |
Тернарный оператор (пример ($a==12)?5:1 если переменная $а равна 12, возвращается значение 5, а иначе - 1 |
= += *= /= .= |
П |
Операторы присваивания ($x+=Y, $x*=Y, $x/=Y, $x.=Y эквиваленты: $x=$x+Y, $x=$x*Y, $x=$x/Y, $x=$x.Y) |
< <= > >= |
|
Меньше, меньше или равно, больше, больше или равно (только для числовых операндов) |
AND XOR OR |
Л |
Логические операции AND, XOR и OR |
Ассоциативность операции определяет последовательность выполнения операторов с одинаковым приоритетом: слева на право (Л) или справа на лево (П).
Поразрядные операции выполняют операции с целыми числами на уровне отдельных битов, составляющих число.
Оператор if имеет два формата:
if (условие) оператор [else оператор];
Если условие истинно, то выполняется оператор после этого условия, иначе оператор после else.
if (условие) оператор;
[elseif (условие) оператор;]
….
[elseif (условие) оператор;
[else оператор;]
Очередное условие elself вычисляется лишь в том случае, если все предшествующие условия if и elself оказались ложными.
Пример.
if ($ves < 200) print "вес 1-2 людей";
elseif ($ves < 500) print "вес маленькой группы людей";
else print "вес большой группы людей";
Допускаются вложенные команды if.
Оператор цикла while выглядит так:
while (условие выполнения цикла) оператор;
Пример. Вычисление факториала (n!), где n = 5:
$n = 5; $nсору = $n; $factorial = 1; факториала
while ($n >1) {$factorial = $n * $factorial; $n--; }
print $factorial;
Оператор цикла Dо While:
do оператор; while(условие);
Команда работает почти так же, как и цикл while, однако условие проверяется не в начале, а в конце каждой итерации.
Пример с вычислением факториала:
$n = 5; $ncopy = $n; $factorial = 1; // Установить начальное значение
do { $factorial = $n * $factorial; $n--;} while ($n > 0);
Оператор цикла for имеет вид:
for (инициализация; условие; приращение) оператор;
Инициализация операторы через запятые, которые выполняются всего один раз перед выполнением цикла (обычно они определяют начальные значения управляющей переменной цикла и других переменных).
Условие проверяется в начале каждой итерации и определяет, должна ли выполняться текущая итерация (если устовие истинно) или нет.
Приращение - операторы через запятые, которые выполняются в конце каждой итерации цикла (обычно определяется изменение управляющей переменной при каждой итерации).
Пример.
for ($i = 10; $i <= 100; $i +=10) // Обратная косая черта предотвращает
print "\$i = $i <br>"; // возможную интерполяцию переменной $1
В этом примере управляющая переменная $i инициализируется значением 10. Цикл продолжается до тех пор, пока $i не достигнет или не превысит пороговую величину 100. При каждой итерации значение $i увеличивается на 10. В результате команда print выполняется 10 раз, каждый раз выводя текущее значение $i. В управляющих выражениях циклов for могут отсутствовать любые компоненты.
Оператор foreach представляет собой разновидность for, включенную в язык для упрощения перебора элементов массива. Существуют две разновидности команды foreach, предназначенные для разных типов массивов:
foreach (массив as $элемент) оператор;
foreach (массив as $ключ -> $элемент) оператор;
Пример.
$menu = array ("pasta", "steak", "potatoes", "fish", "fries");
foreach ($menu as $item) print "$item <BR>";
Второй вариант используется при работе с ассоциативными массивами:
$wine_inventory = array ("merlot" -> 15, "zinfandel" -> 17,"sauvignon" -> 32);
foreach ($wine_inventory as $i -> $item_count)
print "$item_count bottles of $i remaining<BR>";
В этом случае результат выглядит так:
15 bottles of merlot remaining
17 bottles of zinfandel remaining
32 bottles of sauvignon remaining
Оператор switch имеет:
switch (выражение)
case (условие): оператор;
[case (условие): оператор;]
...
[default: оператор;]
}
Пример.
$ves=800;
switch ($ves)
{case ($ves < 200): print "вес 1-2 людей";
case ($ves < 500): print "вес маленькой группы людей";
default: print "вес большой группы людей";
}
Проверяемое условие указывается в круглых скобках после ключевого слова switch. Результат его вычисления последовательно сравнивается с условиями в секциях case. При обнаружении совпадения выполняется блок соответствующей секции. Если совпадение не будет обнаружено, выполняется блок необязательной секции default.
Оператор break [n] немедленно прерывает выполнение операторов циклов и switch . Необязательный параметр n определяет количество уровней управляющих конструкций, завершаемых командой break.
Оператор continue [n] предназначена пропуска всех оставшихся команд текущей итерации цикла и немедленно начинается новая итерация. Необязательный параметр n указывает, на сколько уровней внешних циклов распространяется действие continue.
Функции могут создаваться в любой точке программ РНР. Обобщенный синтаксис функций РНР выглядит так:
function имя_функции ([$параметр1. $параметр2, .... $параметрn])
{тело функции}
В РНР указывать тип входных параметров не нужно. Тип параметра можно проверить функцией gettype ( ).
Функции можно вызывать внутри других функций.
Допускается объявление функций внутри других функций. Вложенная функция не наследует параметров родительской функции; параметры должны передаваться ей точно так же, как и любой другой функции. Вложенные функции не могут вызываться до вызова своей родительской функции.
По завершении работы функции командой return N можно вернуть некоторое значение N. Функции могут возвращать значения любых типов, в том числе массивы и списки.
Пример: функция calculate_cost( ) вычисляет налог с заданной суммы и возвращает общую сумму вместе с налогом.
$price = 24.99; $tax = .06;
function calculate_cost($tax, $price) {return $price + ($price * $tax);}
print calculate_cost($tax, $price);
Функции, не возвращающие значений, также называются процедурами.
Функция также может возвращать сразу несколько значений при помощи списка.
Функция может использоваться в качестве операнда в выражениях
Рекурсивная функция многократно вызывает сама себя, пока не будет выполнено некоторое условие.
Пример. Cуммирование последовательных целых чисел.
function summation ($count)
{ if ($count != 0) return $count + summation($count-1);}
$sum = summation(10); print "Сумма = $sum";
Тексты разработанных функций можно поместить в отдельный файл-библиотеку функций. Для включения текстов этих функций можно использовать операторы вида:
include ("путь/имя_файла"); или require ("путь/имя_файла");
Массив представляет собой совокупность объектов, имеющих одинаковые размер и тип. Каждый объект в массиве называется элементом массива. При объявлении индексируемого массива после имени переменной ставится пара квадратных скобок ([ ]): $languages [ ] = "Русский";
При создании массивов используются три функции.
array ( [элемент1, элемент2...] ) - получает ноль или более элементов и возвращает массив, состоящий из указанных элементов.
Пример. $languages = array ("English". "Gaelic". "Spanish");
void list (переменная1 [, переменная2 , ...] ) - похожа на аrrау(), однако ее главная задача одновременное присваивание значений, извлеченных из массива, сразу нескольким переменным. Синтаксис функции:
Пример.
$fio="Иванов Иван Иванович";
list ($name, $imj, $othestvo) = split(" ",$fio);
echo "Фамилия - ", $name, " Имя - ", $imj, " Отчество - ", $othestvo;
array range (int нижняя_граница, int верхняя граница) - позволяет легко и быстро создать массив целых чисел из интервала, определяемого верхней и нижней границами. Range( ) возвращает массив, состоящий из всех целых чисел указанного интервала.
Пример: $lottery = range(0,9);
Особое место занимаюь системные массивы $_POST[имя поля] и $_GET[имя поля] содержит полученные значения полей ввода заполненой пользователем формы и переданных методом POST или GET соответственно на сервер PHP-программе обработки полученных значений полей ввода (пп. 3.2-3.4)
Приведем список основных функции работы с массивами.
bool in_array (mixed элемент, array массив) - проверяет, присутствует ли в массиве заданный элемент. Если поиск окажется удачным, функция возвращает TRUE, в противном случае возвращается FALSE.
array array_keys (array массив [, mixed искомый_элемент]) - возвращает массив, содержащий все ключи исходного массива, переданного в качестве параметра. Если при вызове передается дополнительный параметр искомый_элемент, возвращаются только ключи, которым соответствует заданное значение; в противном случае возвращаются все ключи массива.
array array_values (array массив) - возвращает массив, состоящий из всех значений исходного массива, переданного в качестве параметра.
int array_push (array массив, mixed элемент [, ...]) - присоединяет (то есть дописывает в конец массива) один или несколько новых элементов.
аrrау_рор (аrrау массив) - извлекает и последний элемент из массива. Извлеченный элемент возвращается функцией.
array_shift (array массив) - аналогична аrrау_рор( ) с одним отличием: элемент удаляется из начала (левого края) массива. Все остальные элементы массива сдвигаются на одну позицию к началу массива.
int array_unshift (array массив, mixed переменная1 [....переменная2]) - новый элемент вставляется в начало массива, а остальные элементы сдвигаются на одну позицию вправо. При одном вызове функции можно добавить как один, так и несколько элементов.
Пример добавления нескольких элементов:
$languages = array("French", "Italian", "Spanish");
array_unshift($languages, "Russian", "Swahili", "Chinese");
array arrap_pad (array массив, int размер, mixed значение) - позволяет быстро увеличить массив до желаемого размера посредством его дополнения стандартными элементами. Параметр размер определяет новую длину массива. Параметр значение задает стандартное значение, присваиваемое элементам во всех новых позициях массива. Если размер положителен, массив дополняется справа, а если отрицателен слева. Если абсолютное значение параметра размер меньше либо равно длине массива, никаких действий не выполняется.
Пример дополнения массива с конца:
$weights = array(1, 3, 5, 10, 15, 25, 50);
$weights = array_pad($weights. 10, 100);
// Результат: $weights = array(1, 3, 5, 10, 15, 25, 50, 100, 100, 100);
Пример дополнения массива с начала:
$weights = array(1, 3, 5, 10, 15, 25, 50);
$weights = array_pad($weights, -10, 100);
// Результат: $weights = array(100, 100, 100, 1, 3, 5, 10, 15, 25, 50);
mixed reset (array массив) - переводит внутренний указатель текущей позиции в массиве к первому элементу. Кроме того, она возвращает значение первого элемента.
array each (array массив) - при каждом вызове выполняет две операции: она возвращает пару «ключ/значение», на которую ссылается указатель текущей позиции, и перемещает указатель к следующему элементу.
end (array массив) - перемещает указатель к позиции последнего элемента массива.
mixed next (array массив) - смещает указатель на одну позицию вперед, после чего возвращает элемент, находящийся в новой позиции. Если в результате смещения указатель выйдет за пределы массива, next ( ) возвращает ложное значение. Недостаток функции заключается в том, что ложное значение dозвращается и для существующих, но пустых элементов массива. Если вы хотите провести обычный перебор, воспользуйтесь функцией each( ).
mixed prev (array массив) - аналогична next ( ) за одним исключением: указатель смещается на одну позицию к началу массива, после чего возвращается элемент, находящийся в новой позиции. Если в результате смещения указатель окажется перед первым элементом массива, prev( ) вернет ложное значение. Недостаток функции prev( ) заключается в том, что ложное значение возвращается и для существующих, но пустых элементов массива. Если вы хотите провести обычный перебор, воспользуйтесь функцией each( ).
int sizeof (array массив) - возвращает количество элементов в массиве.
int count (mixed переменная) - возвращает количество значений, содержащихся в массиве. Единственное различие между sizeof ( ) и count( ) заключается в том, что в некоторых ситуациях count ( ) возвращает дополнительную информацию: если переменная существует, но не является массивом, функция возвращает значение 1; если переменная не существует, возвращается значение 0.
array array_count_values (array массив) - подсчитывает количество экземпляров каждого значения в массиве.
void sort (array массив) - сортирует элементы массива по возрастанию (от меньших к большим). Нечисловые элементы сортируются в алфавитном порядке в соответствии с ASCII-кодами. е.
rsort (array массив ) - сортирует элементы массива в обратном порядке.
array array_merge (array массив1, array массив2, ..., array массивN]) - сливает от 1 до N массивов, объединяя их в соответствии с порядком перечисления в параметрах.
array array_slice (array массив, int смещение [, int длина]) - возвращает часть массива, начальная и конечная позиция которой определяется смещением от начала и необязательным параметром длины.
Значения параметров задаются по определенным правилам:
array_splice (array входной_массив, int смещение, [int длина], [array заменяющий_массив]) - заменяет часть массива, определяемую начальной позицией и необязательной длиной, элементами необязательного параметра-массива.
Примеры.
$pasta = array_splice($pasta. 5, 2); // Удаление 5 и 6 элементов:
//Замена пятого и шестого элементов новыми значениями:
$pasta = array_splice($pasta, 5, 2, array("element1", "element2"));
//Удаление всех элементов, начиная с пятого, до третьего элемента с конца массива:
$pasta = array_splice($pasta, 5, -3);
void shuffle(array массив) - сортирует элементы массива в случайном порядке.
Классы образуют синтаксическую базу объектно-ориентированного программирования. Их можно рассматривать как своего рода «контейнеры» для логически связанных данных и функций (обычно называемых методами). Класс представляет собой шаблон (чертеж), по которому создаются конкретные экземпляры, используемые в программе. Экземпляры классов называются объектами. Класс также можно рассматривать как тип данных, а объект как переменную.
Общий формат классов РНР:
class Class_name {
var $attribute_1;
...
var $attribute_N;
function function1() {
...
}
...
function functionN() {
...
} // end Class_name
Объявление класса должно начинаться с ключевого слова class. Каждому объявлению атрибута, содержащегося в классе, должно предшествовать ключевое слово var. После объявлений атрибутов следуют объявления методов, очень похожие на типичные объявления функций. При ссылках на атрибуты внутри методов используется специальная переменная $this. Синтаксис методов продемонстрирован в следующем примере:
class Webpage {
var $bgcolor;
function setBgColor($color) { $this->bgcolor = $color; }
function getBgColor() {return $this->bgcolor;}
}
Переменная $this ссылается на экземпляр объекта, для которого вызывается метод. Атрибут, на который вы ссылаетесь в методе, не нужно передавать в виде параметра функции; знак доллара ($) ставится перед переменной $this, но не перед именем атрибута.
Объекты создаются оператором new. Например, объект класса Webpage создается следующей командой: $home_page = new Webpage;
Новый объект с именем $home_page обладает собственным набором атрибутов и методов, перечисленных в классе Webpage. Для изменения значения атрибута $bgcolor, принадлежащего этому конкретному объекту, можно воспользоваться определенным в классе методом setBgColor( ):
$home_page->setBgColor("black");
Можно явно получить значение атрибута указанием имен объекта и атрибута: $home_page->bgcolor;
Конструктор представляет собой метод, который задает значения некоторых атрибутов (а также может вызывать другие методы). Конструкторы вызываются автоматически при создании новых объектов. Чтобы это стало возможным, имя метода-конструктора должно совпадать с именем класса, в котором он содержится.
Пример конструктора
class Webpage {
var $bgcolor;
function Webpage($color) {
$this->bgcolor = $color;
}
}
// Вызвать конструктор класса Webpage
$page = new Webpage("brown");
Роль деструктора выполняет функция unset( ) котороя уничтожает содержимое переменной и возвращает занимаемые ею ресурсы системе. С объектами unset( ) работает так же, как и с переменными (пример, unset($Webpage);). Можно поместить вызов unset( ) в метод с именем destroy( ) и затем вызвать его:
$Website->destroy( );
Концепция получения классом характеристик от другого, более общего класса называется наследованием. В общем случае синтаксис наследования характеристик другого класса выглядит так:
class Class_name2 extends Class_name1 {
объявления атрибутов;
объявления методов;
}
Ключевое слово extends говорит о том, что класс Class_name2 наследует все характеристики класса Class_name1. Вызов конструктора производного класса не приводит к автоматическому вызову конструктора базового класса.
Пример. Представление различных типов транспортных средств при помощи наследования
// Транспортное средство
class Vehicle {
var $model;
var $current_speed;
function setSpeed($mph) {
$this->current_speed = $mph;
}
function getSpeed() {
return $this->current_speed;
}
}
// Автомобиль
class Auto extends Vehicle {
var $fue1_type;
function setFuelType($fuel) {
$this->fuel_type = $fuel;
}
function getFuelType() {
return $this->fuel_type;
}
}
// Самолет
class Airplane extends Vehicle {
var $wingspan;
function setWingSpan($wingspan) {
$this->wingspan = $wingspan;
}
function getWingSpan() {
return $this->wingspan;
}
}
Объекты этих классов создаются следующим образом:
$tractor = new Vehicle;
$gulfstream = new Airplane;
Приведенные команды создают два объекта. Первый объект, $tractor, относится к классу Vehicle. Второй объект, $gulfstream, относится к классу Airplane и потому обладает как общими характеристиками класса Vehicle, так и уточненными характеристиками класса Airplаne.
С увеличением размеров и сложности программ может возникнуть необходимость в многоуровневом наследовании. Иначе говоря, класс будет наследовать свои свойства от других классов, которые, в свою очередь, будут наследовать от третьих классов и т. д.
Перечислим основные стандартные функции для работы с классами и объектами.
array get_class_methods (string имя_класса) - возвращает массив имен методов класса с заданным именем.
array get_class_vars (string имя_класса) - возвращает массив имен атрибутов класса с заданным именем.
array get_object_vars (object имя_обьекта) - возвращает ассоциативный массив с информацией обо всех атрибутах объекта с заданным именем.
bool method_exists (object имя_обьекта. string имя_метода) - проверяет, поддерживается ли объектом метод с заданным именем. Если метод поддерживается, функция возвращает TRUE, в противном случае возвращается FALSE.
string get_class(object имя_объекта) - возвращает имя класса, к которому относится объект с заданным именем.
string get_parent_class (object имя_обьекта) - возвращает имя родительского класса (если он есть) для объекта с заданным именем.
bool is_subclass_of (object объект, string имя_класса) - проверяет, был ли объект создан на базе класса, имеющего родительский класс с заданным именем. Функция возвращает TRUE, если проверка дает положительный результат, и FALSE в противном случае.
array get_declared_classes( ) - возвращает массив с именами всех определенных классов.
Рассмотрим основные функции и технологию работы с файлами.
bool file_exists(string файл) - проверяет, существует ли заданный файл. Если файл существует, функция возвращает TRUE, иначе FALSE.
bool is_file(string файл) - проверяет существование заданного файла и возможность выполнения с ним операций чтения/записи.
int filesize(string имя_файла) - возвращает размер (в байтах) файла с заданным именем или FALSE в случае ошибки.
Прежде чем выполнять операции с файлом, необходимо открыть его и связать с файловым манипулятором, а после завершения работы с файлом его следует закрыть.
int fopen (string файл, string режим [, int включение_пути]) - открывает файл (если он существует) и возвращает целое число так называемый файловый манипулятор.
Параметр файл может задаваться в 4 формах:
1) если параметр содержит имя локального файла, то открывается этот файл и возвращается манипулятор.
2) если параметр задан в виде php://stdin, php://stdout или php://stderr, открывается соответствующий стандартный поток ввода/вывода.
3) если параметр начинается с префикса http://, то открывается подключение HTTP к серверу и возвращает манипулятор для указанного файла.
4) если параметр начинается с префикса ftp://, то открывается подключение FTP к серверу и возвращает манипулятор для указанного файла. Если сервер не поддерживает пассивный режим FTP, вызов fopen( ) завершается неудачей. Более того, FTP-файлы открываются либо для чтения, либо для записи.
При работе в пассивном режиме сервер ожидает подключения со стороны клиентов. При работе в активном режиме сервер сам устанавливает соединение с клиентом. По умолчанию обычно используется активный режим.
Параметр режим определяет возможность выполнения чтения и записи в файл. В следующей таблице перечислены некоторые значения, определяющие режим открытия файла.
Режим |
Описание |
R |
Только чтение. Указатель текущей позиции устанавливается в начало файла |
r+ |
Чтение и запись. Указатель текущей позиции устанавливается в начало файла |
W |
Только запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его |
w+ |
Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его |
a |
Только запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его |
a+ |
Чтение и запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его |
Если необязательный третий параметр включение_пути равен 1, то путь к файлу определяется по отношению к каталогу включаемых файлов, указанному в файле php.ini.
Примеры открытия файла.
$file = "userdata.txt"; // Некоторый файл
$fh = fopen($file, "a+") or exit("Файл ($file) не существует!");
//открывается подключение к сайту РНР (http://www.php.net):
$site = "http://www.php.net": // Сервер, доступный через HTTP
$sh = fopen($site., "r"); //Связать манипулятор с индексной страницей Php.net
int fclose(int манипулятор) - закрывается файл с заданным манипулятором. При успешном закрытии возвращается TRUE, при неудаче FALSE. Функция fclose( ) успешно закрывает только те файлы, которые были ранее открыты функциями fopen( ) или fsockopen( ).
Примеры закрытия файла:
$file = "План.txt";
if (file_exists($file)) { $fh = fopen($file, "r"); … fclose($fh);}
else print "Файл $file не существует!";
С открытыми файлами выполняются две основные операции чтение и запись.
bool is_writeable (string файл)- позволяет убедиться в том, что файл существует и для него разрешена операция записи.
fwrite ( )
int fwrite или fputs (int манипулятор, string переменная [, int длина]) -записывает содержимое строковой переменной в файл, заданный файловым манипулятором. Если при вызове функции передается необязательный параметр длина, запись останавливается либо после записи указанного количества символов, либо при достижении конца строки.
Пример.
// Информация о трафике на пользовательском сайте
$data = "08:13:00|12:37:12|208.247.106.187|Win98";
$filename = "somefile.txt";
if ( is_writeable($filename) )
{ $fh = fopen($filename, "a+");
$success = fwrite($fh, $data); // Записать содержимое $data в файл
fclose($fh); // Закрыть файл
} else print "Не может открыть файл $filename для записи";
bool is_readable (string файл) - позволяет убедиться в том, что файл доступен для чтения.
Пример: открыть файл и установить указатель текущей позиции в конец файла.
if ( is_readable($filename) ) $fh = fopen($filename, "r");
else print "$filename нельзя читать!";
int fread(int манипулятор, int длина) - читает из файла, заданного файловым манипулятором, заданное количество байт. Чтение прекращается после прочтения заданного количества байт или при достижении конца файла.
Пример.
$fh = fopen('pastry.txt', "r") or exit("Can't open file!");
$file = fread($fh, filesize($fh)); print $file;fclose($fh);
Используя функцию fllesize( ) для определения размера pastry.txt в байтах, вы гарантируете, что функция fread( ) прочитает все содержимое файла.
string fgetc (int манипулятор) - возвращает строку, содержащую один символ из файла в текущей позиции указателя, или FALSE при достижении конца файла.
Пример: посимвольное чтение и вывод файла:
$fh = fopen("pastry.txt", "r");
while (! feof($fh)) { $char = fgetc($fh) print $char; } fclose($fh);
string fgets (int манипулятор, int длина) - возвращает строку, прочитанную от текущей позиции указателя в файле, определяемом файловым манипулятором. Чтение прекращается при выполнении одного из следующих условий: из файла прочитано строк, указанной длины; из файла прочитан символ новой строки (включается в возвращаемую строку); из файла прочитан признак конца файла (EOF). Если нужно организовать построчное чтение файла, передайте во втором параметре значение, заведомо превышающее количество байт в строке.
Пример построчного чтения и вывода файла:
$fh = fopen("pastry.txt", "r");
while (! feof($fh)) { $line = fgets($fh, 4096); print $line. "<br>";} fclose($fh);
string fgetss (int манипулятор, int длина) аналогична fgets( ) за одним исключением она пытается удалять из прочитанного текста все теги HTML и РНР.
array file (string файл [, int включение_пути]) - загружает все содержимое файла в индексируемый массив. Каждый элемент массива соответствует одной строке файла. Если необязательный третий параметр включение_пути равен 1, то путь к файлу определяется по отношению к каталогу включаемых файлов, указанному в файле php.ini.
Пример.
$file_array = file( "pastry.txt" );
while ( list( $line_num. $line ) = eacht($file_array ) )
{ print "<b>Строка $line_num:</b> ", HTMLspecialchars($line ), "<br>\n" }
int readfile (string файл [, int включение_пути]) - читает содержимое файла и направляет его в стандартный вывод (обычно в браузер). Функция возвращает количество прочитанных байтов. Файл может находиться в локальной файловой системе, существовать в виде стандартного потока ввода/вывода или представлять файл в удаленной системе, принимаемой средствами HTTP или FTP. Параметр файл задается по тем же правилам, что и в функции fopen( ).
Пример. $restaurant_file = "latorre.txt"; readfile($restaurant_filе);
string exec (string команда [, string массив [, int возврат]]) - запускает заданную программу и возвращает последнюю строку ее выходных данных. Функция только выполняет команду, не выводя результатов ее работы. Все выходные данные команды можно сохранить в необязательном параметре массив. Кроме того, если при заданном параметре массив также задается переменная возврат, последней присваивается код возврата выполненной команды.
void passthru(string команда [, int возврат] -) работает почти так же, как ехес( ), за одним исключением - она автоматически выводит результаты выполнения команды. Если при вызове passthru( ) передается необязательный параметр возврат, этой переменной присваивается код возврата выполненной команды.
string escapeshellcmd (string команда) - экранирует все потенциально опасные символы, которые могут быть введены пользователем (например, на форме HTML)
string basename(string полное_имя) - выделяет имя файла из переданного полного имени.
int getlastmod(void) - возвращает дату и время последней модификации страницы, из которой вызывается функция. int getlastmod(void).
Возвращаемое значение соответствует формату даты/времени UNIX, и для его форматирования можно воспользоваться функцией date( ).
array stat(string имя_файла) - возвращает индексируемый массив с подробной информацией о файле с заданным именем.
Пример.
$file = "datafile.txt";
list($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime, $bsize) = stat($file);
print "$file размер $size bytes. <br>";
print "Время создания: $atime <br>";
print "Время последнего изменения: $mtime <br>";
int copy - (string источник, string приемник) - пытается скопировать файл источник в файл приемник; в случае успеха возвращается TRUE, а при неудаче FALSE. Если файл приемник не существует, функция создает его.
Пример.
$data_file = "datal.txt";
copy($data_file. $data_file'.bak') or exit("Ошбка при копировании $data_file");
bool rename - (string старое_имя, string новое_имя) переименовывает файл. В случае успеха возвращается TRUE, a при неудаче - FALSE.
int unlink (string файл) удаляет файл с заданным именем.
string dirname (string путь) - она извлекает путь из полного имени файла. Функция иногда используется в сочетании с переменной $SCRIPT_FILENAME для получения полного пути к сценарию, из которого выполняется команда: $dir = dirname($SCRIPT_FILENAME).
bool is_dir (string имя_файла) - проверяет, является ли файл с заданным именем каталогом.
mkdir()
int mkdir (string путь, int режим) - создает новый каталог.
Параметр путь определяет путь для создания нового каталога. Не забудьте завершить параметр именем нового каталога! Параметр режим определяет разрешения, назначаемые созданному каталогу.
int opendir (string путь) - открывает манипулятор для работы с каталогом.
void closedir(int манипулятор_каталога) - закрывает манипулятор каталога, переданный в качестве параметра.
string readdir(int манипулятор_каталога) - возвращает очередной элемент заданного каталога.
Пример: вывести список всех файлов и подкаталогов, находящихся в текущем каталоге:
$dh = opendir("Проект" );
while ($file = readdir($dh)) print "$file <br>"; closedir($dh);
int chdir (string каталог) - осуществляет переход в каталог, заданный параметром.
void rewinddir (int нанипулятор_каталога) - переводит указатель текущей позиции в начало каталога, открытого функцией opendir.
Регулярное выражение (шаблон или образец поиска) представляет собой последовательность простых и служебных символов, описывающих искомый текст.В РНР существуют два семейства функций, каждое из которых относится к определенному типу регулярных выражений: в стиле POSIX или в стиле Perl.
Структура регулярных выражений POSIX чем-то напоминает структуру типичных математических выражений - различные элементы объединяются друг с другом и образуют более сложные выражения. Простейшее регулярное выражение совпадает с одним литеральным символом - например, выражение g совпадает в таких строках, как g, haggle и bag. Выражение, полученное при объединении нескольких литеральных символов, совпадает по тем же правилам - например, последовательность gan совпадает в любой строке, содержащей эти символы (например, gang, organize или Reagan).
Оператор | (вертикальная черта) проверяет совпадение одной из нескольких альтернатив. Например, регулярное выражение php | zend проверяет строку на наличие php или zend.
Квадратные скобки ([ ]) имеют особый смысл в контексте регулярных выражений они означают «любой символ из перечисленных в скобках». В отличие от регулярного выражения php, которое совпадает во всех строках, содержащих литеральный текст php, выражение [php] совпадает в любой строке, содержащей символы р или h. Ниже перечислены некоторые часто используемые интервалы:
[0-9] - совпадает с любой десятичной цифрой от 0 до 9;
[a-z] - совпадает с любым символом нижнего регистра от а до z;
Квантификаторы это служебные символы (+, * и {...}), обозначающие количество повторений отдельного символа или конструкции, заключенной в квадратные скобки. Принцип их действия проще всего пояснить на примерах:
р+ означает один или несколько символов р, стоящих подряд;
р* означает ноль и более символов р, стоящих подряд;
р? означает ноль или один символ р;
р{2} означает два символа р, стоящих подряд;
р{2,3} означает от двух до трех символов р, стоящих подряд;
р{2,} означает два и более символов р, стоящих подряд.
Служебные символы $ и ^ совпадают не с символами, а с определенными позициями в строке. Например, выражение р$ означает строку, которая завершается символом р, а выражение ^р строку, начинающуюся с символа р.
Конструкция [^a-zA-Z] совпадает с любым символом, не входящим в указаные интервалы (a-z и A-Z).
Служебный символ . (точка) означает «любой символ». Например, выражение р.р совпадает с символом р, за которым следует произвольный символ, после чего опять следует символ р.
Объединение служебных символов приводит к появлению более сложных выражений.
Рассмотрим несколько примеров:
^.{2}$ любая строка, содержащая ровно два символа;
<b>(.*)</b> произвольная последовательность символов, заключенная между <Ь> и </Ь> (вероятно, тегами HTML для вывода жирного текста);
p(hp)* символ р, за которым следует ноль и более экземпляров последовательности hp (например, phphphp).
Иногда требуется найти служебные символы в строках вместо того, чтобы использовать их в описанном специальном контексте. Для этого служебные символы экранируются обратной косой чертой (\). Например, для поиска денежной суммы в долларах можно воспользоваться выражением \$[0-9]+, то есть «знак доллара, за которым следует одна или несколько десятичных цифр». Возможными совпадениями для этого регулярного выражения являются $42, $560 и $3.
Для удобства программирования в стандарте POSIX были определены некоторые стандартные интервальные выражения, также называемые символьными классами (character classes). Символьный класс определяет один символ из заданного интервала - например, букву алфавита или цифру:
[[:alpha:]] - алфавитный символ (aA-zZ);
[[:digit:]] - цифра (0-9);
[[:alnum:]] - алфавитный символ (aA-zZ) или цифра (0-9);
[[:space:]] - пропуски (символы новой строки, табуляции и т. д.).
int ereg (string шаблон, string строка [, array совпадения]) поиск в заданной строке с учетом регистра совпадение для шаблона. Если совпадение найдено, возвращается TRUE, иначе - FALSE.
Необязательный параметр совпадения содержит массив совпадений для всех подвыражений, заключенных в регулярном выражении в круглые скобки.
string ereg_replace (string шаблон, string замена, string строке) ищет в заданной строке с учитетом регистра совпадение для шаблона и заменяет его новым фрагментом. После выполнения замены функция возвращает модифицированную строку. Если совпадения отсутствуют, строка остается в прежнем состоянии.
Пример.
$copy_date = "Copyright 1999":
$copy_date = ereg_replace("([0-9]+)". "2000", $copy_date);
print $copy_date: // Выводится строка "Copyright 2000"
int eregi (string шаблон, string строка [, array совпадения]) - поиск без учета регистра в заданной строке совпадение для шаблона.
string eregi_replace (string шаблон, string замена, string строка) - работает точно так же, как ereg_replace( ), но поиск производится без учета регистра символов.
array split (string шаблон, string строка [, int порог]) - разбивает строку на элементы, границы которых определяются по заданному шаблону. Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка слева направо. Если шаблон содержит алфавитные символы, функция split( ) работает с учетом регистра символов.
Пример: разбиение канонического IP-адреса на триплеты:
$ip = "123.345.789.000"; // Канонический IP-адрес
$iparr = split ("\.", $ip) // Поскольку точка является служебным символом.
// ее необходимо экранировать.
print "$iparr[0] <br>"; // Выводит "123"
print "$iparr[1] <br>"; // Выводит "456"
print "$iparr[2] <br>"; // Выводит "789"
print "$iparr[3] <br>"; // Выводит "000"
array spliti (string шаблон, string строка [, int порог]) - работает точно так же, как split( ), но не учитывает регистр.
string sql_regcase (string строка) - заключает каждый символ входной строки в квадратные скобки и добавляет к нему парный символ. Если алфавитный символ существует в двух вариантах (верхний и нижний регистры), выражение в квадратных скобках будет содержать оба варианта; в противном случае исходный символ повторяется дважды.
string chop(string строка) - возвращает строку после удаления из нее завершающих пропусков и символов новой строки.
string str_pad (string строка, int длина_дополнения [, string дополнение [, int тип_дополнения]]) - выравнивает строку до определенной длины заданными символами и возвращает отформатированную строку. Если необязательный параметр дополнение не указан, строка дополняется пробелами. В противном случае строка дополняется заданными символами. По умолчанию строка дополняется справа; тем не менее, вы можете передать в параметре тип_дополнения константу STR_PAD_RIGHT, STR_PAD_LEFT или STR_PAD_BOTH, что приведет к дополнению строки в заданном направлении.
string trim (string строка] - удаляет псе пропуски с обоих краев строки и возвращает полученную строку. К числу удаляемых пропусков относятся и специальные символы \n, \r, \t, \v и \0.
string ltrim (string строка) - удаляет все пропуски и специальные символы с левого края строки и возвращает полученную строку Функция удаляет те же специальные символы, что и функция trim( ).
int strlen (string строка) - возвращает длину строки в символах.
int strcmp (string строка1, string строка2) - сравнивает две строки с учетом регистра символов. После завершения сравнения strcmp( ) возвращает одно из трех возможных значений:
0, если строка1 и строка2 совпадают;
< 0, если строка1 меньше, чем строка2;
> 0, если строка2 меньше, чем строка1.
int strcasecmp (string cтpoкa1, string строка2) - работает точно так же, как strcmp( ), но без учета регитров.
int strspn (string строка1, string строка2) - возвращает длину первого сегмента строки1, содержащего символы, присутствующие в строке2.
int strcspn (string строка1, string строка2) - возвращает длину первого
string strtok (string строка, string разделители) - разбивает строку на лексемы по разделителям, заданным вторым параметром. Чтобы полностью разделить строку, функцию необходимо последовательно вызвать несколько раз. При очередном вызове функция выделяет из строки следующую лексему. При этом параметр строка задается всего один раз - функция отслеживает текущую позицию в строке до тех пор, пока строка не будет полностью разобрана на лексемы или не будет задан новый параметр строка.
Пример.
$info = "WJ Gi1more:wjgilmore@hotmail.com | Columbus, Ohio";
$tokens = ":|,"; $tokenized = strtok($info, $tokens);
while ($tokenized) {echo "Element = $tokenized<br>"; $tokenized = strtok($tokens); }
void parse_str (string строка) - выделяет в строке пары «переменная-значение» и присваивает значения переменных в текущей области видимости.
array explode (string разделитель, string строка [, int порог]) - делит строку на элементы и возвращает эти элементы в виде массива. Синтаксис функции Разбиение происходит по каждому экземпляру разделителя, причем количество полученных фрагментов может ограничиваться необязательным параметром порог.
string implode или join (string разделитель, array фрагменты) - объединяет массив в строку.
int strpos (string строка, string подстрока [, int смещение]) - находит в строке первый экземпляр заданной подстроки. Необязательный параметр offset задает позицию, с которой должен начинаться поиск. Если подстрока не найдена, то возвращается FALSE (0).
int strpos (string строка, char символ) - находит в строке последний экземпляр заданного символа.
string str_replace (string подстрока, string замена, string строка) - ищет в строке все вхождения заданной подстроки и заменяет их новой подстрокой.
string strstr (string строка, string подстрока) - возвращает часть строки, начинающуюся с первого вхождения заданной подстроки.
string substr (string строка, int начало [, int длина]) - возвращает часть строки, начинающуюся с заданной начальной позиции (в действительности начинается с символа с номером = начало + 1) и имеющую заданную длину. Если необязательный параметр длина не указан, считается, что подстрока начинается с заданной начальной позиции и продолжается до конца строки.
При использовании этой функции необходимо учитывать четыре обстоятельства:
1) если параметр начало положителен, возвращаемая подстрока начинается с позиции строки с заданным номером;
2) если параметр начало отрицателен, возвращаемая подстрока начинается с позиции (длина строки - начало);
3) если параметр длина положителен, в возвращаемую подстроку включаются все символы от позиции начало до позиции начало+длина. Если последняя величина превышает длину строки, возвращаются символы до конца строки;
4) если параметр длина отрицателен, возвращаемая подстрока заканчивается на заданном расстоянии от конца строки.
int substr_count (string строка, string подстрока) - возвращает количество вхождений подстроки в заданную строку.
string substr_replace (string строка, string замена, int начало [, int длина]) - заменяет часть строки, которая начинается с заданной позиции. Если задан необязательный параметр длина, заменяется фрагмент заданной длины; в противном случае производится замена по всей длине заменяющей строки.
Параметры начало и длина задаются по определенным правилам:
если параметр начало положителен, замена начинается с заданной позиции;
если параметр начало отрицателен, замена начинается с позиции (длина строки - начало);
если параметр длина положителен, заменяется фрагмент заданной длины;
если параметр длина отрицателен, замена завершается в позиции (длина строки - длина).
string nl2br (string строка) - заменяет все символы новой строки (\n) эквивалентными конструкциями HTML <br>.
string strtr (string строка, string источник, string приемник) транслирует строку, то есть заменяет в ней все символы, входящие в строку источник, соответствующими символами строки приемник. Синтаксис функции strtr( ). Если строки источник и приемник имеют разную длину, длинная строка усекается до размеров короткой строки.
string strip_tags (string строка [, string разрешенные_тerи]) - удаляет из строки все теги HTML и РНР, оставляя в ней только текст.
string strtolowe/ strtoupper r(string строка) преобразует все алфавитные символы строки к нижнему/верхнему регистру.
string ucfirst (string строка) - преобразует к верхнему регистру первый символ строки - при условии, что он является алфавитным символом.
string ucwords (string строка") - преобразует к верхнему регистру первую букву каждого слова в строке.
Стандартная переменная РНР $HTTP_USER_AGENT - в строковом формате хранятся различные сведения о браузере и операционной системе пользователя. Эту информацию можно легко вывести на экран всего одной командой: echo $HTTP USER_AGENT.
По ссылкам пользователь может переходить как на обычные страницы HTML, так и на страницы, содержащие код РНР. Можно воспользоваться переменной для построения динамической ссылки:
$link = "date.php";
print "<а href = \"$link\">Просмотр текущей даты</a> <br>\n"
Кавычки в РНР являются специальными символами и используются в качестве ограничителей строк. Следовательно, кавычки-литералы в строках должны экранироваться символом "\".
Для быстрого вывода списка ссылок в браузере можно воспользоваться массивом:
// Создать массив разделов
$contents = array("tutorials", "articles", "scripts", "contact");
// Перебрать и последовательно вывести каждый элемент массива
for ($i = 0; $i < sizeof($contents); $i++)
print " <a href = \"".$contents[$i].".php\">".$contents[$i]."</a><br>\n";
Шаблоном (применительно к web-программированию) называется часть web-документа, которая используется в нескольких страницах. Как правило, общие фрагменты содержания/кода (то есть шаблоны) сохраняются в отдельных файлах. Включение одного или нескольких файлов в сценарий осуществляется следующими функциями РНР.
include (file файл) включает содержимое файла в сценарий. Ее можно выполнять условно. Например, если вызов функции включен в блок команды if. то файл включается в программу лишь в том случае, если условие if истинно. Если функция include используется в условной команде, то она должна быть заключена в фигурные скобки или в альтернативные ограничители.
Пример. if (conditional) include ('text91a.txt'); else include ('text91b.txt');
Весь код РНР во включаемом файле обязательно заключается в теги РНР.
include_once (file файл) - прежде чем включать файл в программу, она проверяет, не был ли он включен ранее. Если файл уже был включен, вызов include_once игнорируется, а если нет - происходит стандартное включение файла.
require (file файл) - включает шаблон в тот файл, в котором находится вызов require( ) независимо от местонахождения require( ) в сценарии. Например, при вызове requiге( ) в блоке if при ложном условии файл все равно будет включен в сценарий!
require_once(file файл) - гарантирует, что файл будет включаться в сценарий всего один раз. После вызова requi rе_оnсе( ) все дальнейшие попытки включения того же файла игнорируются.
При вводе данных в форму используются различные управляющие элементы. Одна страница может содержать несколько форм. Описание формы заключается в следующие теги HTML:
<form action = действие method = "метод"
элементы формы
</form>
Действие указывает, какой сценарий должен обрабатывать форму, а метод определяет способ передачи данных этому сценарию. Существует два метода:
1) get передает все данные формы в конце URL. Из-за различных ограничений, связанных со спецификой языков и длиной данных, этот метод применяется редко.
2) post передает все данные формы в теле запроса. Этот метод используется чаще, чем get.
Текстовое поле предназначено для ввода информации небольшого объема и имеет описание вида:
<input type="text" nаме="имя_переменной" size="N" maxlength="N" value="">
type - тип элемента (для текстовых полей - text);
name - имя переменной, в которой сохраняются введенные данные;
size - общий размер текстового поля в браузере;
maxlength - максимальное количество символов, вводимых в текстовом поле;
value - значение, отображаемое в текстовом поле по умолчанию.
Особой разновидностью текстовых полей является поле для ввода паролей. Оно работает точно так же, как обычное текстовое поле, однако вводимые символы заменяются звездочками. Чтобы создать в форме поле для ввода паролей, достаточно указать type="password" вместо type="text".
Текстовая область используется для ввода несколько больших объемов текста и имеет описание вида:
<textarea name="имя_переменной" rows="N" cols="N" value=""></textarea>
name имя переменной, в которой сохраняются введенные данные;
row / cols s количество строк / столбцов в текстовой области.
Флажки (checkboxes) используются в ситуациях, когда пользователь выбирает один или несколько вариантов из готового набора.
Синтаксис определения флажка:
<input type="checkbox" name="имя переменной" value="начальное значение">
name - имя переменной, в которой сохраняются введенные данные (в данном случае - состояние элемента);
value - значение, присваиваемое переменной по умолчанию. Если флажок установлен, именно это значение будет присвоено переменной с указанным именем. Если флажок не установлен, значение атрибута value не используется.
Переключатель (radio button) представляет собой разновидность флажка; он работает практически так же за одним исключением - в любой момент времени в группе может быть установлен лишь один переключатель.
Синтаксис определения переключателя:
<input type="radio" name="имя_переменной" value="начальное_значение">
Как видите, синтаксис почти не отличается от определения флажка.
Раскрывающиеся списки особенно удобны в ситуации, когда имеется перечень допустимых вариантов, из которого пользователь должен выбрать один вариант.
Синтаксис определения раскрывающегося списка:
<select name="имя_переменной"> value="начальное_значение">
<option valuе="имя_переменной1 ">
…
<option value="имя_переменнойN">
</select>
name - имя переменной, в которой сохраняются строка, выбранная в списке;
value - значение, отображаемое в списке по умолчанию.
Скрытые поля не отображаются в браузере и обычно используются для передачи данных между сценариями. В РНР существует другое средство - сеансовые переменные.
Синтаксис определения скрытого поля:
<input type="hidden" name="имя_переменной" value="начальное_значение">
name - имя переменной, в которой сохраняются скрытые данные;
value- значение, по умолчанию сохраняемое в скрытом поле.
Пользователь может командой View Source вывести скрытые значения.
Кнопка отправки данных инициирует действие, заданное атрибутом action тега <form>.
Синтаксис определения:
<input type="submit" name="имя переменной" value="текст_на_кнопке">
type - тип элемента (для кнопки отправки данных submit);
value - текст, по умолчанию отображаемый на кнопке.
Таких кнопок на форме может быть несколько под одним именем. При нажатии кнопки, в поле ввода вводится текст, который указано на нажатой кнопке и в программе обработки этой формы, имя которой указано в форме атрибутом action, можно определить по значению этого поля, какая кнопка была нажата. Таким образом, для каждой кнопки можно написать отдельную процедуру ее обработки.
Кнопка сброса отменяет все изменения, внесенные в элементы формы. Синтаксис определения:
<input type="reset" value=" текст _на_кнопке">
Пример: передача данных формы из одного сценария в другой
В первом примере пользовательские данные вводятся на одной странице и отображаются на другой.
<HTML><head> <title>Пример</title></head>
<body bgcolor="#ffffff" text="#000000" link="#cbda74" vlink="#808040" alink="#808040">
<form action="Primer1-1.php" method="post">
<b>Получите информацию!</b><br>
Ваше имя:<br>
<input type="text" name="name" size="20" maxlength="20" value=""><br>
Ваш почтовый адрес:<br>
<input type="text" name="email" size="20" maxlength="40" value=""><br>
<input type="submit" value="Продолжить">
</form>
</body> </HTML>
Когда пользователь щелкает на кнопке отправки данных (кнопка Продолжить!), форма обращается к программе Пример.php, текст, которой, приведен ниже.
<HTML> <head><title>Пример</title></head>
<body bgcolor="#ffffff" text="#000000" link="#cbda74" vlink="#808040" alink="#808040">
<?
// Вывести имя и адрес электронной почты.
$name=$_POST[name]; //чтение значения поля name из массива значений полей
$email=$_POST[email]; //чтение значения поля email из массива значений полей
print "Имя $name Почтовый арес $email";
?>
</body> </HTML>
При работе с одним браузером можно выровнять длины полей и их расположение. Но при работе с другими браузерами это выравнивание нарушается и форма смотрится некрасиво. Или еще одна проблема: при уменьшении размера окна браузера (например, из-за маленького экрана дисплея) могут исчезать или обрезаться некоторые поля. Одним из эффективных средств решения этих проблем является форматирование экранной формы в виде таблицы с ячейками и задания размеров полей в процентом отношении относительно контейнера (например, ячейки таблицы, в которой находится несколько полей). При необходимости ячейки таблицы можно объединять по горизонтали или вертикале. Таким образом, форма будет “резиновой” сжиматься или разжиматься при изменении размеров окна браузера или при работе с другими браузерами. Пример такого форматирования приведен в п. 3.5.3.
Язык SQL заложен в основу практически всех существующих СУБД. SQL обычно описывается как стандартный язык, используемый для взаимодействия с реляционными базами данных. В реляционных СУБД данные организуются в виде набора взаимосвязанных таблиц. Связи между таблицами реализуются в виде ссылок на данные других таблиц. Таблицу можно представить себе как двухмерный массив, в котором расположение каждого элемента характеризуется определенными значениями строки и столбца.
Поддержка базы данных в РНР представлена набором стандартных функций для соединения с базой, обработки запросов и разрыва связи. СУБД MySQL стала самым популярным средством для работы с базами данных в РНР (http://www.mysql.com).
База данных с СУБД MySQL физически представляет папку под именем базы данных, а таблицы в базе данных - файлы в этой папке под именами таблиц. Одним из популярных визуальных редакторов таких баз данных является phpMyAdmin (он сам написан на языке PHP) и используется на практических занятия по разработке Web-приложений (п.3). Есть и другие редакторы, например HeidiQql.
Программное обеспечение MySQL представляет собой очень быстрый многопоточный, многопользовательский надежный SQLсервер баз данных.
MySQL имеет двойное лицензирование. Это означает, что пользователи могут выбирать, использовать ли ПО MySQL бесплатно по общедоступной лицензии GNU General Public License (GPL) или приобрести одну из стандартных коммерческих лицензий MySQL AB.
MySQL является решением для малых и средних приложений. Входит в LAMP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Благодаря открытой архитектуре и GPLлицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.
MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, GNU/Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003 и Windows Vista. Существует также порт MySQL к OpenVMS. Важно отметить, что компания MySQL AB предоставляет для свободной загрузки не только исходные коды СУБД, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули, которые можно загрузить с зеркал, представленных на официальном сайте.
MySQL имеет API (интерфейс) для языков C, C++, Java, Perl, PHP, Python, Ruby, Smalltalk и Tcl, библиотеки для языков платформы .NET, а также обеспечивает поддержку для ODBC посредством ODBCдрайвера MyODBC.
В MySQL 5.0 появилась практически полная поддержка стандарта SQL и значительно расширена функциональность, которая ставит MySQL в один ряд с коммерческими СУБД.. MySQL 5.0 содержит следующие нововведения: хранимые процедуры и функции; обработчики ошибок; курсоры; триггеры; представления; информационная схема (так называемый системный словарь, содержащий метаданные).
Рассмотрим основные функции PHP для работы с MySQL.
int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль]) - устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером.
В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Могут указываться необязательные параметры - номер порта, а также путь к сокету (для локального хоста). Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.
Пример открытия соединения с MySQL:
$link1=@mysql_connect("local host", "web", "4tf9zzzf") or exit("Не может установить связь с MySQL сервером!");
В данном примере localhost имя компьютера, web имя пользователя, а 4tf9zzzf пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, они заменяются сообщением, указанным при вызове exit( ). Идентификатор $link1 передается при последующих обращениях к базам данных с запросами.
mysql_pconnect( ) обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect( ) вместо mysql_connect( ) для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect( ) в точности совпадает c mysql_connect( ).
int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения]) выбор базы данных, находящяйся на сервере. Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор которой возвращается функцией mysql_select_db( ). Параметр идентификатор_соединения необязателен лишь при одном открытом соединении с сервером MySQL. При наличии нескольких открытых соединений этот параметр должен указываться. Пример выбора базы данных функцией mysql_select_db( ):
@mysql_connect("localhost", "web". "4tf9zzzf")
or exit("Невозможно открыть MySQL сервер!");
@mysql_select_db("company") or exit("Невозможно выбрать базу данных company!");
Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняя выбранная база данных.
int mysql_close ([int идентификатор_соединения]) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение.
Соединения, открытые функцией mysql_pconnect( ), закрывать не обязательно.
string mysql_error() - выводится текст сообщения об ошибке.
int mysql_query (string запрос [, int идентификатор_соединения]) - обеспечивает интерфейс для обращения с запросами к базам данных.
Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соединения, либо, при отсутствии параметра, последнему открытому соединению. В зависимости от типа запроса вызов mysql_query( ) может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result( ) для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE.
int mysql_affected_rows ([int идентификатор_соединения]) возвращается количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE.
Пример.
@mysql_connect("localhost", "web". "4tf9zzzf") or exit("Неможет открыть MySQL сервер!");
@mysql_select_db("company") or exit("Неможет открыть базы данных company!");
$query = "UPDATE products SET prod_name = \"cantaloupe\" WHERE prod_id = \'10001pr\";
$result = mysql_query($query); // Выполнить запрос
print "Число корректируемых записей; ".mysql_affected_rows( );
mysql_close( );
int mysql_num_rows(int результат) - определяется количество записей, возвращаемых командой SELECT.
int mysql_result (int идентификатор_результата, int запись [. mixed поле"]') - функция используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. В необязательном параметре поле могут передаваться: смещение поля в таблице; имя поля; имя поля в формате имя_поля_имя_тдблицы.
array mysql_fetch_row (int результат) - присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0).
Пример.
$query = "SELECT * FROM products";
$result = mysql_query($query); print "<table>\n";
print "<tr>\n<td> №</td><td>Наименование</td><td>Цена</td>\n</tr>\n";
while ($row = mysql_fetch_array($result))
{ print "<tr>\n"; print "<td>".$row["prod_id"]."</td>\n<td>".$row["prod_name"]."
</td>\n<td>" .$row["prod_price"]. "</td>\n"; print "</tr>\n";
}
print "</table>"; mysql_close();
array mysql_fetch_array (int идентификатор результата [, тип_индексации]) аналогична mysql_fetch_row( ), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве.
Параметр тип_индексации принимает одно из следующих значений:
MYSQL_ASSOC - возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;
MYSQL_NUM - возвращает массив с числовой индексацией;
MYSQL_BOTH - к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.
Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array( ), возвращающая ассоциативный массив полей.
Пример.
@mysql_connect( "local host", "web", "ffttss") or exit("Could not connect to MySQL server!");
@mysql_select_db( "company" ) or exit("Could not select products database!");
$query = "SELECT * FROM products"; $result = mysql_query($query);
print "<table>\n<tr>\n<td>№</td><td>Наименование</td> <td>Цена</td>\n</tr>\n";
while ($row = mysql_fetch_array($result)) ;
{print "<tr>\n<td>".$row["prod_id"]."</td>\n <td>".$row["prod_name"]."</td>\n <td>" . $row["prod_price"] . "</td>\n </tr>\n"; }
print "</table>"; mysql_close();
Термин ODBC (сокращение от «Open Database Connectivity», то есть «открытая архитектура баз данных») представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. Преимущества подобного подхода очевидны приложение может выполняться базами данных с различными СУБД т.е не зависить от типа СУБД. Работа с сервером баз данных через ODBC возможна лишь в том случае, если этот сервер является ODBC-совместимым. Другими словами, для него должны существовать драйверы ODBC. Хотя стандарт ODBC, разработанный компанией Microsoft, стал открытым стандартом, он в основном используется для работы с СУБД на платформе Windows; впрочем, драйверы ODBC также существуют и на платформе Linux. Приведем ссылки на драйверы для некоторых популярных СУБД:
Automation Technologies: http://www.odbcsdk.com;
Easysoft: http://www.easysoft.com/products/oob/main.pHTML;
MySQL (MyODBC): http://www.mysql.com;
OpenLinkSoftware: http://www.openlinksw.com.
Прежде чем начать работать с базами данных следует создать источник данных ODBC. Командой Пуск//Панель управления/Администрирование/Источники данных ODBC (32) запускается Администратор источников данных (рисунок. 2.1). Используя страницу Пользовательский DSN (источники доступны только текущему пользователю), Системный DSN (источники доступны всем пользователям) или Файловый DSN (файлы), можно установить доступ к конкретному файлу (базе данных, электронной таблице, текстовому файлу): указать DSNимя (для ссылки в программах), тип драйвера, пароль, имя пользователя и другую дополнительную информацию. Описания DSNисточников хранятся в реестре Windows, файловых в текстовых файлах с расширением DSN. Кнопками Добавить, Удалить и Настройка можно добавлять, удалять и изменять описания источников.
Рис. 2.1 - Окно Администратора источников данных
Функции ODBC в РНР, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД: Adabas D; IODBC; IBM DB2; Solid; Sybase SQL Anywhere.
В настоящее время существует около 40 общих функций ODBC (http://www.php.net/manual).
Приведем основные функции.
int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора]) - установить с ней связь c базой данных. В параметрах имя_пользователя и пароль, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе'н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений: SQL_CUR_USE_IF_NEEDED; SQL_CURSOR_USE_ODBC; SQL_CUR_USE_DRIVER; SQL CUR DEFAULT.
void odbc_close ([int идентификатор_соединения]) закрыть соединение, чтобы освободить все ресурсы, используемые открытым соединением. В параметре идентификатор_соединения передается идентификатор открытого соединения
Пример.
$connect =obdc_connect("myAccessDB", "user", "secret")or exit( "Ошибка при соединении");
… odbc_close ($connect);
int odbc_prepare (int идентификатор_соединения , string запрос) - перед непосредственной обработкой запрос необходимо «подготовить». В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute( ).
int odbc_execute (int идентификатор результата [, array параметры]) - запрос, подготовленный функцией odbc_prepare, выполняется). В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.
Пример.
$connect = @obdc_connect("myAccessDB", "user", "secret")
or exit("Ошибка при подключении к базе данных");
$query = "UPDATE customers SET cust_id = \"Milano, Inc.\"WHERE cust_id \"2000cu\"";
$result = odbc_prepare($connect, $query) or exit("Ошибки в запросе!");
$result = odbc_execute($result) or exit("Ошибки при выполнении запроса на обновление!");
odbc_close($connect);
int odbc_exec (int идентификатор_соединения , string запрос) - функция odbc_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:
Пример.
$connect =obdc_connect("myAccessDB", "user", "secret")
or exit("Ошибка при подключении к базе данных ");
$query = "SELECT * FROM customers";
$result = odbc_exec($connect, $query) or exit("Ошибки при выполнении запроса!");
odbc_close($connect);
int odbc_result_all (int идентификатор_результата [, string формат_таблицы]) - форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec( ) или odbc_execute( ). В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec( ) или odbc_execute( ). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML.
Пример.
($connect =obdc_connect("myAccessDB", "user", "secret")
or exit("Ошибка при подключении к базе данных ");
$query = "SELECT * FROM customers";
$result = odbc_exec($connect, $query) or exit("Ошибки при выполнении запроса!");
odbc_result_all($result, "BGCOLOR='#c0c0c0' border='1' ");
odbc_close($connect);
?>
В результате выполнения этого примера содержимое таблицы customers будет выведено в таблице на светло-сером фоне с рамкой толщиной 1.
int odbc_free_result (int идентификатор_результата) - освобождение всех ресурсов, связанных с завершенными операциями. В параметре функции передается идентификатор результата ($result), который больше не будет использоваться в программе. Все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result( ) необходим лишь для очень больших запросов, расходующих очень большие объемы памяти.
mSQL СУБД малого и среднего масштаба с поддержкой SQL. mSQL обрабатывает множественные одновременные подключения в рамках одного процесса. В результате получается маленький, быстрый, эффективный SQL-сервер, способный одновременно обрабатывать несколько запросов - локально или по сети.
Диалект SQL, поддерживаемый mSQL, является подмножеством стандарта ANSI SQL2, содержащим наиболее употребительные команды, такие как CREATE, INSERT, SELECT, UPDATE и DELETE. В СУБД нет поддержки транзакций.
Однопоточная сущность mSQL устраняет необходимость в пакетной обработке. Поскольку запросы выполняются поочередно, они не способны помешать один другому.
mSQL поддерживает два типа соединений со стороны клиента. Удаленные клиенты подключаются к серверу через порт TCP/IP через Интернет из любой точки мира. Локальные соединения тоже могут производиться через TCP/IP.
PostgreSQL - объектно-реляционная СУБД соперничает в популярности с MySQL и mSQL среди серверов баз данных среднего масштаба с поддержкой транзакций, триггеров и вложенных запросов (http://www.postgresql.org).
GNU SQL полностью функциональная СУБД с поддержкой SQL, транзакции, вложеных запросов и курсоров. (http://www.ispras.ru/-kml/gss/index.HTML).
Beagle - полностью SQL-совместимый сервер со всеми необходимыми функциями, включая объектно-реляционные расширения.
Шаблоны можно рассматривать как «расширение» программного кода. Шаблоны не только автоматизируют процесс кодирования, но и обеспечивают структурное деление проекта в рабочих группах. Обычно разделяются два главных компонента web-приложения: дизайн и программирование. Подобное деление обеспечивает возможность параллельной разработки (web-дизайн и программирование) без необходимости постоянной координации на протяжении всего рабочего цикла. Более того, оно позволяет в будущем модифицировать один компонент, не влияя на работу другого.
Рассмотрим порядок построения шаблона на следующем примере.
<HTML>
<head>
<title>:::::{page_title}:::::</title>
</head>
<body bgcolor="{bg_color}">
Прветствуем на нашей домашней страничке. {user_name}!<br>
Вам требуется 5 MB and 3 адреса электронной почты.<br>
</body>
</HTML>
Три строки (page_title, bg_color и user-name), заключенны в фигурные скобки ({ }). Фигурные скобки имеют особый смысл при обработке шаблонов - заключенная в них строка интерпретируется как имя переменной, вместо которого подставляется ее значение. Дизайнер строит страницу по своему усмотрению; все, что от него потребуется, - включать в соответствующие места документа эти ключевые строки. Конечно, программисты и дизайнеры должны заранее согласовать имена всех переменных!
Все функции построения и выполнения операций с шаблонами будут оформлены в виде методов класса. Определение класса начинается так:
class template {
VAR $files = array( );
VAR $variables = array( );
VAR $opening_escape = '{';
VAR $closing_escape = '}';
В массиве $files хранятся идентификаторы файлов и содержимое каждого файла. Атрибут $variables представляет собой двухмерный массив для хранения файлового идентификатора (ключа) и всех соответствующих переменных, обрабатываемых в схеме шаблонов. Наконец, атрибуты $opening_escape и $closing_escape задают ограничители для частей шаблона, которые должны заменяться системой. Как было показано в листинге 12.1, в наших примерах в качестве ограничителей будут использоваться фигурные скобки ({ }). Впрочем, вы можете изменить два последних атрибута и выбрать ограничители по своему усмотрению. Главное проследите за тем, чтобы эти символы не использовались для других целей.
Каждый метод класса решает конкретную задачу, соответствующую той или иной операции в процессе обработки шаблона. На простейшем уровне этот процесс можно разделить на четыре стадии.
1) Регистрация файлов
В процессе регистрации содержимое файла сохраняется в массиве с ключом, однозначно идентифицирующим этот файл. Метод register_file( ) открывает и читает содержимое файла, имя которого передается в качестве параметра. Код этого метода приведен ниже.
function register_file($file_id, $file_name) {
// Открыть $file_name для чтения или завершить программу с сообщением об ошибке
$fh = fopen($file_name, "r") or exit("Невозможно открыть файл $file_name!");
$file_contents = fread($fh, filesize($file_name)); // Прочитать файл $file_name в переменную
// Присвоить содержимое элементу массивас ключом $file_id.
$this->files[$file_id] = $file_contents;
fclose($fh); // Работа с файлом завершена, закрыть его.
}
Параметр $file_id содержит идентификатор «псевдоним» для последующих операций с файлом, упрощающий последующие вызовы метода. Идентификатор используется в качестве ключа для индексирования массива $files.
Пример регистрации файла:
include("tempiate.class"); // Включить класс шаблона
$template = new template; // Создать новый экземпляр класса
// Зарегистрировать файл "homepage.HTML", присвоив ему псевдоним "home"
$template->register_file("home", "homepage.HTML");
2) Регистрация переменных
После регистрации файлов необходимо зарегистрировать все переменные, которые будут интерпретироваться особым образом.
Метод register_variables( ) работает по тому же принципу, что и register_file( ) - он читает имена переменных и сохраняет их в массиве $variables:
function register_vanables($file_id, $variable_name) {
// Попытаться создать массив, содержащий переданные имена переменных
$input_variables = explode(".", $variable_name);
while (Iist($value) = each($input_variables)) // Перебрать имена переменных
$this->variables $this->variables[$file_id][] = $value // Присвоить значение элементу массива
}
В параметре $file_id передается ранее присвоенный псевдоним файла. Например, в предыдущем примере файлу homepage.HTML был присвоен псевдоним home. Обратите внимание при регистрации имен переменных, которые должны особым образом обрабатываться в файле homepage.HTML, вы должны ссылаться на файл по псевдониму! В параметре $variable_name передаются имена одной или нескольких переменных, регистрируемых для указанного псевдонима.
Пример.
// Включить класс шаблона include("tempiate.class");
// Создать новый экземпляр класса $template = new template;
// Зарегистрировать файл "homepage.HTML",
// присвоив ему псевдоним "home" $template->register_file("home", "homepage.HTML");
// Зарегистрировать несколько переменных
$template->register_variablest"home", "page_title.bg_color,user_name");
3) Обработка файла
После того как файлы и переменные будут зарегистрированы в системе шаблонов, можно переходить к обработке зарегистрированных файлов и замене всех ссылок на переменные с соответствующими значениями.
Метод file_parser( ):
function file_parser($file_id) {
// Сколько переменных зарегистрировано для данного файла?
$varcount = count($this->variables[$file_id]);
$keys = array_keys($this->files) // Сколько файлов зарегистрировано?
// Если файл $file_id существует в массиве $this->files
// и с ним связаны зарегистрированные переменные
If ( (in_array($file_id. $keys)) && ($varcount > 0))
{ // Сбросить $x $x = 0 Пока остаются переменные для обработки...
while ($x < sizeof($this->variables[$file_id]))
{ // Получить имя очередной переменной $string = $this->variables[$file_id][$x];
// Получить значение переменной. Обратите внимание:
// для получения значения используется конструкция $$.
// Полученное значение подставляется в файл вместо
// указанного имени переменной.GLOBAL $$string:
// Построить точный текст замены вместе с ограничителями
$needle = $this->opening_escape.$string.$this->closing_escape;
// Выполнить замену.
$this->files[$file_id] = str_replace( $needle.$$string.$this->files[$file_id]); $x++;
}
}
}
Сначала проверяем, присутствует ли указанное имя файла в массиве $this->files. Если файл был зарегистрирован, мы также проверяем, были ли для него зарегистрированы переменные, и если были - значения этих переменных подставляются в содержимое $file_id.
Пример.
// Включить класс шаблона include("template. class") ;
$page_title = "Приветствуем Вас на нашей домашней страничке!";
$bg_color = "white"; $user_name = "Chef Jacques";
$template = new template; // Создать новый экземпляр класса
// Зарегистрировать файл "homepage.HTML", присвоив ему псевдоним "home"
$template->register_file( "home", "homepage.HTML");
// Зарегистрировать несолько переменных
$template->register_variables("home", "page_titie, bg_color, user_name");
$template->file_parser("home");
Поскольку переменные page_title, bg_color и user_name были зарегистрированы, значения каждой переменной (присвоенные в начале сценария) подставляются в страницу homepage.HTML, хранящуюся в массиве files (атрибуте объекта-шаблона). На этом предварительная подготовка завершается, остается лишь вывести полученный шаблон в браузере.
4) Вывод файла
Вероятно, после обработки файла вы захотите отправить его в браузер, чтобы пользователь увидел результат обработки шаблона. В нашем примере для вывода файла создается отдельный метод, приведенный ниже.
function print_file($file_id) {
$file_id print $this->files[$file id]; // Вывести содержимое файла с идентификатором
}
При вызове print_file( ) содержимое файла, представленного ключом $file_id, передается в браузер.
Пример использования класса template.
// Включить класс шаблона, include("tempiate.class") и присвоить значения переменным
$page_title = "Приветствуем Вас на нашей домашней страничке!";
$bg_color = "white"; $user_name = "Chef Jacques":
// Создать новый экземпляр класса $template= new template;
// Зарегистрировать файл "homepage.HTML" с псевдонимом "home"
$template->register_file("home", "homepage.HTML");
// Зарегистрировать переменные
$template->register_variables("home", "page_title, bg_color.user_name");
$template->file_parser("home");
$template->print_file("home"); // Передать результат в браузер
Полный код класса template:
class template {
VAR $files = array( );
VAR $variables = array( );
VAR $opening_escape = '{';
VAR $closing_escape = '}' ;
function register_file($file_id, $file_name) {
// Открыть $file_name для чтения или завершить программу с сообщением об ошибке
$fh = fopen($file_name, "r") or exit("Невозможно открыть файл $file_name!");
$file_contents = fread($fh, filesize($file_name)); // Прочитать файл $file_name в переменную
// Присвоить содержимое элементу массивас ключом $file_id.
$this->files[$file_id] = $file_contents;
fclose($fh); // Работа с файлом завершена, закрыть его.
} // Функция: register_variables( ) Назначение: сохранение переменных, переданных
// в параметре $variable_name. в массиве с ключом $file_id.
function register_vanables($file_id, $variable_name) {
// Попытаться создать массив, содержащий переданные имена переменных
$input_variables = explode(".", $variable_name);
while (Iist($value) = each($input_variables)) // Перебрать имена переменных
$this->variables $this->variables[$file_id][] = $value // Присвоить значение элементу массива
}
function file_parser($file_id) {
// Сколько переменных зарегистрировано для данного файла?
$varcount = count($this->variables[$file_id]);
$keys = array_keys($this->files) // Сколько файлов зарегистрировано?
// Если файл $file_id существует в массиве $this->files
// и с ним связаны зарегистрированные переменные
If ( (in_array($file_id. $keys)) && ($varcount > 0))
{ // Сбросить $x $x = 0 Пока остаются переменные для обработки...
while ($x < sizeof($this->variables[$file_id]))
{ // Получить имя очередной переменной $string = $this->variables[$file_id][$x];
// Получить значение переменной. Обратите внимание:
// для получения значения используется конструкция $$.
// Полученное значение подставляется в файл вместо
// указанного имени переменной.GLOBAL $$string:
// Построить точный текст замены вместе с ограничителями
$needle = $this->opening_escape.$string.$this->closing_escape;
// Выполнить замену.
$this->files[$file_id] = str_replace( $needle.$$string.$this->files[$file_id]); $x++;
}
}
}
function print_file($file_id) {
$file_id print $this->files[$file id]; // Вывести содержимое файла с идентификатором
}
}
}
Описанная схема построения шаблонов используется в нескольких библиотеках РНР, среди которых наибольший интерес представляют следующие:
На сайте ресурсов РНР, PHPBuilder (http://www.phpbuilder.com), также имеется несколько интересных учебников, посвященных обработке шаблонов.
На сайте РНР Classes Repository (http://phpclasses.UpperDesign.com), можно найти несколько реализаций.
Технология СОМ (сокращение от «Component Object Model», то есть «модель составного объекта») обеспечивает взаимодействие между приложениями, работающими на разных языках и платформах. Такое взаимодействие в значительной мере способствует идее построения многократно используемых, легко сопровождаемых и адаптируемых программных компонентов (в последнее время к этим трем принципам проявляется повышенное внимание в области компьютерных технологий). Хотя СОМ обычно рассматривается как спецификация, ориентированная в первую очередь на продукты Microsoft, поддержка СОМ уже реализована во многих языках (например, в РНР, Java, C++ и Delphi) и существует на многих платформах, включая Windows, Linux и Macintosh.
РНР содержит несколько стандартных функций для работы с СОМ. Учтите, эти функции поддерживаются только в версии РНР для Windows!
object new СОМ("обьект.класс" [, string удаленный_адрес]) создание экземпляра объекта СОМ. Параметр объект.класс определяет модуль СОМ, присутствующий на сервере. Необязательный параметр удаленный_адрес используется в том случае, если объект СОМ создается на удаленном компьютере. Допустим, вы хотите создать экземпляр объекта для приложения MS Word. При этом приложение Microsoft Word запускается так, словно вы запустили его вручную. Команда имеет следующий синтаксис:
$word=new COM("word.application") or exit("Couldn't start Word!");
После того как экземпляр объекта СОМ будет создан, можно приступать к работе с различными методами и свойствами этого объекта. Допустим, вы захотели активизировать окно Word. Следующая команда изменяет атрибут видимости объекта, в результате чего графический интерфейс приложения отображается на экране: $word->visible = 1;
объект->имя_метода([значение, ...]) - вызов метода объекта СОМ. Объект соответствует экземпляру объекта СОМ, созданному описанным выше способом. Параметр имя_метода определяет имя метода, определенного в классе объект. Необязательный параметр значение позволяет передавать параметры при вызове методов, допускающих (или требующих) дополнительных данных. Как и при вызове обычных функций, параметры разделяются запятыми. Если после создания экземпляра объекта СОМ, представляющего MS Word, вы захотите создать в приложении новый документ, просто вызовите соответствующий метод. Задача решается методом add( ) субкласса Documents экземпляра $word:
$word->Documents->Add( );
В результате выполнения этой команды в окне приложения MS Word открывается новый документ.
mixed com_get(resource объект, string свойство) - возвращает значение свойства объектов СОМ. Первый параметр определяет экземпляр объекта СОМ, а второй атрибут класса, к которому относится данный экземпляр.
Пример.
// Создать экземпляр объекта для приложения MS Word
$word=new COM("word.application") or exit("Не может стартовать Word!");
// Режим CapsLock либо включен (свойство CapsLock = 0),
// либо выключен (свойство CapsLock = 1).
$flag = com_get($word->Application.CapsLock);
// Преобразовать значение Sflag (0 или 1) в логическое значение
if ($flag == 1) $flag = "YES"; else $flag = "NO";
print "CAPS Lock activated: $flag"; // Вывести сообщение
$word->Quit();
Существует и другое решение - значение атрибута CapsLock можно получить при помощи стандартного для ООП синтаксиса обращения к атрибутам: $flag = $word->Application->CapsLock;
void com_set(resource объект, string свойство, mixed значение) - присваивает атрибуту объекта новое значение.
Первый параметр определяет экземпляр объекта СОМ, а второй атрибут класса, к которому относится данный экземпляр. Третий параметр определяет новое значение свойства.
Пример. Создание и сохранение документа Word.
// Создать экземпляр объекта для приложения MS Word
$word=new COM("word.application") or exit("Не может стартовать Word!");
$word->visible = 1; // Активизировать окно
$word->Documents->Add();// Создать новый документ
// Вставить в документ фрагмент текста
$word->Selection->Typetext("Новый текст\n");
// Выбрать текстовый режим сохранения
$ok = com_set($word->Application, DefaultSaveFormat, "Text");
// Запросить у пользователя имя и сохранить документ
// по умолчанию документ сохраняется в текстовом формат!
$word->Documents[l]->Save;
$word->Quit();// Выйти из MS Word
?>
Существует и другое решение - новое значение атрибута DefaultSaveFormat можно присвоить непосредственно, как обычной переменной: $word->Application->DefaultSaveFormat = "Text".
Пример форматирования адресной книги из базы данных, в документе Word для построения отчета.
// Создать соединение с сервером MySQL
$host = "localhost"; $user = "root"; $pswd = ""; $db = "book";
$address_table = "addressbook";
mysql_connect($host. $user, $pswd) or exit("Не возможно открыть сервер!");
mysql_select_db($db) or exit("Не возможно открыть базы данных!");
// Выбрать из базы данных все записи
$query = "SELECT * FROM $address_table ORDER BY lastjiame";
$result = mysql_query($query);
// Создать новый объект COM для приложения MS Word
$word=new COM("word.application") or exit("Не стартует Word!");
MS Word $word->visible = 1; // Активизировать окно
$word->Documents->Add( ); // Открыть пустой документ.
while($row = mysql_fetch_array($result)); // Перебрать записи из таблицы адресов
{ $last_name = $row["last_name"]; $first_name = $row["first_name"];
$tel = $row["tel"]; $email = $row["email"];
// Вывести данные таблицы в открытый документ Word.
$word->Selection->Typetext("$last_name. $first_name\n");
$word->Selection->Typetext("tel. $tel\n"); $word->Selection->Typetext("email. $email:\n");
}
$word->Documents[l]->Save; // Запросить у пользователя имя документа.
$word->Quit();// Выйти из MS Word
Обзор объектной модели всех приложений семейства Office приведен по адресу http://www.microsoft.com/officedev/articles/Opg/toc/PGTOC.htm).
Ниже перечислены ссылки на некоторые полезные ресурсы, посвященные СОМ:
http://www.microsoft.com/com/nets/drgui.asp;
http://www.microsoft.com/com/default.asp;
http://www.comdeveloper.com.
Безопасность сервера во многих отношениях определяет безопасность данных, обрабатываемых сценариям РНР. Большинство пользователей работает с сервером Apache, поэтому рекомендуется посещать сайты http://www.apache.org.
Рассмотрим основные проблемы безопасности.
Следует внимательно проанализировать все параметры конфигурации и разрешить только то, что действительно необходимо.
Параметры конфигурации РНР определяются в файле php.ini.
Параметр safe_mode - ограничивается использование некоторых потенциально опасных возможностей РНР. Для включения или выключения безопасного режима параметру safe_mode присваивается значение on или off. Механизм ограничения основан на сравнении идентификатора пользователя (UID) выполняющегося сценария с идентификатором пользователя того файла, к которому этот сценарий пытается обратиться. Если идентификаторы совпадают, функция выполняется; в противном случае попытка завершается неудачей.
Безопасный режим не может использоваться в том случае, если РНР откомпилирован в виде модуля Apache. Дело в том, что при работе РНР в режиме модуля Apache все сценарии РНР работают под тем же идентификатором, что и Apache, что не позволяет различать владельцев разных сценариев.
При включении безопасного режима действуют следующие ограничения:
Функции, выполнение которых ограничивается в безопасном режим: chgrp, chmod, chown , exec, fopen, file, include, link, passthru, popen, readfile, rename, require, rmdir, symlink, system, unlink.
Рассмотрим основные параметры конфигурации.
safe_mode_exec_dir определяет каталог для размещения системных программ, запускаемых такими функциями, как system( ), exec( ) или passthru( ). Параметр используется лишь при включенном безопасном режиме.
disable_functions задает список через запятую имен функций, выполнение которых требуется запретить.
doc_root - присваивается путь к корневому каталогу для файлов РНР. Если значение doc_root представляет собой пустую строку, оно игнорируется и сценарии РНР выполняются в полном соответствии с URL. Если безопасный режим включен, а параметр doc_root содержит непустое значение, то сценарии РНР за пределами этого каталога выполняться не будут.
max_execution_time - указывает максимальную продолжительность выполнения сценария (в секундах). По истечении указанного срока сценарий автоматически завершается. По умолчанию параметр равен 30 секундам. Если присвоить ему 0, время выполнения сценариев не ограничивается.
memory_limit определяет максимальный объем памяти (в байтах), используемой сценарием. По умолчанию параметр равен 8 Мбайт.
sql.safe_mode - при его включении игнорируется вся информация, передаваемая функциям mysql_connect( ) и mysql_pconnect( ), а подключения разрешаются только для UID, под которым работает web-сервер.
user_dir определяет имя подкаталога в домашнем каталоге пользователя, в котором должны находиться исполняемые сценарии РНР.
В конфигурационном файле Apache httpd.conf присутствует параметр DocumentRoot. С его помощью устанавливается путь к каталогу, который рассматривается сервером как общедоступный каталог HTML. Считается, что любой файл в этом каталоге может быть передан в пользовательский браузер, даже если расширение этого файла не опознано. Пользователи не могут просматривать файлы, находящиеся за пределами этого каталога. Следовательно, конфигурационные файлы никогда не следует хранить в каталоге DocumentRoot!
Сохраняете все файлы, которые не должны просматриваться пользователями, вне корневого каталога документов и в дальнейшем включаете их в сценарии РНР директивой include( ).
Доступ к файлам с конфиденциальной информацией ограничивается по расширению файла, при этом используется параметр FILES файла httpd.conf. Допустим, вы хотите запретить пользователям доступ к файлам с расширением .inc. Для этого достаточно включить в файл httpd.conf следующий фрагмент:
<Files *.inc>
Order allow, deny
Deny from all
</Files>
Рассмотрим некоторые функции PHP
string escapeshellcmd(string команда) - экранирует все сомнительные символы в строке, которые могут привести к выполнению потенциально опасной системной команды.
string strip_tags (string строка [, string разрешенные_теги]) - удаляет из строки все теги HTML. Первый параметр определяет строку, из которой удаляются теги, а второй необязательный параметр определяет теги, остающиеся в строке.
Пример.
$input = "Я <i> действительно </i> люблю РНР!"; $input = strip_tags($input);
// Результат: $input = "Я действительно люблю PHP!";
Шифрованием называется процесс преобразования данных в формат, в котором они могут быть прочитаны только предполагаемым получателем сообщения. Получатель расшифровывает данные при помощи ключа или секретного пароля. РНР поддерживает несколько алгоритмов шифрования. Шифрование данных в Web имеет смысл только в том случае, если сценарии, в которых используются средства шифрования, работают на защищенном сервере. Поскольку РНР является сценарным языком, работающим на стороне сервера, перед шифрованием данные должны быть отправлены на сервер в простом текстовом формате. Если данные передаются через незащищенное соединение, существует немало способов перехвата этой информации в процессе ее пересылки от пользователя на сервер (http://www.apache-ssl.org).
Приведем некоторые функции.
string md5(string строка) хэширующий алгоритм MD5 используется для создания цифровых подписей, позволяющих однозначно идентифицировать отправителя. MD5 является алгоритмом «одностороннего» хэширования; это означает, что данные, хэшируемые функцией md5(), восстановить уже невозможно. Алгоритм MD5 также применяется при проверке паролей. Поскольку теоретически невозможно восстановить исходную строку, обработанную алгоритмом MD5, можно хэшировать пароль функцией md5( ) и затем сравнивать зашифрованный пароль с результатом обработки пароля, введенного пользователем при попытке получения доступа к конфиденциальной информации.
Допустим, имеется некоторый секретный пароль toystore с хэш-кодом 745e2abd7c52eeldd7cl4aeOd71b9d76. Хэшированное значение сохраняется на сервере и сравнивается с хэш-эквивалентом пароля, введенного пользователем. Даже если злоумышленник получит доступ к зашифрованному паролю, это ни на что не повлияет, поскольку он не сможет восстановить по нему оригинал.
Пример хэширования строки.
$val = "secret";
$hash_val = md5 ($val);
// $hash_val = "Clab6fb9182fl6eed935bal9aa830788";
string cкypt(string строке [, детерминант]) - одностороннее шифрования данных: данные могут только шифроваться. Первый параметр определяет строку, шифруемую функцией. Необязательный второй параметр определяет алгоритм, используемый при шифровании. Точнее, тип алгоритма определяется длиной детерминанта. Различные типы алгоритмов и длины (в скобках) их детерминантов: CRYPT_STD_DES (2), CRYPT_EXT_OES (2), CRYPT_MD5 (12), CRYPT BLOWFISH (12).
Пример применение функции crypt (STD_DES) для хранения и сравнения паролей
$user_pass = "123456";
// Выделить первые два символа $user_pass и использовать их в качестве детерминанта.
$salt = substr($user_pass. 0, 2);
$crypt1 = crypt($user_pass, ;salt); // Зашифровать и сохранить пароль.
// $crypt1 = "12tir.zIbWQ3c"
//... пользователь вводит пароль
$entered_pass = "123456";
$salt1 = substr($crypt, 0, 2); // Получить первые два символа хранящегося пароля
// Зашифровать $entered_pass, используя $saltl в качестве детерминанта.
$crypt2 = crypt($entered_pass, $salt1);
// $crypt2 = "12tir.zIbWQ3c" Следовательно. $cryptl = $crypt2
Функция md5()обеспечивает лучшую защиту.
Функция mhash( ) поддерживает несколько алгоритмов хэширования, которые позволяют разработчикам использовать контрольные суммы и разнообразные цифровые подписи в приложениях РНР. Хэши также используются для хранения паролей (http://mhash.sourceforge.net).
Mcrypt - популярный пакет шифрования данных в РНР, обеспечивающий возможность двустороннего шифрования (то есть собственно шифрование и расшифровку данных). Имеется четыре режима шифрования СВС, СFВ, ЕСВ, OFB.
Правильно введенные имя и пароль открывают пользователю доступ к каталогам сервера. Этот принцип аутентификации обычно называется схемой «запрос/ответ». Запросом является приглашение к вводу имени и пароля, а ответом - введенные данные. Если введенная комбинация верна, пользователю предоставляется доступ к защищенным каталогам.
Как правило, для ввода имени и пароля применяются диалоговые окна, активизируемые вызовом функции header( ).
Следующим шагом после подготовки интерфейса для ввода является обработка имени пользователя и пароля. В РНР имя и пароль хранятся в двух глобальных переменных, $PHP_AUTH_USER (имя) и $PHP_AUTH_PW (пароль). В простейшей, но недостаточно гибкой схеме ограничения доступа к странице имя пользователя и пароль жестко кодируются в сценарии:
if ((!isset ($PHP_AUTH_USER)) || (!isset ($PHP_AUTH_PW)) ||
($PHP_AUTH_USER != 'login') || ($PHP_AUTH_PW != 'parol'))
{ header( 'WWW-Authenticate: Basic realm="Secret Family Recipes"');
header ('HTTP/1.0 401 Unauthorized'); print "Неверно указан логин и/или пароль!";
exit;
}
Пример, чтение аутентификационных данных из текстового файла (authenticate.txt). В каждой строке файла содержится отдельная пара «имя:пароль»; в процессе проверки программа последовательно читает и проверяет все строки файла:
$file = "authenticate.txt"; $fp = fopen($file, "r");
$auth_file = fread ($fp, filesize($fp)); fclose($fp); $authorized = 0;
$elements = explode ("\n", $auth_file); // Сохранить строки файла в виде элементов массива
foreach ($elements as $element)
{ list ($user, $pw) = split (":", $element);
if (($user == $PHP_AUTH_U$ER) && ($pw== $PHP_AUTH_PW))
{ $authorized = 1; break; }
}
if (! $authorized)
{ header('WWW-Authenticate: Basic realm="Secret Family Recipes'");
header('HTTP/1.0 401 Unauthorized'); print "Неверный логин и/или пароль"; exit;
}
else print "Приветствую Вас!";
Пример программы аутентификации пользователя c аутентификацион-ными данными в демонстрационной таблицей (user_authenticate) в базе данных (useMnfo) с полями: userid, username, password.
if (!isset($PHP_AUTH_USER))
{ header( 'WWW-Authenticate: Basic realm="Secret Family Recipes'");
header('HTTP/1.0 401 Unauthorized'); exit;
}
else
{ mysql_connect ("host", "user", "password")
or exit ("Ошибка при подключении!"); // Создать содинение с базой данных MySQL
mysql_select_db ("useMnfo")or exit ("Ошибка при открытии базы данных!");
// Обратиться к таблице user_authenticate для поиска совпадающей строки
$query = "select userid from user_authenticate whereusername = '$PHP_AUTH_USER' and
password = '$PHP_AUTH_PW'"; $result = mysql_query (Squery):
// Если совпадение не найдено, вывести окно аутентификации
if (mysql_numrows($result) != 1)
{ header('WWW-Authenticate: Basic realm="Secret Family Recipes'");
header ('HTTP/ 1.0 401 Unauthorized'); exit;
}
// Если проверка пройдена, получить идентификатор пользователя
else $userid = mysql_result (user_authenticate, 0, $result);
}
Давайте содержательные имена, которые упрощают чтение и понимание программного кода.
Поддерживайте один стиль именования переменных и функций.
Делайте идентификаторы констант в верхнем регистре.
Разбивайте код на фрагменты меньшего размера.
Документируйте свой код. В заголовках функций, действия которых могут быть не вполне очевидными, расскажите о том, что ожидается на входе и на выходе методов, а так же об их назначении. Если код настолько запутан, что вам приходится описывать то, что он делает, задумайтесь возможно, имеет смысл переработать этот код, чтобы упростить его понимание. Развитие привычки к использованию хороших имен, а также методов и структур небольшого размера, сделает ваш код более читабельным и избавит вас от необходимости комментирования его действий. Хорошая привычка: документирование функций и классов.
Обрабатывайте ошибки. Хорошая привычка состоит в нахождении разумного баланса между достаточным объемом обработки ошибок и отказом от излишнего совершенствования своего кода, которое может никогда не закончиться. Плохая привычка: полное отсутствие обработки ошибок, например, отсутствие проверки входных параметров, значений полей. Обрабатывайте исключения как можно ближе к месту возникновения проблемы.
Не пользуйтесь операцией «копировать и вставить», которая способствует «разрастанию» схожих фрагментов кода. Нужно переписать копируемый фрагмент кода, чтобы обеспечить его повторное использование, например, написать функцию или отдельный фрагмент и вызывать его оператором включения (Include) содержимого файла. Размещение кода в одном месте существенно упрощает его последующее сопровождение, поскольку изменения необходимо производить только в одной точке.
Используйте функцию print() вместо printf() в случаях, когда выводятся неформатированные данные.
Минимизируйте число временных переменных - они должны использоваться несколько раз и повышать читабельность кода.
Минимизируйте число функций пользователя, используйте стандартные функции.
Не объединяйте код HTML (интерпретируемый на стороне клиента) и код PHP (выполняемый сервером) в один большой файл.
Не используйте устаревшие синтаксис и функции.
Наличие флага NULL, увеличивает объем данных при хранении на диске. И нагружает индексы. Определяйте типы полей как NOT NULL.
IP-адреса лучше всего хранить как UNSIGNED INT и использовать MySQL-функции INET_ATON() и INET_NTOA().
VARCHAR имеет переменную длину в файле. Занимает столько места сколько записано данных. При UPDATE если данных стало больше - выделяется место в другом месте файла. Это создает дополнительную нагрузку и является причиной фрагментации. Используйте VARCHAR если данные обновляются редко, либо используется сложная кодировка, например UTF-8. Идеально для хранения неизменяемых данных.
CHAR имеет фиксированную длину в файле. Фрагментация ему не страшна. CHAR полезен когда нужно хранить короткие строки приблизительно одинаковой длины. Частое обновление не ведет к фрагментации. Старайтесь использовать CHAR, сортировка по такому полю производится быстрее.
Используйте TIMESTAMP, он занимает на диске меньше места.
Не используйте JOIN между CHAR/VARCHAR и ENUM.
Применять значения по умолчанию (DEFAULT). При вызове запроса INSERT в таблицу будут записываться только те поля, значения которых отличаются от DEFAULT.
Используйте настолько малые типы INT, насколько это возможно.
Если у вас нет записей с переменной длиной (ни одного поля с типом VARCHAR, BLOB или TEXT), то таблица сохраняется в формате
постоянной длиной записи. Это несколько расходует память, но намного повышает скорость работы.
При использовании нескольких последовательных INSERT запросов, лучше все данные указать в одном INSERT, чем делать несколько INSERT.
При загрузке данных в таблицу лучше использовать LOAD DATA INFILE, чем INSERT, такой метод в 20 раз быстрее.
Если ожидается много запросов INSERT или UPDATE, работающих одновременно, то для большей скорости рекомендуется приметь LOCK TABLES.
Время от времени нужно дефрагметировать таблицы. Это делается утилитой isamchk с опциями - evi.
Все индексы хранятся в двоичном дереве. В строковых типах автоматически происходит сжатие начальных и конечных пробелов. Рекомендует всегда указывать индексы при создании таблиц для полей сортировок, группировок и поиcка записей.
В условиях WHERE задавайте вместо функций переменные и/или константы.
Используйте EXPLAIN для ваших запросов SELECT.
Используйте LIMIT 1, если нужно получить уникальную строку в запросе SELECT.
Не используйте ORDER BY RAND().
Старайтесь не использовать SELECT *.
Рекомендуется использование в каждой таблице поля id, для которого установлены свойства PRIMARY KEY, AUTO_INCREMENT, и оно имеет тип из семейства INT. Предпочтительно UNSIGNED. Даже в вашей таблице есть поле с уникальным именем пользователя, не делайте его основным ключом. Поля с типом VARCHAR медленно работают в качестве основных ключей. Также структура вашей базы данных будет лучше, если в ней внутри использовать ссылки на записи на основании id.
Используйте ENUM вместо VARCHAR. Столбцы типа ENUM очень компактные и быстрые. Они хранятся в базе данных как и TINYINT, но еще они могут содержать строчные значения.
Изучите предложения PROCEDURE ANALYSE(). Она позволяет MySQL анализировать структуру столбцов и действительных данных в вашей таблице и на основании анализа выдавать "предложения". Это действует только если в вашей таблице есть реальные данные, так как их наличие играет существенную роль при принятии решений.
Выбирайте правильный механизм хранения данных. Есть два основных механизма хранения
1) MyISAM отлично подходит для приложений с большой нагрузкой по чтению, но он не очень хорошо масштабируется при наличии большого количества записей - вся таблица будет заблокирована и ни один процесс не сможет ничего прочитать пока запрос не завершится. MyISAM быстро выполняет вычисления для запросов типа SELECT COUNT(*).
2) InnoDB является более сложным механизмом хранения данных, и он может быть более медленным, чем MyISAM для большинства маленьких приложений. Но он поддерживает блокирование строк, что лучше для масштабирования таблиц. Также он поддерживает некоторые дополнительные особенности, такие как транзакции.
Не рекомендуется использовать без консультации с системным администратором функции постоянного соединения mysql_pconnect().
Если запрос оставляется вручную, то все числовые параметры должны быть приведены к нужному типу, а все остальные параметры должны быть обработаны функцией mysql_real_escape_string() и заключены в кавычки или в апосторофы и в них должны быть экранированы слешами спецсимволы.
Пример. $z=”SELECT * FROM table WHERE name = 'Д\'Артаньян'”
Распространенной ошибкой является применение фунции stripslashes при получении данных из базы.
Однако для простоты и надёжности можно и с числами работать, как со строками (проскольку mysql всё равно преобразует их к нужному типу). Таким образом, любые данные, вставляемые в запрос, рекомендуется прослешивать и заключать в кавычки.
Имена полей и таблиц рекомендуется заключать в обратные одинарные кавычки - "`" (клавиша с этим символом находится на стандартной клавиатуре слева от клавиши "1") Ведь имя поля может совпадать с ключевыми словами mysql, но если мы используем обратную кавычку, то MySQL поймёт всё правильно.
Пример. SELECT * FROM `table` WHERE `date` = '2006-04-04'
Обратные кавычки слешами не экранируются.
Вопросы для контроля
На какие web-серверы ориентирован РНР?
Что включает в себя Denwer?
В именах переменных и функций большие и малые буквы различаются в PHP?
Что представляет собой составной оператор PHP и его назначение?
В чем отличие строк заключенных в апострофы и в кавычки в PHP?
К отдельным символам строки можно обращаться как к элементам массива с последовательной нумерацией в PHP?
Что представляет собой массив с ассоциативным индексом в PHP?
С какого символа начинаются имена переменных в PHP?
Переменные в РНР требуют специального объявления?
Как определяется тип переменной в PHP?
Где определяется локальная переменная?
Как объявляется глобальная переменная?
Как объявляется статическая переменная?
Преобразование вещественного типа к целому всегда сопровождается округлением в PHP?
В именах констант указывается знак доллара в PHP?
Назначение оператора foreach в PHP .
Назначение оператора switch в PHP .
Назначение оператора break [n] в PHP.
Назначение оператора continue [n] в PHP.
Назначение оператора return n в PHP.
Какие символы указываются при объявлении индексируемого массива после его имени в PHP?
Назначение функции array в PHP ?
Назначение функции list в PHP ?
Назначение функции array range в PHP?
Назначение функции $_POST в PHP?
Назначение функции $_GET в PHP?
Назначение функции file_exists в PHP?
Назначение функции fclose в PHP?
Назначение функции fwrite в PHP?
Назначение функции fread в PHP?
Назначение функции exec в PHP?
Назначение функции escapeshellcmd в PHP?
Назначение регулярного выражения в PHP?
Назначение функции trim в PHP?
Назначение функции strlen в PHP?
Назначение функции strspn в PHP?
Назначение функции str_replace в PHP?
Назначение функции strstr в PHP?
Назначение функции substr в PHP?
Назначение функции include в PHP?
.
Назначение функции include_once в PHP?
Назначение метода get в PHP?
Назначение метода post в PHP?
Назначение функции textarea в HTML?
Назначение кнопки submit в PHP?
Назначение функции mysql_connect в PHP?
Назначение функции mysql_select_db в PHP?
Назначение функции mysql_close в PHP?
Назначение функции mysql_error в PHP?
Назначение функции mysql_query в PHP?
Назначение функции int mysql_num_rows в PHP?
Назначение функции mysql_result в PHP?
Назначение функции mysql_fetch_row в PHP?
Назначение функции mysql_fetch_array в PHP?
Назначение функции odbc_connect в PHP?
Назначение функции odbc_close в PHP?
Назначение функции odbc_prepare в PHP?
Назначение функции odbc_execute в PHP?
Назначение функции odbc_exec в PHP?
Назначение функции odbc_result_all в PHP?
Назначение технологии СОМ?
Приведем пример разработанного учебного сайта (рисунок 3.1.1).
Рисунок 3.1.1 страницы сайта
Приведем HTML-код сайта
<HTML><HEAD> <TITLE>Заказ авиабилетов</TITLE></HEAD>
<BODY bgcolor="#b2d6e8">
<FONT COLOR="blue" SIZE="20"><EM><B><P ALIGN="CENTER"><TD><img src="../files/127/L:\Сайт\samolet.png"> Заказ авиабилетов</B></EM></FONT> </P>
<TD> <img src="../files/127/L:\Сайт\header00.jpg"></TD>
<div class="heading1" SIZE="3"><B><P ALIGN="CENTER">Закажите авиабилет сейчас!</B></P></div><p>
Сайт продает авиабилеты на все рейсы всех авиакомпаний мира.
<p>Для заказа авиабилета необходимо выбрать дату, маршрут полета, а также понравившийся рейс. После этого надо указать необходимую для бронирования информацию - ФИО, контактный телефон и т.д.
<p>Все данные обрабатываются оператором, который свяжется с вами не позднее 4 часов с момента заказа.
<p>Доставка билетов осуществляется. Cтоимость доставки 250 рублей.
</div>
</BODY>
<h1 align="center"><strong>Стоимость авиабилетов</strong></h1>
<table width="682" border="2">
<tr>
<th width="133" align="center" valign="middle" bgcolor="#b6d3e7" scope="col">Страна</th>
<th width="211" align="center" valign="middle" bgcolor="#b6d3e7" scope="col">Город вылета\прибытия</th>
<th width="198" align="center" valign="middle" bgcolor="#b6d3e7" scope="col">Средняя стоимость билета</th>
<th width="110" align="center" valign="middle" bgcolor="#b6d3e7" scope="col">Время вылета</th>
</tr>
<tr>
<td rowspan="3" align="center" valign="top" bgcolor="#b6d3e7"><strong>Россия</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Уфа\Москва</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">3 000 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">16:40</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Москва\Санкт-Петербург</td>
<td align="center" bgcolor="#b6d3e7">1 500 р.</td>
<td align="center" bgcolor="#b6d3e7">13:20</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Москва\Екатеринбург</td>
<td align="center" bgcolor="#b6d3e7">6 450 р.</td>
<td align="center" bgcolor="#b6d3e7">9:00</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Испания</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Моква\Мадрид</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">21 618 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">21:30</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Мадрид\Барселона</td>
<td align="center" bgcolor="#b6d3e7">10 000 р.</td>
<td align="center" bgcolor="#b6d3e7">3:25</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Франция</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Париж</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">19 575 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">19:10</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Париж\Лион</td>
<td align="center" bgcolor="#b6d3e7">9 500 р.</td>
<td align="center" bgcolor="#b6d3e7">5:40</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Великобритания</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Лондон</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">13 426 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">11:35</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Лондон\Ливерпуль</td>
<td align="center" bgcolor="#b6d3e7">20 000 р.</td>
<td align="center" bgcolor="#b6d3e7">12:00</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Италия</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Пермь\Рим</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">22 000 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">14:30</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Рим\Милан</td>
<td align="center" bgcolor="#b6d3e7">4 500 р.</td>
<td align="center" bgcolor="#b6d3e7">20:10</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Греция</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Екатеринбург\Афины</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">19 500 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">10:15</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Пермь\Афины</td>
<td align="center" bgcolor="#b6d3e7">35 000 р.</td>
<td align="center" bgcolor="#b6d3e7">2:55</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Индия</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Мумбай</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">19 747 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">17:15</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Пермь\Гоа</td>
<td align="center" bgcolor="#b6d3e7">77 000 р.</td>
<td align="center" bgcolor="#b6d3e7">8:30</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Египет</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Каир</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">18 900 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">22:45</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Лондон\Каир</td>
<td align="center" bgcolor="#b6d3e7">14 500 р.</td>
<td align="center" bgcolor="#b6d3e7">16:20</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Канада</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Ванкувер</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">34 426 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">20:20</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Москва\Оттава</td>
<td align="center" bgcolor="#b6d3e7">30 500 р.</td>
<td align="center" bgcolor="#b6d3e7">8:00</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>США</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Нью-Йорк</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">27 739 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">13:00</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Москва\Лос-Анджелес</td>
<td align="center" bgcolor="#b6d3e7">29 620 р.</td>
<td align="center" bgcolor="#b6d3e7">5:00</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Авсралия</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Сидней</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">40 916 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">23:30</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Москва\Перт</td>
<td align="center" bgcolor="#b6d3e7">40 607 р.</td>
<td align="center" bgcolor="#b6d3e7">15:15</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Китай</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Шанхай</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">14 909 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">18:20</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Пермь\Пекин</td>
<td align="center" bgcolor="#b6d3e7">20 000 р.</td>
<td align="center" bgcolor="#b6d3e7">21:00</td>
</tr>
<tr>
<td rowspan="2" align="center" valign="top" bgcolor="#b6d3e7"><strong>Бразилия</strong></td>
<td align="center" valign="middle" bgcolor="#b6d3e7">Москва\Рио де Жанейро</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">39 840 р.</td>
<td align="center" valign="middle" bgcolor="#b6d3e7">7:00</td>
</tr>
<tr>
<td align="center" bgcolor="#b6d3e7">Рио де Жанейро\Сан-Пауло</td>
<td align="center" bgcolor="#b6d3e7">5 500 р.</td>
<td align="center" bgcolor="#b6d3e7">4:30</td>
</tr>
</table>
<FONT COLOR="black" SIZE="5"><EM><B><P ALIGN="CENTER">Оформление заказа</B></EM></FONT> </P>
</table></div><br>
<table width=535 border=0 align='center' cellpadding=3 cellspacing=1 class='office'>
<form action='/bron-avia.php?city=MOW&cityfrom=%CF%E5%F0%EC%FC&cityto=%CC%EE%F1%EA%E2%E0&aviacompany=%C0%FD%F0%EE%F4%EB%EE%F2&class=Q&ow=104&rt=208' method=post name='orderForm'>
</tr>
<tr>
<td valign=top bgcolor='#1250e3' class=h2><strong>Город вылета<br>
</strong></td>
<td align=left valign=top bgcolor='#1250e3' style="padding-left: 30px">
<input type='text' class=fancyBox name='Takeoff' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000; width:250px; height:16px;'> </td>
</tr>
<tr>
<td width=130 valign=top bgcolor='#1250e3'><strong>Город прилета<br>
</strong></td>
<td align=left valign=middle bgcolor='#1250e3' style='padding-left: 30px'>
<input type=text class=fancyBox name='Arrival' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000; width:250px; height:16px;'> </td>
</tr>
<tr>
<td width=130 valign=top bgcolor='#1250e3'><strong>Маршрут</strong></td>
<td align=left valign=middle bgcolor='#1250e3'style='padding-left: 30px'>
<input type=radio name='Type' value='в одну сторону' id='type_1' align=absmiddle checked><label for='type_1'>В одну сторону</label><br><input type=radio name='Type' value='туда и обратно' id='type_2' align=absmiddle><label for='type_2'>Туда и обратно</label> </td>
</tr>
<tr bgcolor="#1250e3">
<td style="padding:0 0 0 3"><b>Дата вылета:</b></td>
<td style="padding-left: 30px">
<select class="date" name="outDay" onchange="setBestPrices(true);">
<option value='01' >01</option><option value='02' >02</option><option value='03' >03</option><option value='04' >04</option><option value='05' >05</option><option value='06' >06</option><option value='07' >07</option><option value='08' >08</option><option value='09' >09</option><option value='10' >10</option><option value='11' >11</option><option value='12' >12</option><option value='13' >13</option><option value='14' >14</option><option value='15' >15</option><option value='16' >16</option><option value='17' >17</option><option value='18' >18</option><option value='19' >19</option><option value='20' >20</option><option value='21' >21</option><option value='22' >22</option><option value='23' >23</option><option value='24' >24</option><option value='25' >25</option><option value='26' >26</option><option value='27' >27</option><option value='28' >28</option><option value='29' >29</option><option value='30' selected>30</option><option value='31' >31</option> </select><select class="date" name="outMonth">
<option value="01" selected >янв</option>
<option value="02" >фев</option>
<option value="03" >мар</option>
<option value="04" >апр</option>
<option value="05" >май</option>
<option value="06" >июн</option>
<option value="07" >июл</option>
<option value="08" >авг</option>
<option value="09" >сен</option>
<option value="10" >окт</option>
<option value="11" >ноя</option>
<option value="12" >дек</option>
</select><select font-family:Tahoma;' name="outYear">
<option value="2010" selected>2010</option>
<option value="2011" >2011</option>";
</select>
</td>
</tr>
<tr bgcolor="#1250e3">
<td style="padding:0 0 0 3"><b>Дата прилета:</b></td>
<td style="padding-left: 30px">
<select class="date" name="inDay" >
<option value='01' selected>01</option><option value='02' >02</option><option value='03' >03</option><option value='04' >04</option><option value='05' >05</option><option value='06' >06</option><option value='07' >07</option><option value='08' >08</option><option value='09' >09</option><option value='10' >10</option><option value='11' >11</option><option value='12' >12</option><option value='13' >13</option><option value='14' >14</option><option value='15' >15</option><option value='16' >16</option><option value='17' >17</option><option value='18' >18</option><option value='19' >19</option><option value='20' >20</option><option value='21' >21</option><option value='22' >22</option><option value='23' >23</option><option value='24' >24</option><option value='25' >25</option><option value='26' >26</option><option value='27' >27</option><option value='28' >28</option><option value='29' >29</option><option value='30' >30</option><option value='31' >31</option> </select><select class="date" name="inMonth">
<option value="01" >янв</option>
<option value="02" selected >фев</option>
<option value="03" >мар</option>
<option value="04" >апр</option>
<option value="05" >май</option>
<option value="06" >июн</option>
<option value="07" >июл</option>
<option value="08" >авг</option>
<option value="09" >сен</option>
<option value="10" >окт</option>
<option value="11" >ноя</option>
<option value="12" >дек</option>
</select><select class="date" name="inYear">
<option value="2010" selected>2010</option>
<option value="2011" >2011</option>";
</select>
</td>
</tr>
<tr>
<td width=130 valign=top bgcolor='#1250e3' ><strong>Кол-во
билетов</strong></td>
<td align=left valign=middle bgcolor='#1250e3' style='padding-left: 30px'>
<input type=text class=fancyBox size=2 name='TicketsNum' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000;'>
</td>
</tr>
<tr>
<td width=130 valign=top bgcolor='#0780e3' ><strong>Контактный
телефон </strong></td>
<td align=left valign=top bgcolor='#0780e3' style='padding-left: 30px'>
<input type=text class=fancyBox name='Telephone' value='' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000; width:180px; height:16px;'>
<br>
</td>
</tr>
<tr>
<td width='130' valign=top bgcolor='#0780e3' ><strong>Ваше
имя </strong></td>
<td align=left valign=top bgcolor='#0780e3' style='padding-left: 30px'>
<input type=text class=fancyBox name='name' value='' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000; width:250px; height:16px;'>
</td>
</tr>
<tr bgcolor='#0780e3'>
</td><td><strong>Класс</strong></td>
<td align="left" valign=top bgcolor='#0780e3' td style="padding-left: 30px">
<select class="search" name="class" id=class><option label="Экономический" value="1">Экономический</option>
<option label="Бизнес" value="2">Бизнес</option>
<option label="Первый" value="3">Первый</option>
<option label="Любой" value="4">Любой</option>
</select> </td>
<tr bgcolor='#0780e3'>
<td width=130 valign=top bgcolor='#0780e3'><strong>Дополнительная
информация</strong></td>
<td align=left valign=middle style='padding-left: 30px'>
<textarea name='more' style='font:11px Verdana; border-left:1px solid #c0baba; border-top:1px solid #c0baba; border-right:1px solid #f1f1f1; border-bottom:1px solid #f1f1f1; background-color:#fcfcfc; color:#00000; width:300px; height:150px;'></textarea>
</td>
</tr>
<tr bgcolor='#0780e3'>
<td colspan=2 align=center valign=middle > <INPUT TYPE="button" NAME="zakazat" VALUE="Заказать"> <INPUT TYPE="reset" NAME="Ohistit" VALUE="Очистить"> </P>
</td>
</tr>
</form>
</table>
</table></td>
<div style="height:20px;"></div>
<div class="avia_common" style="width:95%;"><h4><P ALIGN="CENTER">Современные технологии при заказе авиабилетов</P></h4>
<p>Раньше авиабилеты заказывали и узнавали их стоимость в кассах, турагентствах, специальных офисах продаж. Чтобы заказать авиабилет, приходилось занимать места в очереди и только потом узнавать о наличии или отсутствии свободных билетов.</p>
<p>Появление современных технологий в такой сфере, как «заказ авиабилетов», резко изменил ее с точки зренияудобства для путешественников. Теперь любой человек может заказать авиабилет онлайн из дома, сидя в любимом кресле.
Или с работы, за офисным столом и компьютером. Теперь для заказа авиабилетов необходим только компьютер с выходом в интернет. И правильный выбор, на каком сайте делать заказ.</p>
<div class="borderBottom">
<table> <tr> <td> <img src="../files/127/L:\Сайт\header001.jpg"></img> </td> </tr></table>
</div>
</body>
</HTML>
Для разработки данного и последующих Web-приложений использовался Denwer (п. 2.1.1).
Рассмотрим пример простой учебной программы на PHP, которая позволяет добавлять, находить и изменять записи таблиц единиц измерения в базе данных заказов товаров с СУБД MySQL. Форма ведения справочника представлена на рисунке 3.2.1
Рисунок 3.2.1 Окно браузера с формой ведения справочника
Для создания базы данных с СУБД MySQL использовался визуальный редактор phpMyAdmin (рисунок 2.2.2).
В пособии код программы включался из реальных программ путем копирования из буфера. Поэтому длинные строки могут занимать в пособии ни одну, а несколько строк, что необходимо учитывать при изучении кода программ.
Рисунок 3.2.2 Окно просмотра phpMyAdmin таблицы единиц измерения
Код программы sql.php на языке PHP (автор В.В. Плещев).
<HTML> <head> <title> Единицы Измерения </title></head>
<body>
<form action="sql.php" method="post">
<input type=reset name="operation" value="Очистка"/>
<input type=submit name="operation" value="Добавить"/>
<input type=submit name="operation" value="Найти"/>
<input type=submit name="operation" value="Изменить"/>
<table>
<tr>
<td align="right">Код единицы измерения</td>
<td> <input name="kei" maxlength="10" size="10"/></td>
</tr>
<tr>
<td align="right">Наименование</td>
<td><input name="nei" maxlength="10" size="10"/></td>
</tr>
</table>
</form>
<?php // начало программы на PHP
$dbhost="localhost"; //имя сервера
$username="root"; // имя пользователя по умолчанию
$dbpass=""; // пароль базы данных
$dbname="заказы_товаров"; //наименование базы данных
$operation=$_POST['operation']; //чтение поля с наименование операции (кнопки)
$kei=$_POST['kei']; //чтение значения поля kei с кодом единицы измерения
$nei=$_POST['nei']; //чтение поля поля nei с наименованием единицы измерения
$link=mysql_connect($dbhost,$username,$dbpass); //связь с базой
If (!$link) exit("Ошибка при подключении к БД:".mysql_error()); //Ошибка
mysql_select_db($dbname, $link) or exit ("Ошибка при открытии базы". mysql_error());
switch ($operation) //проверка, какая кнопка была нажата
{ case 'Добавить': // нажата кнопка «Добавить»
$zapros1="insert into `едизм` (`код_едизм`,`наименование_едизм`)
values('".$kei."','".$nei."')"; //текст запроса на добавление записи
$rezult1=mysql_query ($zapros1); //выполнение запроса
if(!$rezult1) //проверка на ошибку выполнения запроса
exit ("Запись не добавлена:". mysql_error()); //ошибка при выполнении запроса
echo("Запись добавлена"); break; // вывод сообщения о добавлении записи
case 'Найти' : // нажата кнопка «Найти»
$zapros2="select `наименование_едизм` from `едизм` where `код_едизм`='$kei'";
$rezult2=mysql_query ($zapros2); //выполнение запроса на поиск записи
$row = mysql_fetch_assoc($rezult2); //чтение полей записи в массив $row
$r=$row['наименование_едизм']; // выборка из массива поля “наименование_едизм”
if (!$row) echo("не нашлось"); //проверка на существование записи в запросе
echo($r); break;
case 'Изменить' : // если нажата кнопка «Изменить»
$zapros3="select `наименование_едизм` from `едизм` where `код_едизм`='$kei'";
$rezult3=mysql_query ($zapros3); //выполнение запроса на поиск записи
$row2 = mysql_fetch_assoc($rezult3); //чтение полей записи в массив $row2
$r2=$row2['наименование_едизм']; // выборка из массива поля “наименование_едизм”
if(!$row2) echo("не нашлось"); "); //проверка на существование записи в запросе
else //запись найдена
{ $zapros="update `едизм` set `наименование_едизм` = '$nei' where
`код_едизм`='$kei'"; //текст запроса на корректировку записи
$rezult=mysql_query ($zapros); //выполнение запроса на корректировку записи
if(!$rezult) exit ("не получилось". mysql_error());//проверка на ошибку
echo("изменено"); //сообщение об успешном изменении записи
}; //конец else
break; // выход из оператора switch
} //конец оператора switch
?>
</body>
</HTML>
Изменим предыдущее Web-приложение для работы с базой данных с СУБД Access. Создадим базу данных (рисунок 3.3.1) и источник данных с ее описанием (п. 2.11.2) под именем Zakaz.
Рисунок 3.3.1 окно конструктора таблиц СУБД Access
Код программы Access.php на языке PHP (автор В.В.Плещев).
<HTML><head><title>Единицы Измерения</title></head>
<body>
<form action="access.php" method="post">
<input type=reset name="operation" value="Очистка"/>
<input type=submit name="operation" value="Добавить"/>
<input type=submit name="operation" value="Найти"/>
<input type=submit name="operation" value="Изменить"/>
<table>
<tr>
<td align="right">Код единицы измерения</td>
<td> <input name="kei" maxlength="10" size="10"/></td>
</tr>
<tr>
<td align="right">Наименование</td>
<td><input name="nei" maxlength="10" size="10"/></td>
</tr>
</table>
</form>
<?
$username=""; //имя пользователя базы
$dbpass=""; // пароль базы
$dbname=" zakaz "; //наименование источника данных с описанием базы данных
$operation=$_POST['operation']; //чтение значения поля 'operation'
$kei=$_POST['kei']; //чтение значения поля kei с кодом единицы измерения
$nei=$_POST['nei']; //чтение значения поля nei c наименованием единицы измерения
$link=odbc_connect($dbname,$username,$dbpass); //связь с базой
if(!$link) exit("Ошибка при подключении к БД"); //проверка на ошибку
switch ($operation) //проверка, какая кнопка была нажата
{case 'Добавить': //нажата кнопка «Добавить»
$zapros1="insert into `едизм` (`код_едизм`,`наименование_едизм`)
values('".$kei."','".$nei."')"; //текст запроса на добавление записи в таблицу
$rezult1=odbc_exec ($link,$zapros1); //выполнение запроса на добавление
if(!$rezult1) exit ("Запись не добавлена");//проверка на ошибку выполнения запроса
echo("Запись добавлена"); //сообщение об успешности добавления записи
break; // выход из оператора switch
case 'Найти' : // нажата кнопка «Найти»
$zapros2="select `наименование_едизм` from `едизм` where `код_едизм`=$kei";
$rezult2=odbc_exec ($link,$zapros2); //выполнение запроса на поиск записи
$row = odbc_result ($rezult2, 'наименование_едизм');//выборка наименование_ едизм
if(!$row) echo("не нашлось"); //запись не нашлась
echo($row); //вывод найденной записи
break; ; // выход из оператора switch
case 'Изменить': // нажата кнопка «Изменить»
$zapros3="select `наименование_едизм` from `едизм` where `код_едизм`=$kei";
$rezult3=odbc_exec ($link,$zapros3); //выполнение запроса на поиск записи
$row2 = odbc_result ($rezult3, 'наименование_едизм'); //
if(!$row2) echo("не нашлось"); // запись не нашлась
else //запись нашлась
{ $zapros="update `едизм` set `наименование_едизм` = '$nei' where `код_едизм`=$kei";
$rezult=odbc_exec ($link,$zapros); //выполнение запроса на корректировку
if(!$rezult) exit ("не получилось"); //ошибка при корректировке записи
echo("изменено"); //успешная корректировка записи
}; //конец else
break; // выход из оператора switch
} //конец оператора switch
odbc_close($link); //закрытие базы данных
?>
</body>
</HTML>
Оценки студентов хранятся в таблице успеваемости для сайта (рисунок 3.4.1). Создадим источник данных с ее описанием (п. 2.11.2) под именем АИС КГЭК.
Рисунок 3.4.1 Окно конструктора таблиц СУБД Access
Для поиска успеваемости студента нужно ввести учетный номер студента (рисунок 3.4.2).
Рисунок 3.4.2 Окно браузера с формой задания учетного номера студента
В результате нужно найти и вывести в окно браузера в виде табличной формы все записи с данными об успеваемости студента с указанным в форме учетным номером.
Рисунок 3.4.3 Окно браузера с таблицей успеваемости студента
HTML-код формы входного документа (автор В.В. Плещев).
<HTML> <head> <title>Успеваемость</title> </head>
<body>
<form name="usp" method = "POST" action = "Uspevaemost.php">
<p> Введите учётный номер студента </p>
<p> <input name="number" type="text" size="40"> </p>
<p><input type="submit" name = "submit" value="Посмотреть" >
<input type="reset" value="Очистить"></p>
</form>
</body>
</HTML>
Код программы Uspevaemost.php на языке PHP (автор В.В. Плещев).
<?php
$username=""; //имя пользователя базы
$dbpass=""; // пароль базы
$dbname="АИС КГЭК"; //наименование источника данных с описанием базы данных
$link=odbc_connect($dbname,$username,$dbpass); //связь с базой данных
if(!$link) exit("Ошибка при подключении к БД"); //ошибка при подключении базы
$number=$_POST['number']; //чтение значения поля учетного номера студента
$zapros="SELECT [Успеваемость для сайта].* FROM [Успеваемость для сайта] WHERE [Успеваемость для сайта].[Учетный номер студента]=$number;"; //запрос на поиск
$rezult=odbc_exec ($link,$zapros); //выполнение запроса
if(!$rezult) exit ("Ошибка при выполнении запроса"); //ошибка при выполнении запроса
$i=0;
while (odbc_fetch_row ($rezult)) //цикл чтения записей запроса
{ if ($i==0) //первая запись запроса, формирование наименования таблицы
{ $f=odbc_result($rezult, "Фамилия") . ", группа " . odbc_result($rezult, "Группа") ;
echo "<br> <b> <p align='center'>$f</b>"; $i=1;
echo '<table border="1">'; //формирование заголовка таблицы успеваемости
echo "<tr><b><td align='center' valign='top' ><b>№</b><td><b>Семестр
<td align='center' valign='top' ><b>Дисциплина</b>
<td align='center' valign='top' ><b>Испытание</b>
<td align='center' valign='top' ><b>Оценка</b>
<td align='center' valign='top' ><b>Дата</b>
<td align='center' valign='top' ><b>Преподаватель</b>
<td align='center' valign='top' ><b>Долг</b>";
} //формирование очередной строки таблицы с данными об учебном испытании
$semsetr=odbc_result($rezult, "Семестр");
$discip=trim(odbc_result($rezult, "Наименование варианта"));
$ispit=trim(odbc_result($rezult, "Испытание"));
$ocenka=odbc_result($rezult, "Оценка");
if ($ocenka==0) $ocenka="";
$dr=odbc_result($rezult, "Дата получения результата");
if ($dr) //форматирование даты
{ $dr2=$dr. "0000000000";
$dr2=substr($dr2,8,2) . "." . substr($dr2,5,2) . "." . substr($dr2,0,4);
}
else $dr2="";
$prepod=trim(odbc_result($rezult, "ФамПрепод"));
$sost=trim(odbc_result($rezult, "Действие"));
echo "<tr><td align='Center'>$i<td align='Center'>$semsetr<td>$discip<td>$ispit<td align='Center'>$ocenka<td>$dr2<td>$prepod<td align='Center'>$sost";
$i=$i+1;
}
if ($i==0) echo ("Нет записей с успеваемостью студента с указанным учётным номером!");
odbc_close($link); //закрытие базы данных
?>
Нужно разработать приложение (разработчик В.В. Плещев), в котором формируется таблица с резюме кандидатов в базе данных с СУБД MySQL. Пользователь может первоначально поместить свое резюме в базу данных или найти свое резюме (если он ввел его ранее), изменить или удалить запись-резюме (http://vipuskniki.usue.ru/Vipuskniki.php). Поиск осуществляется по фамилии, имени и отчеству, дате рождения и паролю, если два последних значения он указал ранее. Данные вводятся в соответствующей форме (рисунок 3.5.1.1)
Рисунок 3.5.1.1 Окно браузера с формой-анкетой резюме
Второй частью приложения является поиск работодателями кандидатов по их резюме (http://vipuskniki.usue.ru/Rabotodateli.php) путем задания требуемых характеристик искомых кандидатов во входном документе (рисунок 3.5.1.1).
Рисунок 3.5.1.2 Окно браузера с формой характеристик искомых кандидатов
Необходимо предусмотреть формирования сложных условий поиска с использованием круглых скобок и логических операции И, ИЛИ.
Найденные резюме сортируются и выводятся в окно браузера работодателя (рисунок 3.5.1.3) для анализа полученных резюме.
Рисунок 3.5.1.3 Окно браузера с резюме найденных кандидатов
Работодатель может послать сообщение всем или отдельным кандидатам, которые будет посланы кандидатам по электронной почте (если адреса указаны в резюме) и в поле сообщение работодателя в резюме кандидатов и они могут прочесть эти сообщения при просмотре своих резюме.
Необходимо обеспечить максимальный контроль вводимых значений и информационно-справочную поддержку пользователей в форме вывода справочной информации по кнопке или на форме и в виде всплывающих подсказок.
Далее, приводится реализация этого приложения по отдельным разделам.
В начале, средствами phpMyAdmin создадим базу данных с соответствующими полями (рисунок 3.5.2.1). Нужно отметить, что база данных представляет физически папку под именем базы данных, а таблицы в базе данных - файлы в этой папке под именами таблиц.
Рисунок 3.5.2.1 Окно конструктора таблиц phpMyAdmin
Программа одновременно формирует форму и ее обрабатывает. Подпрограммы и функции, приведенные в этой программе, описаны в следующих подпунктах пункта 3.5.
Приведем код этой программы с комментариями
<title>Формирование записи-резюме</title></head>
<form action="Vipuskniki.php" method="post" enctype="multipart/form-data">
<body>
<?php
$dbhost ="localhost"; //имя сервера
$dbname ="vipuskniki"; //наименование базы данных
$userName ="Vipuskniki"; // имя пользователя
$dbpass ="ваосвуща"; // пароль базы данных
$rf="2"; //размер шрифта относительный
$style="
$styleb="
$styler="
$styleo="
$styleg="
$z=" ";
$Oper=$_POST['Oper']; //Чтение значения поля, сформированного нажатой кнопкой
if ($Oper=="Справка") // Обработка кнопки Справка, вывод справочной информации
{
?><font size="<?=$rf; ?>">
<?
echo " Перед началом работы, выполнением операций просмотра или нахождения записи, нужно убедиться в наличии записи-резюме в базе данных и, если она есть, то откорректируйте её, а если её нет, то сформируйте и затем сохраните. <br>";
echo " Для операций нахождения, просмотра, удаления и сохранения следует обязательно указывать: пароль, если он есть; фамилию, имя и ";
echo "отчество; дату рождения. Для операций нахождения, просмотра и ";
echo "удаления записей этих двух ключевых полей и пароля (если он есть) достаточно.<br>";
echo " <font color=blue><b>Рекомендации</font></b><br>";
echo " Для защиты записи-резюме от несанкционированного доступа рекомендуется задавать пароль (регистры, пробелы в начале и в конце пароля не учитываются).<br>";
echo " Значения всех текстовых полей ограничены 255 символами, кроме поля с сообщениями работодателей с длиной до 64000 символов. При сохранении записи апострофы и кавычки заменяются пробелами, поэтому лучше их не вводить.<br>";
echo " Можно указать среднюю оценку по специальным дисциплинам с точностью до одного знака после запятой. <br>";
echo " Для доступа работодателей к записи-резюме выберите для поля доступности записи значение \"да\".<br>";
echo " Рекомендуется телефоны указывать в общепринятых форматах, например: 8-908-910-21-43 (сотовый); 8(343)251-96-61 (обычный).<br>";
echo " Кнопкой \"Обзор...\" можно выбрать графический файл с фотографией (размером не более 16 МБ), которая будет сохранена в записи-резюме. Перед сохранением существующей записи с фотографией после её корректировки следует снова задать имя графического файла с фотографией, иначе - запись сохранится без фотографии!<br>";
echo " Если в поле E-mail указать через точку с запятой электронные почтовые адреса, то сообщения работодателей автоматически будут посылаться по этим адресам.<br>";
echo " Рекомендуется указывать данные об образовании до поступления в вуз в полях ";
echo "первого образования, а данные о вузе, в котором учится студент в полях второго образования.<br>";
echo " В поле достижений, знаний и навыков рекомендуется указать ";
echo "умение работать на компьютере, знания иностранных языков (свободно, со словарем), наличие водительских прав и сертификатов, наименования конкретных программных, информационных, справочных, ";
echo "технологических, технических и других систем, средств, моделей, знаний и теорий, которыми владеет студент (например, Delphi, C++, C#, Perl, VBScript, ASP, PHP, Drupal, Dreamweaver, Joomla, Java, HTML, SQL, MySQL, ORACLE, SQL Server, концепция ООП).<br>";
echo " Поиск соответствующих записей-резюме осуществляется работодателям путем ";
echo "формирования запроса, состоящего из ключевых слов-дескрипторов, соединенных ";
echo "знаками логических операций (в сложных случаях). Если в каком-то поле записи-резюме ";
echo "находится ключевое слово (без учета регистров), то запись может участвовать в отборе в ";
echo "соответствии с условием запроса. Поэтому, в записи-резюме студенту нужно ";
echo "максимально точно указать множество ключевых слов (которые, возможно, в какой-то ";
echo "степени, дублируют и/или дополняют друг друга, например: программирование, ";
echo "разработка программ, разработка программного обеспечения, программист, языки ";
echo "программирования), по которым его запись-резюме может быть найдена работодателями и послано ответное сообщение работодателями.<br>";
echo " Рекомендуется пароль для одного сотрудника не изменять, иначе будет невозможно вывести все записи по одному сотруднику, а только по группе с одинаковыми паролями, так-так пароли запоминаются в записях и участвуют в отборе записей наравне с информационными полями. Если в списке фамилий появляются полные тезки, то это либо имеются записи одного человека, но с различными паролями, либо действительно есть полные тезки с различными паролями (вариант хуже, когда полные тезки имеют одинаковые пароли и тогда записи нельзя разделить между тезками).<br>";
echo " Рекомендуется использовать браузеры Google Chrome, Mozilla Firefox, Opera и др, но не браузер Microsoft Internet Explorer (он требует обновление страницы при возвращении на предыдущую страницу и не выводит всплывающие подсказки для списков).<br>";
echo " <font color=blue><b>Информационная безопасность</font></b><br>";
echo " После окончания работы в браузере следует очистить историю просмотра или установить режимы формирования нового окна в режиме инкогнито (Google Chrome), приватного просмотра (Mozilla Firefox, Microsoft Internet Explorer) или приватного окна (Opera) при котором страницы не регистрируются в журнале браузера или истории поиска. После закрытия всех окон, открытых в этих режимах, будут удалены все следы их просмотра, включая файлы cookie, что исключает возможность несанкционированного доступа к записям-резюме из страниц, сохраненных в истории просмотра.<br>";
echo " <br>";
?>
<font color="#0000FF">
<?
echo " Автор программы - д.п.н., проф. кафедры Информатики и эконометрики УрГЭУ - Плещёв В.В.";
exit; //выход из программы
} //конец обработки кнопки Справка
//чтение фамилии, перевод фамилии в сточные буквы и удаление крайних пробелов
$FIO0=trim(mb_strtolower($_POST['FIO']));
//чтение пароля, перевод пароля в сточные буквы и удаление крайних пробелов
$PersonParol0=trim(mb_strtolower($_POST['PersonParol']));
$FIO=$_POST['FIO']; //чтение фамилии
$PersonParol=$_POST['PersonParol']; //чтение пароля
$Dr=$_POST['Dr']; //чтение даты рождения
if ($Dr) //проверка на наличии даты
{ $kd=proverkadati($Dr); //обращение к функции проверки даты рождения
if ($kd) exit ($kd . " Вернитесь назад и повторите ввод!"); // ошибка в дате, выход
}
//Чтение полученных значений остальных полей формы
$SemPologenie=$_POST['SemPologenie']; $Adress=$_POST['Adress'];
$Tel=$_POST['Tel']; $E_mail=$_POST['E_mail'];
$KluhevieSlova=$_POST['KluhevieSlova'];$Cel=$_POST['Cel'];
$Obr1Period=$_POST['Obr1Period']; $Obr1UhebZaved=$_POST['Obr1UhebZaved'];
$Obr1Facultet=$_POST['Obr1Facultet']; $Obr1Spec=$_POST['Obr1Spec'];
$Obr1Kval=$_POST['Obr1Kval']; $Obr2Period=$_POST['Obr2Period'];
$Obr2UhebZaved=$_POST['Obr2UhebZaved']; $Obr2Facultet=$_POST['Obr2Facultet'];
$Obr2Spec=$_POST['Obr2Spec']; $Obr2Kval=$_POST['Obr2Kval'];
$DopObr1Prog=$_POST['DopObr1Prog'];
$DopObr1Organizacij=$_POST['DopObr1Organizacij'];
$DopObr1GodOkon=$_POST['DopObr1GodOkon'];
if ($DopObr1GodOkon) //проверка на наличие значения поля
{ $kd=proverkagoda($DopObr1GodOkon);
if ($kd) exit ($kd . " Вернитесь назад и повторите ввод!"); //выход из программы
}
$DopObr2Prog=$_POST['DopObr2Prog'];
$DopObr2Organizacij=$_POST['DopObr2Organizacij'];
$DopObr2GodOkon=$_POST['DopObr2GodOkon'];
if ($DopObr2GodOkon)
{ $kd=proverkagoda($DopObr2GodOkon); //проверка на наличие значения поля
if ($kd) exit ($kd . " Вернитесь назад и повторите ввод!"); //выход из программы
}
$OpitRaboti=$_POST['OpitRaboti']; $Objzannosti=$_POST['Objzannosti'];
$Naviki=$_POST['Naviki']; $DopInformacij=$_POST['DopInformacij'];
$Pol=$_POST['Pol']; $Dostup=$_POST['Dostup'];
$Lihnomer=$_POST['Lihnomer']; $Ocenka=$_POST['Ocenka'];
if ($Ocenka) //проверка на наличие значения поля
{ $kd=proverkahisla ($Ocenka);
if ($kd) exit ($kd . " Вернитесь назад и повторите ввод!"); //выход из программы
}
$Loginadmin=$_POST['Loginadmin']; $Paroladmin=$_POST['Paroladmin'];
$Soobhenierabot=$_POST['Soobhenierabot'];
$Kolsoobhenierabot=$_POST['Kolsoobhenierabot']; $Un=$_POST['Un'];
if ($Oper and ($Oper<>"Очистить")) //Обработка всех кнопок, кроме Очистить
{if (!$FIO) $ohibka = $ohibka . " <br> Не введена фамилия! ";
if (!$Dr and (($Oper=="Заменить") or ($Oper=="Добавить"))) $ohibka = $ohibka . " <br>Не введена дата рождения! ";
if ($ohibka) exit($ohibka . "<br> Вернитесь назад и закончите ввод.");
}
$link =mysql_connect($dbhost,$userName,$dbpass); //подключение к серверу
if (!$link) exit ("Невозможно подключение к MySQL: " . mysql_error()); //выход
mysql_select_db ($dbname,$link)
or exit ("Невозможно открыть базу данных $dbname: " . mysql_error()); //открыть базу
if ($Oper and ($Oper=="Очистить")) // Обработка кнопки Очистить
$where = " where false "; //формирования заведомо ложного условия для запроса
else //формирование условия отбора записей в запросе
$where = " where (LCASE(FIO)='$FIO0') and (Dr=STR_TO_DATE('$Dr','%d.%m.%Y'))";
$query = "Select * from Vipuskniki " . $where; //текст запроса на поиск записи
$result=mysql_query($query); //выполнение запроса
$Kolzap=mysql_num_rows($result); //число найденных записей в запросе
if (($Kolzap>0) and (($Oper=="Найти") or ($Oper=="Удалить"))) //проверка кнопок
{ $row = mysql_fetch_array($result); //чтение записи из запроса в массив
if ($PersonParol0<>trim(mb_strtolower($row[PersonParol]))) //проверка пароля
{mysql_close($link); exit ("Неверно указан пароль!");} //пароль неверен, выход
}
if ($Oper=="Сохранить") //Обработка кнопки Сохранить
{ if ($Kolzap=0) $Oper="Добавить"; //Записей нет и нужно добавить запись-резюме
else $Oper="Заменить"; //запись уе имеется и нужно ее заменить новой записью
$query = "delete from Vipuskniki where Un=" . $Un; //текст запроса на удаление
$result=mysql_query($query); //выполнить запрос на удаление записи
}
if (($Kolzap==0) and ($Oper=="Удалить")) //условие удаления отсутствующих записей
{mysql_close($link); exit ("Нет записей для удаления! Проверьте в бланке фамилию, имя, отчество и дату рождения, если она была указана ранее.");}
if (($Kolzap==0) and ($Oper=="Просмотреть")) //просмотр отсутствующих записей
{mysql_close($link); exit ("Нет записей для просмотра! Проверьте в бланке фамилию, имя, отчество и дату рождения, если она была указана ранее.");}
if (($Kolzap==0) and ($Oper=="Найти")) //поиск отсутствующей записи
{mysql_close($link); exit ("Нет записи! Проверьте в бланке фамилию, имя, отчество и дату рождения, если она была указана ранее.");}
if (($Kolzap>=2) and ($Oper=="Найти"))//найдено несколько записей-резюме
{mysql_close($link);exit ("Вывод записи отменяется: есть несколько записей, с заданными значениями ключевых полей, в количестве " . $Kolzap ."!");}
if ($Oper=="Просмотреть") //Обработка кнопки Просмотреть
{
?>
<font size="<?=$rf; ?>">
<?
for ( $i=0; $i<$Kolzap; $i++ ) //цикл чтения записей запроса
{$row = mysql_fetch_array($result); //чтение текущей записи в массив
if ($row[FIO]) echo "<br>" . ($i+1).". $row[FIO]"; //вывод фамилии
if ($row[Dr]) //есть значение поля с датой рождения
{$dr2=$row[Dr] . "0000000000"; //преобразование даты в принятый формат
$dr2=substr($dr2,8,2) . "." . substr($dr2,5,2) . "." . substr($dr2,0,4);
$vozrast=date("Y") - substr($dr2,6,4); //определение примерного возраста
if (($vozrast>14) and ($vozrast<100))
{ if (date("z")<date("z",strtotime($row[Dr]))) $vozrast=$vozrast-1;
echo ", дата рождения: $dr2, возраст $vozrast"; //вывод возраста
}
}
//вывод значений полей
if ($row[Ocenka]) echo "; оценка $row[Ocenka]";
if ($row[SemPologenie]) echo "; $row[SemPologenie]";
if ($row[Tel]) echo "<br> Телефон: $row[Tel]";
if ($row[E_mail]) echo "; E_mail: $row[E_mail]";
if ($row[Adress]) echo "<br> Адрес: $row[Adress]";
if ($row[Cel]) echo "<br> Претендуемые должности: $row[Cel]";
if ($row[Objzannosti]) echo "<br> Предлагаемая деятельность: $row[Objzannosti]";
if ($row[DopInformacij]) echo "<br> Условия труда и оплаты: $row[DopInformacij]";
if ($row[OpitRaboti]) echo "<br>Опыт работы: когда, где, кем: $row[OpitRaboti]";
if ($row[Naviki]) echo "<br> Достижения, знания, навыки: $row[Naviki]";
if ($row[KluhevieSlova]) echo "<br> Ключевые слова для поиска: $row[KluhevieSlova]";
if (($row[Obr1Period]) or ($row[Obr1UhebZaved]) or ($row[Obr1Facultet]) or ($row[Obr1Spec]) or ($row[Obr1Kval])) //проверка наличия значений полей
{ echo "<br>Образование 1.";
if ($row[Obr1Period]) echo " Период обучения: $row[Obr1Period].";
if ($row[Obr1UhebZaved]) echo " Учебное заведение: $row[Obr1UhebZaved].";
if ($row[Obr1Facultet]) echo " Институт/факультет, кафедра:
$row[Obr1Facultet].";
if ($row[Obr1Spec]) echo " Специальность: $row[Obr1Spec].";
if ($row[Obr1Kval]) echo " Квалификация, степень: $row[Obr1Kval].";
}
if (($row[Obr2Period]) or ($row[Obr2UhebZaved]) or ($row[Obr2Facultet]) or ($row[Obr2Spec]) or ($row[Obr2Kval])) //проверка наличия значений полей
{ echo "<br> Образование 2.";
if ($row[Obr2Period]) echo " Период обучения: $row[Obr2Period].";
if ($row[Obr2UhebZaved]) echo " Учебное заведение: $row[Obr2UhebZaved].";
if ($row[Obr2Facultet]) echo " Институт/факультет, кафедра:
row[Obr2Facultet].";
if ($row[Obr2Spec]) echo " Специальность: $row[Obr2Spec].";
if ($row[Obr2Kval]) echo " Квалификация, степень: $row[Obr2Kval].";
}
if (($row[DopObr1Prog]) or ($row[DopObr1Organizacij]) or ($row[DopObr1GodOkon]))
{ echo "<br>Дополнительное образование 1.";
if ($row[DopObr1Prog ]) echo " Программа обучения: $row[DopObr1Prog].";
if ($row[DopObr1Organizacij]) echo " Организация: $row[DopObr1Organizacij].";
if ($row[DopObr1GodOkon]) echo " Год окончания: $row[DopObr1GodOkon].";
}
if (($row[DopObr2Prog]) or ($row[DopObr2Organizacij]) or ($row[DopObr2GodOkon]))
{ echo "<br>Дополнительное образование 2.";
if ($row[DopObr2Prog]) echo " Программа обучения: $row[DopObr2Prog].";
if ($row[DopObr2Organizacij]) echo " Организация: $row[DopObr2Organizacij].";
if ($row[DopObr2GodOkon]) echo " Год окончания: $row[DopObr2GodOkon].";
}
if ($row[Soobhenierabot]) echo "<br> Сообщения работодателей (всего $row[Kolsoobhenierabot]): $row[Soobhenierabot]";
if ($row[Foto]) //проверка наличия значения в поле Foto (фотография кандидата)
{ $unz=$row[Un]; //запомнить значение учетного номера найденной записи
// далее, обращением к функции VivodFoto.php выводится содержимое поля Foto
?>
<br>
<IMG SRC="http://vipuskniki.usue.ru/VivodFoto.php?unz=<?=$unz;?>" width=200 align="top" >
<?
}
echo "<br> -------------------------------------------------------------------------------------------------------------------------------------------------------";
}
mysql_close($link); //закрытие базы данных
exit (""); //выход из программы
} //конец блока обработки кнопки Промотреть
if ($Oper=="Удалить") //Обработка кнопки Удалить
{$query = "delete from Vipuskniki " . $where; //текст запроса на удаление записи
$result=mysql_query($query); //выполнение запроса на удаление записей
if ($result) //успешное удаление записей
{mysql_close($link); exit ("Удалены записи в количестве " . $Kolzap);}
else // ошибки при удалении
{mysql_close($link); exit ("Удаление записей отменяется из-за ошибка при выполнении: " . mysql_error());}
}
if ($Oper=="Заменить") //обработка кнопки Сохранить в режиме замены
{$query = "delete from Vipuskniki " . $where; $result=mysql_query($query);
if (!$result) //ошибки при удалении записи
{mysql_close($link); exit ("Удаление записи отменяется из-за ошибки при выполнении: " . mysql_error());}
}
if (($Oper=="Заменить") or ($Oper=="Добавить")) //Обработка кнопки Сохранить
{// Экранируем специальные символы в содержимом файла:
// удаление функцией mysql_escape_string специальных символов типа \
$FIO= mysql_escape_string($FIO);
$PersonParol= mysql_escape_string($PersonParol);
$SemPologenie= mysql_escape_string($SemPologenie);
$Adress= mysql_escape_string($Adress);
$Tel= mysql_escape_string($Tel);
$Obr1Period= mysql_escape_string($Obr1Period);
$E_mail= mysql_escape_string($E_mail);
$Cel= mysql_escape_string($Cel);
$Obr1UhebZaved= mysql_escape_string($Obr1UhebZaved);
$Obr1Facultet= mysql_escape_string($Obr1Facultet);
$Obr1Spec= mysql_escape_string($Obr1Spec);
$Obr1Kval= mysql_escape_string($Obr1Kval);
$Obr2Period= mysql_escape_string($Obr2Period);
$Obr2UhebZaved= mysql_escape_string($Obr2UhebZaved);
$Obr2Facultet= mysql_escape_string($Obr2Facultet);
$Obr2Spec= mysql_escape_string($Obr2Spec);
$Obr2Kval= mysql_escape_string($Obr2Kval);
$DopObr1Prog= mysql_escape_string($DopObr1Prog);
$DopObr1Organizacij= mysql_escape_string($DopObr1Organizacij);
$DopObr2Prog= mysql_escape_string($DopObr2Prog);
$DopObr2Organizacij= mysql_escape_string($DopObr2Organizacij);
$OpitRaboti= mysql_escape_string($OpitRaboti);
$Objzannosti= mysql_escape_string($Objzannosti);
$Naviki= mysql_escape_string($Naviki);
$DopInformacij= mysql_escape_string($DopInformacij);
$KluhevieSlova= mysql_escape_string($KluhevieSlova);
$Lihnomer= mysql_escape_string($Lihnomer);
$Loginadmin= mysql_escape_string($Loginadmin);
$Paroladmin= mysql_escape_string($Paroladmin);
$Soobhenierabot= mysql_escape_string($Soobhenierabot);
//Начало блока запоминания фото в переменной $Foto
$Foto="";
$p=$_FILES["filename"]["tmp_name"];
if(is_uploaded_file($p)) // проверяем загружен ли файл
{ // Если файл загружен успешно, то проверяем - графический ли он
if( substr($_FILES['filename']['type'], 0, 5)=='image' ) //графический файл
{ $Foto= file_get_contents($p); // читаем содержимое файла
$Foto= mysql_escape_string($Foto); // Экранируем специальные символы
}
}
//формирование текста запроса на добавление новой записи-резюме в базу данных
$query = "INSERT INTO Vipuskniki
( FIO,PersonParol,Dr,SemPologenie,Adress,Tel,E_mail,Cel,Obr1Period,Obr1UhebZaved,
Obr1Facultet,Obr1Spec,Obr1Kval,Obr2Period,Obr2UhebZaved,Obr2Facultet,Obr2Spec,
Obr2Kval,DopObr1Prog,DopObr1Organizacij,DopObr1GodOkon,DopObr2Prog,
DopObr2Organizacij,DopObr2GodOkon,OpitRaboti,Objzannosti,Naviki,DopInformacij,
KluhevieSlova,Pol,Dostup,Lihnomer,Ocenka,Loginadmin,Paroladmin,Soobhenierabot,
Kolsoobhenierabot,Foto)
VALUES
('".$FIO."','".$PersonParol."', STR_TO_DATE('".$Dr."','%d.%m.%Y'),'".$SemPologenie."',
'".$Adress."','".$Tel."','".$E_mail."','".$Cel."','".$Obr1Period."','".$Obr1UhebZaved."',
'".$Obr1Facultet."','".$Obr1Spec."','".$Obr1Kval."','".$Obr2Period."','".$Obr2UhebZaved."',
'".$Obr2Facultet."','".$Obr2Spec."','".$Obr2Kval."','".$DopObr1Prog."',
'".$DopObr1Organizacij."','".$DopObr1GodOkon."','".$DopObr2Prog."',
'".$DopObr2Organizacij."','".$DopObr2GodOkon."','".$OpitRaboti."','".$Objzannosti."',
'".$Naviki."','".$DopInformacij."','".$KluhevieSlova."','".$Pol."','".$Dostup."','".$Lihnomer."',
'".$Ocenka."','".$Loginadmin."','".$Paroladmin."','".$Soobhenierabot."',
'".$Kolsoobhenierabot."','".$Foto."' )";
$result=mysql_query($query); //выполнение запроса на добавление записи-резюме
if ($result) echo "Запись сохранена."; //успешное выполнение
else exit ("Запись не сохранена из-за ошибки: " . mysql_error()); //выход по ошибке
mysql_close($link); exit; //закрытие базы данных и выход из программы
} //конец обработки кнопки Сохранить
if ((!$Oper) or ($Oper=="Найти") or ($Oper=="Очистить"))
{ if ($Oper<>"Найти") $row = mysql_fetch_array($result);
if ($row[Dr]) //преобразование даты
{$dr2=$row[Dr] . "0000000000";
$dr2=substr($dr2,8,2) . "." . substr($dr2,5,2) . "." . substr($dr2,0,4);
}
else $dr2="";
// далее, следует HTML-код описания формы (рисунок 3.5.1.2)
?>
<font size="<?=$rf; ?>"> Введите фамилию, дату рождения и пароль; найдите запись; откорректируйте её или сформируйте новую, если записи нет; сохраните.</font>
<br>
<input type=submit name="Oper" value='Найти' Title="Найти запись по фамилии, имени, отчеству, дате рождения (если она указана) и паролю (если он есть)" style="<?=$style; ?>" ><b>
<input type=submit name="Oper" value='Просмотреть' Title="Просмотреть запись" style="<?=$style; ?>" ><b>
<input type=submit name="Oper" value='Удалить' Title="Удалить запись" style="<?=$style; ?>" ><b>
<input type=submit name="Oper" value='Очистить' Title="Очистить поля формы резюме" style="<?=$style; ?>" ><b>
<input type=reset name="Oper" value='Отменить' Title="Отметить изменения в форме резюме" style="<?=$style; ?>"></font><b></b>
<input type=submit name="Oper" value='Сохранить' Title="Вывести поля формы резюме в запись базы данных, если записи ещё нет в базе, то сформируется новая запись, иначе - существующая запись будет замене новой" style="<?=$style; ?>" ><b>
<input type=submit name="Oper" value='Справка' Title="Вывод справочной информации" style="<?=$style; ?>" ><b>
<table width=100% cellspacing="0">
<tr>
<td width="20%"><input name="k" type="hidden">
<td width="35%"><input name="k" type="hidden">
<td width="10%"><input name="k" type="hidden">
<td width="35%"><input name="k" type="hidden">
<?
if ($row[Soobhenierabot]) //было сообщение работодателя и далее оно выводиться
{
?>
<tr>
<td align="right"><font size="<?=$rf; ?>" color="#008000">Сообщения работодателей-<?=$row[Kolsoobhenierabot]?$row[Kolsoobhenierabot]:0; ?> </font>
<th colspan="3">
<input name="Soobhenierabot" maxlength=64000 value="<?=$row[Soobhenierabot]?$row[Soobhenierabot]:""; ?>" style="<?=$styleg; ?>;width: 100%">
</th>
<?
}
?>
<tr><td align="right"><font color="#FF0000" size="<?=$rf; ?>"> Фамилия, имя, отчество<font color="#FF0000">*</font>
<td> <input Title="Фамилия, имя и отчество (обязательное поле)" name="FIO" maxlength=255 style="<?=$styler; ?>; width: 100%"
value="<?=$row[FIO]?$row[FIO]:""; ?>" >
<td align="right"><font size="<?=$rf; ?>" color="#ff0000"> Пароль </font>
<td>
<table width=100% cellspacing="0">
<td width="50%" ><input Title="Пароль доступа к записи (любые символы, кроме апострофов и кавычек; обязательное поле)" type="password" name="PersonParol" maxlength=255 style="<?=$styler; ?>; width: 100%" >
<td width="32%" align="right">
<font size="<?=$rf; ?>;width=100%" color="#ff0000">Доступ </font>
<td width="18%">
<select Title='Доступ работодателя к записи резюме при выборке ("Да"), иначе ("Нет") - запись игнорируется при выборке' name="Dostup" style="<?=$styleo; ?>; width: 100%">
<?
if ($row[Dostup]<>"0") { ?>
<option value="1"> да
<option value="0"> нет
<? } if ($row[Dostup]=="0") { ?>
<option value="0"> нет
<option value="1"> да
<? } ?>
</select>
</table>
<tr>
<td align="right"><font color="#FF0000" size="<?=$rf; ?>"> Дата рождения <font color="#FF0000" size="<?=$rf; ?>">*</font>
<td>
<table width=100% cellspacing="0">
<td width="30%"><input name="Dr" Title="Дата рождения в формате день.месяц.год, например, 23.07.80 (если дата рождения не указана, то в поиске записи она не участвует)" maxlength=10 style="<?=$styler; ?>; width: 100%"
value="<?=$dr2?$dr2:""; ?>">
<font size="<?=$rf; ?>">
<td width="20%" align="right"><font size="<?=$rf; ?>">Пол
<td width="50%">
<select name="Pol" style="<?=$styleo; ?>; width: 100%">
<? if ($row[Pol]<>"женский") { ?>
<option value="мужской"> мужской
<option value="женский"> женский
<? } if ($row[Pol]=="женский") { ?>
<option value="женский"> женский
<option value="мужской"> мужской
<? } ?>
</select>
</table>
<td align="right"><font size="<?=$rf; ?>"> Семья
<td>
<table width=100% cellspacing="0">
<td width="50%" >
<input name="SemPologenie" Title="Семейное положение (семейный, несемейный), количество детей и др. информация о детях и семье)" maxlength=255 style="<?=$styleo; ?>; width: 100%"
value="<?=$row[SemPologenie]?$row[SemPologenie]:""; ?>">
<font size="<?=$rf; ?>">
<td width="32%" align="right" ><font size="<?=$rf; ?>">Оценка (4.5)
<td width="18%">
<input Title="Средняя оценка по профилирующим дисциплинам (дробная и целая части разделяютcя точкой)" name="Ocenka" maxlength=3 style="<?=$styleo; ?> ; width: 100%" value="<?=$row[Ocenka]?$row[Ocenka]:""; ?>">
</table>
<tr>
<td align="right"><font size="<?=$rf; ?>">Адрес
<td><input Title="Адрес проживания" name="Adress" maxlength=255 style="<?=$styleo; ?>; width: 100%" value='<?=$row[Adress]?$row[Adress]:""; ?>' </td>
<td align="right"><font size="<?=$rf; ?>">Фото
<td><input type="file" Title="Выбор графического файла с фотографией" name="filename" style="<?=$styleo; ?>; width: 100%" > </td>
<tr>
<td align="right"> <font size="<?=$rf; ?>">Телефон
<td><input name="Tel" Title="Номера телефонов в общепринятых форматах, например: 8-908-910-21-43 (сотовый); 8(343)251-96-61 (обычный)" maxlength=255 size=54 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Tel]?$row[Tel]:""; ?>"> <font size="<?=$rf; ?>">
<td align="right"> <font size="<?=$rf; ?>">E-mail
<td><input Title="Адрес электронной почты для автоматической посылки сообщения работодателя кандидату" name="E_mail" maxlength=255 size=39 style="<?=$styleo; ?>; width: 100%" value="<?=$row[E_mail]?$row[E_mail]:""; ?>">
<tr>
<td align="right"> <font size="<?=$rf; ?>">Претендуемые должности
<th colspan="3">
<input name="Cel" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Cel]?$row[Cel]:""; ?>">
</th>
<tr><td align="right">
<font size="<?=$rf; ?>">Предлагаемая деятельность
<th colspan="3">
<input name="Objzannosti" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Objzannosti]?$row[Objzannosti]:""; ?>">
</th>
<tr>
<td align="right"><font size="<?=$rf; ?>">Условия труда и оплаты
<th colspan="3">
<input name="DopInformacij" maxlength=255 s style="<?=$styleo; ?>; width: 100%" value="<?=$row[DopInformacij]?$row[DopInformacij]:""; ?>">
</th>
<tr><td align="right"><font size="<?=$rf; ?>">Опыт работы: когда, где, кем
<th colspan="3">
<input name="OpitRaboti" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[OpitRaboti]?$row[OpitRaboti]:""; ?>">
</th>
<tr><td align="right"><span lang="ru"><font size="<?=$rf; ?>">Достижения, знания, навыки
<th colspan="3">
<input name="Naviki" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Naviki]?$row[Naviki]:""; ?>">
</th>
<tr><td align="right"><font size="<?=$rf; ?>">Ключевые слова для поиска
<th colspan="3">
<input name="KluhevieSlova" maxlength=255 style="<?=$styleo; ?>; width: 100%"value="<?=$row[KluhevieSlova]?$row[KluhevieSlova]:""; ?>">
</th>
<tr>
<td>
<th colspan="2" align="Center">
<font size="<?=$rf; ?>"><b>Первое (среднее) образование</b>
</th>
<td align="Center"><font size="<?=$rf; ?>"><b>Второе (высшее) образование </b>
<tr>
<td align="right"><font size="<?=$rf; ?>">Период обучения
<th colspan="2">
<input name="Obr1Period" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr1Period]?$row[Obr1Period]:""; ?>">
</th>
<td><input name="Obr2Period" maxlength=255 size=50 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr2Period]?$row[Obr2Period]:""; ?>">
<tr>
<td align="right"> <font size="<?=$rf; ?>">Учебное заведение
<th colspan="2">
<input name="Obr1UhebZaved" maxlength=255 style="<?=$styleo; ?>; width: 100%"value="<?=$row[Obr1UhebZaved]?$row[Obr1UhebZaved]:""; ?>">
</th>
<td><input name="Obr2UhebZaved" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr2UhebZaved]?$row[Obr2UhebZaved]:""; ?>">
<tr>
<td align="right"> <font size="<?=$rf; ?>">Институт/факультет, кафедра
<th colspan="2">
<input name="Obr1Facultet" maxlength=255 style="<?=$styleo; ?>; width: 100%"value="<?=$row[Obr1Facultet]?$row[Obr1Facultet]:""; ?>">
</th>
<td><input name="Obr2Facultet" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr2Facultet]?$row[Obr2Facultet]:""; ?>">
<tr>
<td align="right"> <font size="<?=$rf; ?>">Специальность
<th colspan="2">
<input name="Obr1Spec" maxlength=255 0 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr1Spec]?$row[Obr1Spec]:""; ?>">
</th>
<td><input name="Obr2Spec" maxlength=255 style="<?=$styleo; ?>; width: 100%"value="<?=$row[Obr2Spec]?$row[Obr2Spec]:""; ?>">
<tr>
<td align="right"><font size="<?=$rf; ?>">Квалификация, степень
<th colspan="2">
<input name="Obr1Kval" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[Obr1Kval]?$row[Obr1Kval]:""; ?>">
</th>
<td><input name="Obr2Kval" maxlength=255 style="<?=$styleo; ?>; width: 100%"value="<?=$row[Obr2Kval]?$row[Obr2Kval]:""; ?>">
<tr>
<td>
<th colspan="2"align="Center"><font size="<?=$rf; ?>"> Дополнительное первое образование</b>
</th>
<td align="Center"><b><font size="<?=$rf; ?>"> Дополнительное второе образование
</b>
<tr>
<td align="right"><font size="<?=$rf; ?>">Программа обучения
<th colspan="2"><input name="DopObr1Prog" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[DopObr1Prog]?$row[DopObr1Prog]:""; ?>">
</th>
<td><input name="DopObr2Prog" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[DopObr2Prog]?$row[DopObr2Prog]:""; ?>">
<tr>
<td align="right"><font size="<?=$rf; ?>">Организация
<th colspan="2"><input name="DopObr1Organizacij" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[DopObr1Organizacij]?$row[DopObr1Organizacij]:""; ?>">
</th>
<td><input name="DopObr2Organizacij" maxlength=255 style="<?=$styleo; ?>; width: 100%" value="<?=$row[DopObr2Organizacij]?$row[DopObr2Organizacij]:""; ?>">
<tr>
<td align="right"><font size="<?=$rf; ?>">Год окончания
<th colspan="2" align="left"><input name="DopObr1GodOkon" maxlength=4 style="<?=$styleo; ?>" size=8 value="<?=$row[DopObr1GodOkon]?$row[DopObr1GodOkon]:""; ?>">
</th>
<td><input name="DopObr2GodOkon" maxlength=4 style="<?=$styleo; ?> " size=8 value="<?=$row[DopObr2GodOkon]?$row[DopObr2GodOkon]:""; ?>">
</table>
<font size="<?=$rf; ?>"color="#FF0000">
* - обязательные для заполнения ключевые поля (выделены розовым фоном), по которым производится поиск записи-резюме.</font>
<input name="Lihnomer" maxlength=255 size=2 type="hidden" value="<?=$row[Lihnomer]?$row[Lihnomer]:""; ?>">
<input name="Loginadmin" maxlength=255 size=2 type="hidden" value="<?=$row[Loginadmin]?$row[Loginadmin]:""; ?>">
<input name="Paroladmin" maxlength=255 size=2 type="hidden" value="<?=$row[Paroladmin]?$row[Paroladmin]:""; ?>">
<input name="Un" maxlength=20 size=2 type="hidden" value="<?=$row[Un] ?>">
<input name="Kolsoobhenierabot" maxlength=14 size=2 type="hidden" value="<?=$row[Kolsoobhenierabot]?$row[Kolsoobhenierabot]:""; ?>">
<?php
}
?>
</body>
</HTML>
<?
Function proverkadati ($pz) //Проверка даты
{ $l=strlen($pz); $t=0; $s="";
for ($i=0;$i<$l;$i++) //цикл чтения символов параметра
{ $b=substr($pz,$i,1);
if (!($b=="." or ($b>="0" and $b<="9")))
return ("Ошибка в дате: запрещённый символ!");
if (($b>="0") and ($b<="9")) $s=$s . $b;
if ($b==".")
{ $k++;
if (($k==1) and ($s>31)) return ("Ошибка в дате: неверно указан номер дня месяца!");
if (($k==2) and ($s>12)) return ("Ошибка в дате: неверно указан номер месяца!");
$s="";
}
}
return "";
}
?>
<?
Function proverkagoda ($ppz) //Проверка номера года
{ $pz=trim($ppz); $l=strlen($pz); $s="";
for ($i=0;$i<$l;$i++) //цикл чтения символов параметра
{ $b=substr($pz,$i,1);
if (!(($b>="0") and ($b<="9")))
return ("Ошибка в номере года: запрещённый символ!");
}
if ($pz<1900 or $pz>2050) return ("Ошибка в номере года: недопустимое значение номера года!");
return "";
}
?>
<?
Function proverkahisla ($ppz) //Проверка номера года
{ $pz=trim($ppz); $l=strlen($pz); $s="";$kt=0;
for ($i=0;$i<$l;$i++) //цикл чтения символов параметра
{ $b=substr($pz,$i,1);
if (!($b=="." or ($b>="0" and $b<="9")))
return ("Ошибка в оценке: запрещённый символ!");
if ($b==".") $kt++;
if ($kt>1) return ("Ошибка в оценке: несколько точек!");
}
return "";
}
?>
<?
$dbhost ="localhost"; $dbname ="vipuskniki";
$userName ="vipuskniki"; $dbpass ="цукаср";
$link =mysql_connect($dbhost,$userName,$dbpass);
if (!$link) exit ("Невозможно подключение к MySQL: " . mysql_error());
mysql_select_db ($dbname,$link) or exit ("Невозможно открыть базу данных $dbname: " . mysql_error());
$un=$_GET['unz']; $query = "Select Foto from Vipuskniki where Un=$un";
$result=mysql_query($query);
if (mysql_error()) exit ("Ошибка при выполнении поиска записей: " . mysql_error());
$n = mysql_num_rows ( $result );
if ( $n == 0 ) exit ("Нет записей, удовлетворяющих заданным условиям!");
$row = mysql_fetch_array($result);
if ($row[Foto]) { header("Content-type: image/jpeg"); echo $row[Foto];}
mysql_close($link);
?>
Программа формирует форму, с указанными работодателем требованиями к кандидатам на работу (рисунок 3.5.1.2) и вызывает программу ObrabRabotodateli.php (<form action="ObrabRabotodateli.php" method="post" >).
<?
$rf="2"; //размер шрифта относительный
$style="font-size: 12; width: 100%";
$styleg="
$logoskob="Открывающиеся круглые скобки, которые указываются слева от логического выражения из ключевых слов, например: (Программист ИЛИ Программирование ИЛИ Разработка программ) И (PHP ИЛИ Java) И MySQL И HTML";
$logzskob="Закрывающиеся круглые скобки, которые указываются справа от логического выражения из ключевых слов, например: (Программист ИЛИ Программирование ИЛИ Разработка программ) И (PHP ИЛИ Java) И MySQL И HTML";
$kluhipoiska="Ключевые слова для поиска записи: если они есть в записи-резюме, то формируется значение логического операнда равное истине, иначе - ложь и в результате формируется окончательное значение заданного логического выражения и если оно равно истине, то запись считается найденной, иначе - она игнорируется";
?>
<HTML>
<head>
<title>Запрос на поиск записей: сгруппированные скобками и операциями ключевые слова в искомых записях-резюме </title>
</head>
<body>
<form action="ObrabRabotodateli.php" method="post" >
<font size="<?=$rf; ?>"> Выберите специальность и/или введите ключевые слова в искомых резюме и, при необходимости, укажите круглые скобки, логические операции у заполненных полей и поля для сортировки, выбранных записей-резюме. </font>
<br>
<td align="center"> <style="
<select name="sort1" title="Поле сортировки 1-го уровня" style="
<option value="Obr2Period1"> датам обучения
<option value="dr1"> датам рождения
<option value="obr2Spec1"> специальностям
<option value="obr2Kval1"> квалификациям
<option value="obr2Facultet1"> кафедрам
<option value="fio1"> фамилиям
<option value="Ocenka1"> оценкам
<option value="adress1"> адресам
<option value="pol1"> полу
</select><font size="<?=$rf; ?>"> </font>
<select name="sort2"title="Поле сортировки 2-го уровня" style="
<option value="Obr2Period2"> датам обучения
<option value="dr2"> датам рождения
<option value="obr2Spec2"> специальностям
<option value="obr2Kval2"> квалификациям
<option value="obr2Facultet2"> кафедрам
<option value="fio2"> фамилиям
<option value="Ocenka2"> оценкам
<option value="adress2"> адресам
<option value="pol2"> полу
</select><font size="<?=$rf; ?>"> </font>
<select name="sort3" title="Поле сортировки 3-го уровня" style="
<option value="Obr2Period3"> датам обучения
<option value="dr3"> датам рождения
<option value="obr2Spec3"> специальностям
<option value="obr2Kval3"> квалификациям
<option value="obr2Facultet3"> кафедрам
<option value="fio3"> фамилиям
<option value="Ocenka3"> оценкам
<option value="adress3"> адресам
<option value="pol3"> полу
</select><font size="<?=$rf; ?>"> </font>
<input type=reset value='Очистить' title="Очистить поля формы" style="
<input type=submit name="Oper" title="Найти и вывести записи-резюме, которые удовлетворяют заданным условиям" value='Найти' style="
<tr>
<td width="10%"><input name="k" type="hidden">
<td width="70%"><input name="k" type="hidden">
<td width="10%"><input name="k" type="hidden">
<td width="10%"><input name="k" type="hidden">
<tr>
<td> <b><font size="<?=$rf; ?>">(<font color="#FF0000">*</font> </b>
<td> <b><font size="<?=$rf; ?>">Специальность и ключевые слова в искомых записях-резюме без учёта регистров</font></b>
<td> <b><font size="<?=$rf; ?>">)</font><font size="2" color="#FF0000">*</font></b>
<td> <b><font size="<?=$rf; ?>">Операция</font></b><font size="<?=$rf; ?>"> </font>
<tr>
<td><input name="so1" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="kl1" title="Специальность" style="<?=$style;?>">
<?
include "Специальности.txt";
?>
</select>
<td> <input name="sz1" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor1" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili1" >ИЛИ
<option value="i1" >И
</select>
<tr>
<td><input name="so2" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl2" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz2" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor2" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili2" >ИЛИ
<option value="i2" >И
</select>
<tr>
<td><input name="so3" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl3" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz3" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor3" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili3" >ИЛИ
<option value="i3" >И
</select>
<tr>
<td><input name="so4" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl4" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz4" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor4" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili4" >ИЛИ
<option value="i4" >И
</select>
<tr>
<td><input name="so5" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl5" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz5" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor5" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili5" >ИЛИ
<option value="i5" >И
</select>
<tr>
<td><input name="so6" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl6" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz6" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor6" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili6" >ИЛИ
<option value="i6" >И
</select>
<tr>
<td><input name="so7" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl7" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz7" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor7" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili7" >ИЛИ
<option value="i7" >И
</select>
<tr>
<td><input name="so8" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl8" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz8" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor8" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili8" >ИЛИ
<option value="i8" >И
</select>
<tr>
<td><input name="so9" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl9" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz9" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor9" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili9" >ИЛИ
<option value="i9" >И
</select>
<tr>
<td><input name="so10" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl10" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz10" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor10" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili10" >ИЛИ
<option value="i10" >И
</select>
<tr>
<td><input name="so11" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl11" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz11" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor11" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili11" >ИЛИ
<option value="i11" >И
</select>
<tr>
<td><input name="so12" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl12" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz12" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor12" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili12" >ИЛИ
<option value="i12" >И
</select>
<tr>
<td><input name="so13" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl13" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz13" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor13" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili13" >ИЛИ
<option value="i13" >И
</select>
<tr>
<td><input name="so14" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl14" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz14" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor14" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili14" >ИЛИ
<option value="i14" >И
</select>
<tr>
<td><input name="so15" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl15" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz15" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor15" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili15" >ИЛИ
<option value="i15" >И
</select>
<tr>
<td><input name="so16" title="<?=$logoskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><input name="kl16" title="<?=$kluhipoiska ;?>" style="<?=$style;?>">
<td><input name="sz16" title="<?=$logzskob ;?>" maxlength=16 style="<?=$styleg;?>">
<td><select name="andor16" title="<?=$logoper;?>" style="<?=$styleg;?>">
<option value="ili16" >ИЛИ
<option value="i16" >И
</select>
</table>
<font size="<?=$rf; ?>"><font color="#FF0000"></b>* - количество левых и правых круглых скобок должны совпадать иначе выводится сообщение об ошибке.<span lang="en-us"> </span>
</font><br>
Пример: выбрать студентов, которые умеют программировать на
языках PHP или Java и знают СУБД MySQL и HTML:<br>
<b><font color="#008000">(</font>Программист <font color="#008000">ИЛИ</font> Программирование<font color="#008000">
ИЛИ </font>Разработка программ<font color="#008000">)</font>
<font color="#008000">И</font> <font color="#008000">(</font>PHP
<font color="#008000">ИЛИ </font> Java<font color="#008000">)
</font> <font color="#008000">И</font> MySQL <font color="#008000">И</font> HTML</b> </font>
</form>
</body>
</HTML>
Программа принимает значения полей из формы, заполненной работодателем, формирует условие отбора записей и текст запроса на выборку записей-резюме и выполняет запрос; формирует новую форму с данными из найденных записей-резюме (рисунок 3.5.1.3) и выводит ее в окно браузера работодателя. Эта новая форма инициирует вызов программы ObrabRabotodateli2.php.
<HTML>
<head> <title>Найденные записи-резюме</title> </head>
<form action="ObrabRabotodateli2.php" method="post" >
<body>
<?php
$dbhost ="localhost"; $dbname ="vipuskniki";
$userName ="vipuskniki"; $dbpass ="цукаср";
$link =mysql_connect($dbhost,$userName,$dbpass);
if (!$link) exit ("Невозможно подключение к MySQL: " . mysql_error());
mysql_select_db ($dbname,$link) or exit ("Невозможно открыть базу данных $dbname: " . mysql_error());
$where=""; //чтение полученных из формы значений полей в переменные
$kl1=trim(mb_strtolower($_POST['kl1'])); I f ($kl1=="любая специальность") $kl1="";
$kl2=trim(mb_strtolower($_POST['kl2'])); $kl3=trim(mb_strtolower($_POST['kl3']));
$kl4=trim(mb_strtolower($_POST['kl4'])); $kl5=trim(mb_strtolower($_POST['kl5']));
$kl6=trim(mb_strtolower($_POST['kl6'])); $kl7=trim(mb_strtolower($_POST['kl7']));
$kl8=trim(mb_strtolower($_POST['kl8'])); $kl9=trim(mb_strtolower($_POST['kl9']));
$kl10=trim(mb_strtolower($_POST['kl10'])); $kl11=trim(mb_strtolower($_POST['kl11']));
$kl12=trim(mb_strtolower($_POST['kl12'])); $kl13=trim(mb_strtolower($_POST['kl13']));
$kl14=trim(mb_strtolower($_POST['kl14'])); $kl15=trim(mb_strtolower($_POST['kl15']));
$kl16=trim(mb_strtolower($_POST['kl16']));
$andor1=$_POST['andor1']; $andor2=$_POST['andor2']; $andor3=$_POST['andor3'];
$andor4=$_POST['andor4']; $andor5=$_POST['andor5']; $andor6=$_POST['andor6'];
$andor7=$_POST['andor7']; $andor8=$_POST['andor8']; $andor9=$_POST['andor9'];
$andor10=$_POST['andor10']; $andor11=$_POST['andor11']; $andor12=$_POST['andor12'];
$andor13=$_POST['andor13']; $andor14=$_POST['andor14']; $andor15=$_POST['andor15'];
$so1=""; $sz1=""; $so2=""; $sz2=""; $so3=""; $sz3=""; $so4=""; $sz4=""; $so5=""; $sz5="";
$so6=""; $sz6=""; $so7=""; $sz7=""; $so8="";$sz8=""; $so9="";$sz9=""; $so10=""; $sz10=""; $so11=""; $sz11=""; $so12=""; $sz12=""; $so13=""; $sz13=""; $so14=""; $sz14="";$so15=""; $sz15=""; $so16=""; $sz16=""; $sp="";
if ($kl1) { $so1=$_POST['so1']; $sz1=$_POST['sz1']; }
else $sp=$sp . trim($_POST['so1']) . trim($_POST['sz1']);
if ($kl2) { $so2=$_POST['so2']; $sz2=$_POST['sz2']; }
else $sp=$sp . trim($_POST['so2']) . trim($_POST['sz2']);
if ($kl3) { $so3=$_POST['so3']; $sz3=$_POST['sz3']; }
else $sp=$sp . trim($_POST['so3']) . trim($_POST['sz3']);
if ($kl4) { $so4=$_POST['so4']; $sz4=$_POST['sz4']; }
else $sp=$sp . trim($_POST['so4']) . trim($_POST['sz4']);
if ($kl5) { $so5=$_POST['so5']; $sz5=$_POST['sz5']; }
else $sp=$sp . trim($_POST['so5']) . trim($_POST['sz5']);
if ($kl6) { $so6=$_POST['so6']; $sz6=$_POST['sz6']; }
else $sp=$sp . trim($_POST['so6']) . trim($_POST['sz6']);
if ($kl7) { $so7=$_POST['so7']; $sz7=$_POST['sz7']; }
else $sp=$sp . trim($_POST['so7']) . trim($_POST['sz7']);
if ($kl8) { $so8=$_POST['so8']; $sz8=$_POST['sz8']; }
else $sp=$sp . trim($_POST['so8']) . trim($_POST['sz8']);
if ($kl9) { $so9=$_POST['so9']; $sz9=$_POST['sz9']; }
else $sp=$sp . trim($_POST['so9']) . trim($_POST['sz9']);
if ($kl10) { $so10=$_POST['so10']; $sz10=$_POST['sz10'];}
else $sp=$sp . trim($_POST['so10']) . trim($_POST['sz10']);
if ($kl11) { $so11=$_POST['so11']; $sz11=$_POST['sz11'];}
else $sp=$sp . trim($_POST['so11']) . trim($_POST['sz11']);
if ($kl12) { $so12=$_POST['so12']; $sz12=$_POST['sz12'];}
else $sp=$sp . trim($_POST['so12']) . trim($_POST['sz12']);
if ($kl13) { $so13=$_POST['so13']; $sz13=$_POST['sz13'];}
else $sp=$sp . trim($_POST['so13']) . trim($_POST['sz13']);
if ($kl14) { $so14=$_POST['so14']; $sz14=$_POST['sz14'];}
else $sp=$sp . trim($_POST['so14']) . trim($_POST['sz14']);
if ($kl15) { $so15=$_POST['so15']; $sz15=$_POST['sz15'];}
else $sp=$sp . trim($_POST['so15']) . trim($_POST['sz15']);
if ($kl16) { $so16=$_POST['so16']; $sz16=$_POST['sz16'];}
else $sp=$sp . trim($_POST['so16']) . trim($_POST['sz16']);
$ckobki="$so1$so2$so3$so4$so5$so6$so7$so8$so9$so10$so11$so12$so13$so14$so15$so16$sz1$sz2$sz3$sz4$sz5$sz6$sz7$sz8$sz9$sz10$sz11$sz12$sz13$sz14$sz15$sz16";
$l=strlen($ckobki); $kso=0;$ksz=0;
for($i=0;$i<$l;$i++)
{ if ((substr($ckobki,$i,1)<>"(") and (substr($ckobki,$i,1)<>")"))
{ mysql_close($link); exit ("Ошибка: вместо круглых скобок указаны другие символы!"); }
if (substr($ckobki,$i,1)=="(") $kso++; if (substr($ckobki,$i,1)==")") $ksz++;
}
if ($kso<>$ksz)
{ mysql_close($link);
if ($sp) exit ("Ошибка в запросе: количество левых ($kso) и правых ($ksz) круглых скобок не совпадает (круглые скобки, указанныe в строках с отсутствующими ключевыми словами, не учитываются)!");
else exit ("Ошибка в запросе: количество левых ($kso) и правых ($ksz) круглых скобок не совпадает!");
}
//формирование текст строки запроса для поиска записей-резюме
$CONCAT=" CONCAT(LCASE(FIO),LCASE(Dr),LCASE(SemPologenie),
LCASE(Adress),LCASE(Tel),LCASE(E_mail),LCASE(Cel),LCASE(Obr1Period),
LCASE(Obr1UhebZaved),LCASE(Obr1Facultet),LCASE(Obr1Spec),LCASE(Obr1Kval),
LCASE(Obr2Period),LCASE(Obr2UhebZaved),LCASE(Obr2Facultet),LCASE(Obr2Spec),
LCASE(Obr2Kval),LCASE(DopObr1Prog),LCASE(DopObr1Organizacij),
DopObr1GodOkon,LCASE(DopObr2Prog),LCASE(DopObr2Organizacij),
DopObr2GodOkon,LCASE(OpitRaboti),LCASE(Objzannosti),LCASE(Naviki),
LCASE(DopInformacij),LCASE(KluhevieSlova),LCASE(Pol))";
$andor=" ";
if ($kl1)
{ $where=$where .$so1." $CONCAT like '%" . $kl1 . "%'" . $sz1;
if ($andor1=="i1") $andor=" and "; else $andor=" or ";
}
if ($kl2)
{ $where=$where . $andor . $so2. $CONCAT . " like '%" . $kl2 . "%'" . $sz2;
if ($andor2=="i2") $andor=" and "; else $andor=" or ";
}
if ($kl3)
{ $where=$where . $andor . $so3. $CONCAT . " like '%" . $kl3 . "%'" . $sz3;
if ($andor3=="i3") $andor=" and "; else $andor=" or ";
}
if ($kl4)
{ $where=$where . $andor . $so4. $CONCAT . " like '%" . $kl4 . "%'" . $sz4;
if ($andor4=="i4") $andor=" and "; else $andor=" or ";
}
if ($kl5)
{ $where=$where . $andor . $so5. $CONCAT . " like '%" . $kl5 . "%'" . $sz5;
if ($andor5=="i5") $andor=" and "; else $andor=" or ";
}
if ($kl6)
{ $where=$where . $andor . $so6. $CONCAT . " like '%" . $kl6 . "%'" . $sz6;
if ($andor6=="i6") $andor=" and "; else $andor=" or ";
}
if ($kl7)
{ $where=$where . $andor . $so7. $CONCAT . " like '%" . $kl7 . "%'" . $sz7;
if ($andor7=="i7") $andor=" and "; else $andor=" or ";
}
if ($kl8)
{ $where=$where . $andor . $so8. $CONCAT . " like '%" . $kl8 . "%'" . $sz8;
if ($andor8=="i8") $andor=" and "; else $andor=" or ";
}
if ($kl9)
{ $where=$where . $andor . $so9. $CONCAT . " like '%" . $kl9 . "%'" . $sz9;
if ($andor9=="i9") $andor=" and "; else $andor=" or ";
}
if ($kl10)
{ $where=$where . $andor . $so10. $CONCAT . " like '%" . $kl10 . "%'" . $sz10;
if ($andor10=="i10") $andor=" and "; else $andor=" or ";
}
if ($kl11)
{ $where=$where . $andor . $so11. $CONCAT . " like '%" . $kl11 . "%'" . $sz11;
if ($andor11=="i11") $andor=" and "; else $andor=" or ";
}
if ($kl12)
{ $where=$where . $andor . $so12. $CONCAT . " like '%" . $kl12 . "%'" . $sz12;
if ($andor12=="i12") $andor=" and "; else $andor=" or ";
}
if ($kl13)
{ $where=$where . $andor . $so13. $CONCAT . " like '%" . $kl13 . "%'" . $sz13;
if ($andor13=="i13") $andor=" and "; else $andor=" or ";
}
if ($kl14)
{ $where=$where . $andor . $so14. $CONCAT . " like '%" . $kl14 . "%'" . $sz14;
if ($andor14=="i14") $andor=" and "; else $andor=" or ";
}
if ($kl15)
{ $where=$where . $andor . $so15. $CONCAT . " like '%" . $kl15 . "%'" . $sz15;
if ($andor15=="i15") $andor=" and "; else $andor=" or ";
}
if ($kl16)
{ $where=$where . $andor . $so16. $CONCAT . " like '%" . $kl16 . "%'" . $sz16;
}
if ($where) $where=" where (Dostup=1 and (" . $where . "))";
else $where=" where Dostup=1";
//формируется фраза сортировки Order By текста запроса
$srt="";
if ($_POST['sort1']=="fio1") $srt=$srt . ",FIO";
if ($_POST['sort1']=="dr1") $srt=$srt . ",Dr";
if ($_POST['sort1']=="obr2Spec1") $srt=$srt . ",Obr2Spec";
if ($_POST['sort1']=="obr2Kval1") $srt=$srt . ",Obr2Kval";
if ($_POST['sort1']=="obr2Facultet1") $srt=$srt . ",Obr2Facultet";
if ($_POST['sort1']=="pol1") $srt=$srt . ",Pol";
if ($_POST['sort1']=="adress1") $srt=$srt . ",Adress";
if ($_POST['sort1']=="Ocenka1") $srt=$srt . ",Ocenka desc";
if ($_POST['sort1']=="Obr2Period1") $srt=$srt . ",Obr2Period";
if ($_POST['sort2']=="fio2") $srt=$srt . ",FIO";
if ($_POST['sort2']=="dr2") $srt=$srt . ",Dr";
if ($_POST['sort2']=="obr2Spec2") $srt=$srt . ",Obr2Spec";
if ($_POST['sort2']=="obr2Kval2") $srt=$srt . ",Obr2Kval";
if ($_POST['sort2']=="obr2Facultet2") $srt=$srt . ",Obr2Facultet";
if ($_POST['sort2']=="pol2") $srt=$srt . ",Pol";
if ($_POST['sort2']=="adress2") $srt=$srt . ",Adress";
if ($_POST['sort2']=="Ocenka2") $srt=$srt . ",Ocenka desc";
if ($_POST['sort2']=="Obr2Period2") $srt=$srt . ",Obr2Period";
if ($_POST['sort3']=="fio3") $srt=$srt . ",FIO";
if ($_POST['sort3']=="dr3") $srt=$srt . ",Dr";
if ($_POST['sort3']=="obr2Spec3") $srt=$srt . ",Obr2Spec";
if ($_POST['sort3']=="obr2Kval3") $srt=$srt . ",Obr2Kval";
if ($_POST['sort3']=="obr2Facultet3") $srt=$srt . ",Obr2Facultet";
if ($_POST['sort3']=="pol3") $srt=$srt . ",Pol";
if ($_POST['sort3']=="adress3") $srt=$srt . ",Adress";
if ($_POST['sort3']=="Ocenka3") $srt=$srt . ",Ocenka desc";
if ($_POST['sort3']=="Obr2Period3") $srt=$srt . ",Obr2Period";
if ($sort) $sort=" order by $srt";
if ($srt) { $srt=substr($srt,1); $srt=" Order by $srt"; }
$query = "Select * from Vipuskniki $where $srt"; //текст всего запроса
$result=mysql_query($query); //выполнение запроса
if (mysql_error()) exit ("Ошибка при выполнении поиска записей: " . mysql_error());
$n = mysql_num_rows ( $result );
if ( $n == 0 ) exit ("Нет записей, удовлетворяющих заданным условиям!");
$rf="2"; //размер шрифта относительный
$style="
//формирование формы с найденными записями-резюме
?>
<input type="submit" value='Послать сообщения кандидатам' style="<?=$style; ?>">
<input type="reset" value='Очистить поля сообщений' style="<?=$style; ?>">
<font size="<?=$rf; ?>">
<?
echo "<br><b>Найдено записей-резюме $n </b>";
?>
<br><font size="<?=$rf; ?>" style="font-weight: 700" color="#0000ff">Сообщение всем кандидатам <input name="soobhvsem" maxlength=64000 size=82 style="<?=$styleo; ?>"> </font>
<br>-------------------------------------------------------------------------------------------------------------------------------------------------------
<br>
<?
for ( $i=0; $i<$n; $i++ ) $j=$i+$n; $j2=$j+$n; //цикл чтения найденных записей-рзюме
$row = mysql_fetch_array($result);
if ($row[FIO]) echo "<br><b>" . ($i+1).". $row[FIO] </b>" ;
if ($row[Dr]) //преобразование даты
{$dr2=$row[Dr] . "0000000000";
$dr2=substr($dr2,8,2) . "." . substr($dr2,5,2) . "." . substr($dr2,0,4);
$vozrast=date("Y") - substr($dr2,6,4);
if (($vozrast>14) and ($vozrast<100))
{ if (date("z")<date("z",strtotime($row[Dr]))) $vozrast=$vozrast-1;
echo ", дата рождения: $dr2, возраст $vozrast";
}
}
//Формирование строки формы из текущей записи-резюме
if ($row[Ocenka]) echo "; оценка $row[Ocenka]";
if ($row[SemPologenie]) echo "; $row[SemPologenie]";
if ($row[Tel]) echo "<br> Телефон: $row[Tel]";
if ($row[E_mail]) echo "; E_mail: $row[E_mail]";
if ($row[Adress]) echo "<br> Адрес: $row[Adress]";
if ($row[Cel]) echo "<br> Претендуемые должности: $row[Cel]";
if ($row[Objzannosti]) echo "<br> Предлагаемая деятельность: $row[Objzannosti]";
if ($row[DopInformacij]) echo "<br> Условия труда, зарплата: $row[DopInformacij]";
if ($row[OpitRaboti]) echo "<br>Опыт работы: когда, где, кем: $row[OpitRaboti]";
if ($row[Naviki]) echo "<br> Достижения, знания, навыки: $row[Naviki]";
if ($row[KluhevieSlova]) echo "<br> Ключевые слова для поиска: $row[KluhevieSlova]";
if (($row[Obr1Period]) or ($row[Obr1UhebZaved]) or ($row[Obr1Facultet]) or ($row[Obr1Spec]) or ($row[Obr1Kval]))
{ echo "<br>Образование 1.";
if ($row[Obr1Period]) echo " Период обучения: $row[Obr1Period].";
if ($row[Obr1UhebZaved]) echo " Учебное заведение: $row[Obr1UhebZaved].";
if ($row[Obr1Facultet]) echo " Институт/факультет, кафедра: $row[Obr1Facultet].";
if ($row[Obr1Spec]) echo " Специальность: $row[Obr1Spec].";
if ($row[Obr1Kval]) echo " Квалификация, степень: $row[Obr1Kval].";
}
if (($row[Obr2Period]) or ($row[Obr2UhebZaved]) or ($row[Obr2Facultet]) or ($row[Obr2Spec]) or ($row[Obr2Kval]))
{ echo "<br> Образование 2.";
if ($row[Obr2Period]) echo " Период обучения: $row[Obr2Period].";
if ($row[Obr2UhebZaved]) echo " Учебное заведение: $row[Obr2UhebZaved].";
if ($row[Obr2Facultet]) echo " Институт/факультет, кафедра: $row[Obr2Facultet].";
if ($row[Obr2Spec]) echo " Специальность: $row[Obr2Spec].";
if ($row[Obr2Kval]) echo " Квалификация, степень: $row[Obr2Kval].";
}
if (($row[DopObr1Prog]) or ($row[DopObr1Organizacij]) or ($row[DopObr1GodOkon]))
{ echo "<br>Дополнительное образование 1.";
if ($row[DopObr1Prog ]) echo " Программа обучения: $row[DopObr1Prog].";
if ($row[DopObr1Organizacij]) echo " Организация: $row[DopObr1Organizacij].";
if ($row[DopObr1GodOkon]) echo " Год окончания: $row[DopObr1GodOkon].";
}
if (($row[DopObr2Prog]) or ($row[DopObr2Organizacij]) or ($row[DopObr2GodOkon]))
{ echo "<br>Дополнительное образование 2.";
if ($row[DopObr2Prog]) echo " Программа обучения: $row[DopObr2Prog].";
if ($row[DopObr2Organizacij]) echo " Организация: $row[DopObr2Organizacij].";
if ($row[DopObr2GodOkon]) echo " Год окончания: $row[DopObr2GodOkon].";
}
?>
<br><font size="<?=$rf; ?>" style="font-weight: 700" color="#0000ff">Сообщение кандидату (всего <?=$row[Kolsoobhenierabot]?$row[Kolsoobhenierabot]:0; ?>) <input name="<?=$i ?>" maxlength=64000 size=80 style="<?=$styleo; ?>"> </font>
<input name="<?=$j ?>" maxlength=20 type="hidden" size=20 value="<?=$row[Un] ?>">
<input name="<?=$j2 ?>" maxlength=100 type="hidden" size=20 value="<?=$row[E_mail] ?>">
<?
if ($row[Foto]) //есть фото
{ $unz=$row[Un];
?>
<br>
<IMG SRC="http://vipuskniki.usue.ru/VivodFoto.php?unz=<?=$unz;?>" width=200 align="top" >
<?
}
echo "<br> -------------------------------------------------------------------------------------------------------------------------------------------------------";
}
?>
<input name="kolzap" maxlength=20 type="hidden" size=20 value="<?=$n ?>">
<?
mysql_close($link); //закрытие базы
?>
</body>
</HTML>
Программа переносит тексты сообщений работодателя в поле сообщение работодателя в выбранных им записям-резюме и пересылает по электронной почте кандидатам, если они указали свои адреса электронной почты.
<HTML> <head> <title>Сохранение сообщений работодателей</title></head>
<form>
<body>
<?php
$dbhost ="localhost"; $dbname ="vipuskniki";
$userName ="vipuskniki"; $dbpass ="цукаср";
$link =mysql_connect($dbhost,$userName,$dbpass);
if (!$link) exit ("Невозможно подключение к MySQL: " . mysql_error());
mysql_select_db ($dbname,$link) or exit ("Невозможно открыть базу данных $dbname: " . mysql_error());
$ks=0; $kolzap=$_POST['kolzap']; $soobhvsem=$_POST[soobhvsem];
for ( $i=0; $i<$kolzap; $i++) //цикл чтения выбранных записей-резюме
{ $sobh=trim(trim($soobhvsem) . " " . trim($_POST[$i]));
$j=$i+$kolzap; $nz=$_POST[$j];
if ($sobh)
{ $query = "Select Soobhenierabot from Vipuskniki where Un=$nz";
$result=mysql_query($query);
if (mysql_error()) exit ("Ошибка при пересылке сообщений: " . mysql_error());
$n = mysql_num_rows ( $result );
if ($n==0 ) exit;
$row = mysql_fetch_array($result);
$zs=$row[Soobhenierabot]; $j2=$j+$kolzap; $se=trim($_POST[$j2]) . ";";
if ($se)
{ for ($ii=0,$ii2=0;$ii<strlen($se);++$ii)
{ if (substr($se,$ii,1)==";")
{$E_mail=trim(substr($se,$ii2,$ii-$ii2));
if ($E_mail) mail($E_mail,"Сообщение работодателя",$sobh); $ii2=$ii+1;
}
}
}
if ($zs) $zs="$zs Сообщение от " . date('d.m.Y') . ": $sobh";
else $zs="Сообщение от " . date('d.m.Y') . ": $sobh";
$query = "UPDATE Vipuskniki set
Vipuskniki.Soobhenierabot='$zs',Vipuskniki.Kolsoobhenierabot=Vipuskniki.Kolsoobhenierabot+1 where Un=$nz";
$result=mysql_query($query);
if (mysql_error()) exit ("Ошибка при пересылке сообщений: " . mysql_error());
$ks=$ks+1;
}
}
if ($ks==0) exit ("Cообщения кандидатам отсутствуют.");
else exit ("Разослано сообщений кандидатам в количестве $ks.");
?>
</body>
</HTML>
В задаче создается база данных из одной таблицы, разрабатывается форма и Web-приложение по ведению базы данных с различным набором кнопок (пп. 3.2, 3.3). Варинт базы данных можно взять из пункта 3.6.3.
Приведем несколько задач из [10-17].
3.6.3.1. Циклы
3.6.3.2. Массивы
3.6.3.3. Функции
3.6.3.4. Формы
3.6.3.5.Файлы
3.6.3.6. Строки
3.6.3.7. Графика
С помощью библиотеки pChart построить:
3.6.3.8. СУБД MySQL
Разработать учебный сайт (п. 3.1), который включает в себя не менее 9 различных типов элементов: надписи, таблицы, поля ввода, кнопки, радиокнопки, независимые переключатели, ссылки, изображения, списки. Тематика и вид сайта согласовывается с преподавателем.
В задаче создается база данных из одной таблицы, разрабатывается форма и Web-приложение по ведению базы данных с различным набором кнопок (пп. 3.2, 3.3) и, возможно, создаются и выводятся, в виде выходного документа, запросы. Содержание базы данных (можно выбрать из списка) и тип СУБД согласовывается с преподавателем.
Список вариантов баз данных
1. Учет авиапассажиров.
Таблица авиапассажиров: наименование авиапредприятия, наименование города назначения, номер рейса, дата вылета, фамилия, адрес пассажира.
2. Учет производства сельскохозяйственных культур.
Таблица урожайности сельскохозяйственных культур: наименование сельскохозяйственного предприятия, наименование сельскохозяйственной культуры, урожайность, номер года.
3. Учет выпуска изделий.
Таблица выпущенных изделий: наименование изделия, наименование предприятия, количество выпущенных изделий (шт.), их себестоимость, отпускная цена, затраты на электроэнергию, затраты на зарплату, дата выпуска.
4. Учет платежей налогов.
Таблица платежей налогов: населенный пункт, наименование типа налога, наименование предприятия, сумма налогов за 1, 2, 3, 4-й кварталы.
5. Учет поставок товаров.
Таблица поставленных товаров: наименование поставщика, наименование товара, количество, цена, единица измерения, дата поставки.
6. Учет сбросов отравляющих веществ в окружающую среду.
Таблица сбросов: район, наименование организации, дата сброса, концентрация, размер сброса, наименование единицы измерения, сумма ущерба.
7. Учет уволившихся с предприятия.
Таблица уволенных: наименование подразделения, наименование причины увольнения, дата увольнения, фамилия, номер приказа.
8. Учет результатов Олимпийских игр.
Таблица олимпийцев: наименование страны, наименование вида спорта, фамилия олимпийца, число завоеванных золотых, серебряных и бронзовых медалей.
9. Учет рождаемости.
Таблица новорожденных: наименование населенного пункта, наименование национальности; вес, рост новорожденного, дата рождения, фамилия, имя, отчество.
10. Учет участников Олимпиады.
Таблица олимпийцев: наименование страны, наименование вида спорта, фамилия участника, дата рождения, рост, вес, пол.
11. Учет проданных товаров.
Таблица проданного товара: наименование торгового предприятия, наименование товара, дата продажи, стоимость проданного товара.
12. Учет малых предприятий.
Таблица малых предприятий: наименование предприятия, наименование населенного пункта, наименование основного вида деятельности МП, численность работающих, адрес, объем выполняемых работ за год (всего) и по основному виду деятельности, директор, дата создания.
13. Учет больных в больнице.
Таблица больных: фамилия больного, наименование диагноза, дата поступления, адрес, наименование отделения, дата выписки, дата рождения больного.
14. Учет движения общественного транспорта.
Таблица движения общественного транспорта: наименование типа транспорта, номер и длина маршрута, фамилия водителя, дата выхода.
15. Учет дорожно-транспортных происшествий.
Таблица дорожно-транспортных происшествий: наименование населенного пункта, содержание и дата нарушения, наименование подразделения милиции, зарегистрировавшего ДТП, фамилия инспектора, число убитых и раненых, размер материального ущерба.
16. Учет платежных поручений в банке.
Таблица платежных поручений: наименование клиента, наименование вида платежа, дата, сумма, номер поручения.
17. Учет договоров займа.
Таблица договоров займа: наименование организации, номер договора, дата заключения, дата окончания, сумма, процент, сумма возврата, возвращенная сумма, особые условия, процент штрафа за каждый просроченный день, наименование денежной единицы.
18. Учет проданных ценных бумаг.
Таблица проданных ценных бумаг: наименование эмитента, наименование типа ценной бумаги, число, стоимость (цена), дата продажи, номер регистрации выпуска ценных бумаг.
19. Учет кадров.
Таблица сотрудников предприятия: фамилия работника, дата рождения, наименование специальности, наименование подразделения, дата приема, дата начала трудовой деятельности, оклад, образование.
20. Учет очередников на получение жилья.
Таблица очередников: фамилия очередника, номер очереди, номер приказа, наименование организации, наименование основания включения в очередь, дата, паспортные данные, число членов семьи, адрес.
21. Учет обмена валют.
Таблица обмена валют: дата, фамилия, паспортные данные, наименование валюты, количество валюты проданной и купленной, наименование банка.
22. Учет объектов строительства.
Таблица объектов строительства: наименование населенного пункта, сметная стоимость, стоимость выполненных работ, дата начала строительства, наименование объекта, наименование заказчика.
23. Учет книг в библиотеке.
Таблица книг: наименование темы, наименование книги, авторы, дата, число экземпляров, адрес хранения, наименование издательства.
24. Учет исполнительской дисциплины.
Таблица мероприятий: наименование подразделения, фамилия исполнителя, наименование мероприятия, срок исполнения, фамилия контролирующего, наименование контролируемой организации.
25. Учет успеваемости студентов.
Таблица успеваемости студентов: наименование предмета, дата, оценка, фамилия.
Перед каждой группой ответов указаны номер и заголовок пункта, в конце которого были сформулированы вопросы.
1. Обзор средств и технологий разработки Web-приложений.
2. Системы управления сайтами и контентами (CMS).
3. Языки описания документов (HTML, динамический HTML, XML, VRML, Macromedia Flash).
4. Мультимедйные средства и редакторы HTML-документов.
5. Правила написания и структура HTML-документа.
6. Формы, cписки, изображения, таблицы, указатели, фреймы, разделы.
7. Кнопки (Button, Reset, Submit).
8. Переключатели (CheckBox, Radio).
9. Поля ввода (Text, TextArea, Password).
10. Списки выбора (Select).
11. Выравнивания полей для различных браузеров и экранов дисплеев.
12. Создание ASP файла, Основы создания сценариев.
13. Работа с кнопками в VBSript.
14. Правила написания PHP-программы.
15. Типы данных и переменные в PHP.
16. Выражения, операции в PHP.
17. Операторы в PHP.
18. Функции в PHP.
19. Массивы в PHP.
20. Объектно-ориентированное программирование, объявление класса, основные стандартные функции в PHP.
21. Файлы. Открытие и закрытие файлов. Запись в файл. Чтение из файла в PHP.
22. Поисковые шаблоны и строки. Строковые функции в PHP.
23 СУБД MySQL.. Стандартные функции РНР для работы с MySQL.
24 Работа с базами данных с различными СУБД через ODBC в PHP.
25. Среды и средства автоматизации разработки PHP-программ.
26 Безопасность. Конфигурация. Маскировка файлов данных, хранение файлов. Безопасность данных, шифрование данных, аутентификация.
Рекомендуемые ресурсы Интернет.
Об авторе
Плещёв Владимир Васильевич профессор УрГЭУ, доктор педагогических наук, кандидат технических наук является специалистом в области разработки средств автоматизации программирования и создания баз данных. Владеет многими языками программирования и СУБД. Начал заниматься программированием с 1968 года.
Разработал для EC ЭВМ процессор ввода (“ВВОДКОР”), генераторы программ отчетов (“ГЕНТАБ”, “ОФОРТ”) и сводной обработки данных (“СЧЕТ ПЛ”). Для персональных компьютеров им разработан генератор FoxProпрограмм (“MacroFox") и др. Будучи главным конструктором НПО “Уралсистем” и начальником отдела программирования ГВЦКП Свердловской области, руководил и участвовал в создании отдельных подсистем территориальных АСУ и АСУ предприятий, системы телеобработки показателей “ТОПАЗ” и информационной сети для территориальных органов управления “ИСЕТЬ”. Разработанные им средства в свое время нашли широкое применение в различных организациях.
С 1988 года преподает в Уральском государственном экономическом университете. Им разработан ряд учебников и учебных пособий по программированию, базам данных, разработки и стандартизации программных средств и информационных технологий.
В настоящее время занимается информатизацией адаптивно-комптентностного подхода к обучению, разработкой баз данных, обычных и Web-приложений для различных пользователей, имеет 9 авторских Свидетельств на программы и базы данных.
Н.А.Спирин - доктор технических наук, профессор УГТУ-УПИ
Учебное издание
Плещёв Владимир Васильевич
Разработка сайтов и Web-программирование:
VBScript, HTML, ASP, Dreamweaver, PHP, MySQL, phpMyAdmin
с примерами и упражнениями
Редактор и корректор М.В. Баусова
Поз. . Подписано в печать . .2013.
Формат бумаги 60 х 84 1/16. Бумага для множительных аппаратов.
Печать плоская. Уч.- изд. л. 3 Усл.печ. л. 3
Заказ Тираж экз.
Издательство
Уральского государственного экономического университета
Екатеринбург, ул. 8 Марта, 62
ОАО “Полиграфист“, цех № 4
Екатеринбург, ул. Тургенева, 22
* Настройку нужно проверять во всех необходимых версиях браузеров на совместимость, иначе может получиться расхождение в отображении.