This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Санкт-Петербургский государственный институт точной механики и оптики (технический университет) Кафедра компьютерных образовательных технологий
С.В. Ковальчук, А.В. Лямин
ИНФОРМАТИКА ИНФОРМАЦИОННО-УПРАВЛЯЮЩИЕ СИСТЕМЫ
Санкт-Петербург 2003
2
ОГЛАВЛЕНИЕ 1. ЗАДАНИЯ НА КУРСОВОЕ ПРОЕКТИРОВАНИЕ........................................................................3 1.1. ТЕМЫ ПРОЕКТОВ .................................................................................................................................3 1.2. СРОК СДАЧИ СТУДЕНТОМ ЗАКОНЧЕННОЙ РАБОТЫ .............................................................................4 1.3. СОДЕРЖАНИЕ РАБОТЫ ........................................................................................................................5 1.4. ПЕРЕЧЕНЬ ГРАФИЧЕСКОГО (ДЕМОНСТРАЦИОННОГО) МАТЕРИАЛА ....................................................5 1.5. ИСХОДНЫЕ ДАННЫЕ И ПОСОБИЯ ........................................................................................................5 2. ВВЕДЕНИЕ В БАЗЫ ДАННЫХ .........................................................................................................6 2.1. ОБЩИЕ СВЕДЕНИЯ ..............................................................................................................................6 2.2. РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ ............................................................................................................6 2.3. ОТНОШЕНИЯ МЕЖДУ ТАБЛИЦАМИ .....................................................................................................7 2.4. НОРМАЛИЗАЦИЯ БАЗ ДАННЫХ ............................................................................................................7 2.5. КЛЮЧИ И ИНДЕКСЫ ............................................................................................................................7 2.6. ЯЗЫК РЕЛЯЦИОННЫХ БАЗ ДАННЫХ SQL ............................................................................................8 3. ОСНОВЫ РАБОТЫ С ORACLE........................................................................................................9 3.1. ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ .........................................................................................................9 3.2. СОЗДАНИЕ, УДАЛЕНИЕ И МОДЕРНИЗАЦИЯ ТАБЛИЦ ............................................................................9 3.3. ОБЪЯВЛЕНИЕ ОГРАНИЧЕНИЙ ............................................................................................................10 3.4. АВТОМАТИЗАЦИЯ РАБОТЫ С БАЗАМИ ДАННЫХ ................................................................................11 3.5. ЗАПРОСЫ НА ВЫБОРКУ ДАННЫХ .......................................................................................................12 3.6. ПОСТРОЕНИЕ ЗАПРОСОВ INSERT И DELETE .................................................................................13 3.7. ПОСТРОЕНИЕ ЗАПРОСА UPDATE....................................................................................................13 3.8. СЛУЖЕБНЫЕ КОМАНДЫ ....................................................................................................................14 4. ОСНОВЫ ЯЗЫКА СЕРВЕРНЫХ СЦЕНАРИЕВ PHP.................................................................15 4.1. ОБЩИЕ СВЕДЕНИЯ ............................................................................................................................15 4.2. СТРУКТУРА PHP-СЦЕНАРИЯ .............................................................................................................15 4.3. КОММЕНТАРИИ .................................................................................................................................15 4.4. ПЕРЕМЕННЫЕ ....................................................................................................................................16 4.5. КОНСТАНТЫ ......................................................................................................................................16 4.6. ОПЕРАЦИИ, ВЫРАЖЕНИЯ, ОПЕРАТОРЫ .............................................................................................16 4.7. ФУНКЦИИ, МАССИВЫ, РАБОТА С ФАЙЛАМИ.....................................................................................18 4.8. ПРИМЕР РЕАЛИЗАЦИИ ПРОСТЕЙШЕГО СЧЕТЧИКА ПОСЕЩЕНИЙ .......................................................21 4.9. ПРИМЕР РЕАЛИЗАЦИИ ГОСТЕВОЙ КНИГИ ..........................................................................................21 4.10. ПРИМЕР АВТОРИЗАЦИИ ПОЛЬЗОВАТЕЛЕЙ .......................................................................................22 4.11. ПРИМЕР ИСПОЛЬЗОВАНИЯ СЦЕНАРИЕВ ДЛЯ ПОСТРОЕНИЯ ШАБЛОНОВ HTML-СТРАНИЦ .............23 4.12. СОЗДАНИЕ СЦЕНАРИЯ ДЛЯ ГОЛОСОВАНИЯ .....................................................................................24 4.13. ПРИМЕР ОБРАЩЕНИЯ К БАЗЕ ДАННЫХ ИЗ PHP ...............................................................................27
3
1. ЗАДАНИЯ НА КУРСОВОЕ ПРОЕКТИРОВАНИЕ 1.1. Темы проектов Все темы сгруппированы в несколько пакетов. Содержание пакетов приводится в таблице 1.1. Таблица 1.1. Темы проектов Номер и название пакета 1. Виртуальные магазины
2. Система управления организацией
Номер и название темы 1.1. Виртуальный магазин по продаже продуктов питания 1.2. Виртуальный магазин по продаже книг и печатной продукции 1.3. Виртуальный магазин по продаже аудио, видео, CDпродукции. 1.4. Виртуальный магазин по продаже автомобилей 1.5. Виртуальный магазин по продаже туристских путевок 1.6. Виртуальный магазин по продаже компьютерной техники 2.1. Система управления магазином 2.2. Система управления складом 2.3. Система управления школой 2.4. Система управления гостиницей 2.5. Система управления рестораном 2.6. Система управления парикмахерской
Задание и исходные данные к работе Необходимо предоставить покупателю возможность выбрать товары по каталогу, сформировать заказ и получить счет без посещения офиса или торгового зала. Сотрудникам магазина – получать информацию о сделанных заказах. Базовый формат для представления проекта: HTML. База данных: Oracle. Средства доступа к базе данных: PHP. Web – сервер: Apache.
Необходимо обеспечить возможность соответствующему должностному лицу формировать структуру и штатное расписание организации, принимать сотрудников на работу, увольнять сотрудников, распределять денежные вознаграждения за отдельные виды работ, составлять график работы, объявлять взыскания и поощрения. Базовый формат для представления проекта: HTML. База данных: Oracle. Средства доступа к базе данных: PHP. Web – сервер: Apache.
4
Номер и название Номер и название пакета темы 3. Информационно- 3.1. Информационносправочная система справочная система железнодорожного вокзала 3.2. Информационносправочная система морского порта 3.3. Информационносправочная система автовокзала 3.4. Информационносправочная система аэропорта 3.5. Информационносправочная система библиотеки 3.6. Информационносправочная система гостиницы 4. Система 4.1. Система электронного электронного документооборота документооборота магазина 4.2. Система электронного документооборота склада 4.3. Система электронного документооборота школы 4.4. Система электронного документооборота гостиницы 4.5. Система электронного документооборота ресторана 4.6. Система электронного документооборота парикмахерской
Задание и исходные данные к работе Необходимо предоставить пользователю возможность многокритериального поиска необходимой информации и формирования заказа, а сотрудникам – наполнение системы и управления заказами. Базовый формат для представления проекта: HTML. База данных: Oracle. Средства доступа к базе данных: PHP. Web – сервер: Apache.
Необходимо обеспечить возможность создания документа, его подписание и публикацию. Базовый формат для представления проекта: HTML. База данных: Oracle. Средства доступа к базе данных: PHP. Web – сервер: Apache.
1.2. Срок сдачи студентом законченной работы Срок сдачи студентом законченной работы – 31.05.2003
5
1.3. Содержание работы Разработке подлежат следующие вопросы: • анализ задачи; • структура базы данных; • структура Web-сайта; • PHP – сценарии; • стиль Web-сайта. Календарный план выполнения этапов работы приведен в таблице 1.2. 1.4. Перечень графического (демонстрационного) материала Web-сайт, доступный по сформулированных требований.
Интернету,
обеспечивающий
выполнение
1.5. Исходные данные и пособия Информация, размещенная на серверах: • http://de.ifmo.ru; • http://www.w3c.org; • http://www.oracle.com; • http://www.php.net. №№ п/п 1 2 3 4
Таблица 1.2. Календарный план Наименование этапов курсовой работы Срок выполнения этапов работы Разработка базы данных 1.03.2003 Разработка файловой структуры 15.03.2003 Программирование серверных сценариев 15.04.2003 Сборка, отладка и разработка стиля сайта 1.05.2003
6
2. ВВЕДЕНИЕ В БАЗЫ ДАННЫХ 2.1. Общие сведения При компьютерной обработке информации упорядоченные каким-либо образом данные принято хранить в базах данных (БД) - особых файлах, использование которых вместе с комплексом специальных программных средств – системой управления базой данных (СУБД), позволяет пользователю как просматривать необходимую информацию, так и, по мере необходимости, манипулировать ею, например, добавлять, изменять, копировать, удалять, сортировать и т.д. Дать простое определение базы данных можно следующим образом. База данных - это набор информации, организованный с определенной целью. Одним из самых простых примеров баз данных может быть записная книжка. Этот список фамилий владельцев телефонов и их телефонных номеров, представленный в записной книжке в алфавитном порядке, представляет собой, вообще говоря, проиндексированную базу данных. Использование индекса - в данном случае фамилии (или имени) позволяет вам достаточно быстро отыскать требуемый номер телефона. Телефонный справочник представляет собой так называемую "плоскую" базу данных, в которой вся информация располагается в единственной таблице. Каждая запись в этой таблице содержит идентификатор конкретного человека - имя и фамилию и его номер телефона. Таким образом, таблица состоит из записей, информация в которых разделена на несколько частей - полей. В данном случае полями являются "ФИО" и "Номер телефона". 2.2. Реляционные базы данных В отличие от плоских, реляционные базы данных состоят из нескольких таблиц, связь между которыми устанавливается с помощью совпадающих значений однотипных полей. Здесь следует отметить, что использование реляционной модели баз данных не является единственно возможным способом представления информации. В настоящее время существует несколько различных моделей представления данных, которые, однако, не получили такого широкого распространения среди разработчиков и пользователей, как реляционная модель. При разработке систем управления базами данных реляционная модель практически является стандартом. В реляционной модели таблица представляет собой множество именованных атрибутов, или столбцов, и множество записей (кортежей), или строк. Очень часто столбец называется полем таблицы. Пересечение столбца и строки образует ячейку таблицы. Набор допустимых значений столбца – домен – характеризуется определенным типом данных, например символьным или целым. Реляционная модель предъявляет к таблицам определенные требования: • данные в ячейках таблицы структурно неделимы; • данные в одном столбце одного типа; • имена столбцов уникальны; • каждая строка таблицы уникальна;
7
• строки и столбцы таблицы размещаются в произвольном порядке. 2.3. Отношения между таблицами Отношения между таблицами определяются отношением между группами объектов соответствующего типа. Например, один автор может написать несколько книг и издать их в разных издательствах. Или издательство может опубликовать несколько книг разных авторов. Таким образом, между авторами и названиями книг существует отношение один-ко-многим, а между издательствами и авторами существует отношение много-ко-многим. Если между двумя таблицами существует отношение один-к-одному, то это означает, что каждая запись в одной таблице соответствует только одной записи в другой таблице. 2.4. Нормализация баз данных При проектировании базы данных, надо стремиться максимально уменьшить количество повторяющейся информации. Процесс уменьшения избыточности информации в базе данных посредством разделения ее на несколько связанных друг с другом таблиц и называется нормализацией данных. Окончательная цель нормализации сводится к получению такого проекта базы данных, в котором каждый факт появляется лишь в одном месте, т.е. исключена избыточность информации. Это делается не столько с целью экономии памяти, сколько для исключения возможной противоречивости хранимых данных. Для того чтобы построить достаточно эффективную структуру данных, достаточно придерживаться нескольких простых правил: 1) определите таблицы таким образом, чтобы записи в каждой таблице описывали объекты одного и того же типа; 2) если в вашей таблице появляются поля, содержащие повторяющиеся данные, разделите таблицу; 3) не запоминайте в таблице данных, которые могут быть вычислены при помощи данных из других таблиц. 2.5. Ключи и индексы Как было отмечено выше при описании отношений между таблицами, в реляционных базах данных таблицы связываются друг с другом посредством совпадающих значений ключевых полей. Ключ - минимальный набор полей таблицы, по значениям которых можно однозначно найти требуемую запись. Минимальность означает, что исключение из набора любого поля не позволяет однозначно идентифицировать запись. При выборе ключа следует отдавать предпочтение несоставным ключам. Ключ может быть первичным или внешним. Первичный ключ таблицы позволяет идентифицировать записи в данной таблице, а внешний – в другой таблице. Таким образом, первичный ключ однозначно определяет запись в таблице, в то время как внешний ключ используется для связи с первичным ключом другой таблицы.
8
Данные запоминаются в таблице в том порядке, в котором они вводятся пользователем. Это, так называемый, физический порядок следования записей. Однако, часто требуется представить данные в другом, отличном от физического, порядке. Например, может потребоваться просмотреть данные об авторах книг, упорядоченные по алфавиту. Кроме того, часто необходимо найти в большом объеме информации запись, удовлетворяющую определенному критерию. Простой перебор записей при поиске в большой таблице может потребовать достаточно много времени и поэтому будет неэффективным. Одними из основных требований, предъявляемым к системам управления базами данных, являются возможность представления данных в определенном, отличном от физического, порядке и возможность быстрого поиска определенной записи. Эффективным средством решения этих задач является использование индексов. Индекс представляет собой таблицу, которая содержит ключевые значения для каждой записи в таблице данных и записанные в порядке, требуемом для пользователя. Ключевые значения определяются на основе одного или нескольких полей таблицы. Кроме того, индекс содержит уникальные ссылки на соответствующие записи в таблице. 2.6. Язык реляционных баз данных SQL Одним из основных преимуществ реляционного подхода к организации БД является то, что пользователи получают возможность эффективной работы в терминах простых и наглядных понятий таблиц, их строк и столбцов без потребности знания реальной организации данных в памяти. Поэтому базовым требованием к реляционным СУБД является наличие мощного и в тоже время простого языка, позволяющего выполнять все необходимые пользователям операции. В последние годы таким повсеместно принятым языком стал язык реляционных БД SQL - Structured Query Language. Язык SQL позволяет манипулировать не только данными, но и структурой базы данных.
9
3. ОСНОВЫ РАБОТЫ С ORACLE 3.1. Подключение к базе данных Oracle является многопользовательской сетевой системой управления базой данных. Доступ к базе данных осуществляется посредством программной среды SQLPlus, которая позволяет выполнять SQL-запросы к базе данных. Вход в режим выполнения SQL-запросов осуществляется после ввода имени учетной записи пользователя, пароля и идентификатора безопасности. В качестве идентификатора безопасности выступает последовательность символов dbfile. Для выхода из режима работы выполнения SQL-запросов используется команда quit. По команде help предоставляется справка по указанной команде. 3.2. Создание, удаление и модернизация таблиц Таблицы создаются командой CREATE TABLE. Команда CREATE TABLE в основном определяет имя таблицы, в виде описания набора имен столбцов указанных в определенном порядке. Она также определяет типы данных и размеры столбцов (см. табл. 3.1). Каждая таблица должна иметь, по крайней мере, один столбец. Пример создания таблицы pet приведен ниже: CREATE TABLE pet ( name VARCHAR(50), sex VARCHAR(1), birth DATE, death DATE );
Удаление таблиц осуществляется командой DROP TABLE, например для удаления таблицы pet надо ввести команду: DROP TABLE pet;. Для модернизации уже существующих в базе данных таблиц их необязательно удалять, а потом вновь создавать в измененном виде. Для модернизации таблиц существует команда ALTER TABLE, например ALTER TABLE pet DROP COLUMN death;.
NUMBER(p,s)
DATE
CHAR(size)
VARCHAR2(size)
Таблица 3.1. Типы данных Вещественное число с точностью p вплоть до 38 цифр (общим количеством цифр) и масштабом s (числом цифр справа от десятичной точки). Масштаб может находится в диапазоне от –84 до 127. Сохраняет информацию о дате. Использует формат "YYYY-MM-DD". Символьные данные фиксированной длины равной size байт. Максимум size составляет 2000 байт, а минимум 1 байт. Строка переменной длины, максимальный размер которой не может превышать size символов или байтов.
10
Максимальное значение size – 4000. LONG
RAW(size)
LONGRAW
Строка переменной длины, максимальный размер которой не может превышать 2 Гбайт, или 231-1 байт. Двоичные данные, максимальный размер которых не может превышать size байтов. Максимальное значение size – 2000. Двоичные данные, максимальный размер которых не может превышать 2 Гбайт, или 231-1 байт.
3.3. Объявление ограничений Для объявления первичных и внешних ключей используется конструкции, приведенные в следующем примере. CREATE TABLE dept_20 (employee_id NUMBER(4) CONSTRAINT emp_id_pk PRIMARY KEY, last_name VARCHAR2(10), job_id VARCHAR2(9), manager_id NUMBER(4), hire_date DATE, salary NUMBER(7,2), commission_pct NUMBER(7,2), department_id CONSTRAINT fk_deptno REFERENCES departments(department_id));
В примере создается таблица dept_20, в которой поле employee_id является первичным ключом, а поле department_id – внешним ключом и указывает на поле departments в таблице department_id. При задании первичного и внешнего ключей были использованы ограничения с названиями emp_id_pk и fk_deptno соответственно. Как видно из примера ограничения задаются при помощи ключевого слова CONSTRAINT. При создании составного первичного ключа можно воспользоваться конструкцией описанной в следующем примере: ALTER TABLE sales ADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id);
В таблице sales создается ограничение sales_pk, которое объявляет поля prod_id и cust_id составным первичным ключом. Аналогичной по построению конструкцией описывается составной внешний ключ, например: ALTER TABLE dept_20 ADD CONSTRAINT fk_empid_hiredate FOREIGN KEY (employee_id, hire_date) REFERENCES job_history(employee_id, start_date);
11
В примере, приведенном ниже, дано описание используются для создания различного рода ограничений.
конструкций,
которые
CREATE TABLE company( ID NUMBER(8) PRIMARY KEY, brief_name VARCHAR(50) CHECK (brief_name = UPPER(brief_name)), full_name VARCHAR(200) NOT NULL, country REFERENCES countries(ID), city REFERENCES cities(ID), zip NUMBER(6) NOT NULL, address VARCHAR(200) NOT NULL );
В таблице определены следующие ограничения: • поле ID является первичным ключом; • поля country и city являются внешними ключами; • поле brief_name должно быть набрано прописными символами; • поля full_name, zip и address должны быть обязательно определены при создании записи. 3.4. Автоматизация работы с базами данных Для ускорения процедуры загрузки структуры базы данных и самих данных все необходимые для этого SQL-конструкции помещают в один текстовый файл. Например, файл script.sql следующего содержания DROP TABLE staff CASCADE CONSTRAINTS; CREATE TABLE staff( id NUMBER(8) PRIMARY KEY, person REFERENCES person(ID), section REFERENCES section(ID), position REFERENCES position(ID), salary NUMBER(10,2), begindate DATE NOT NULL, enddate DATE NOT NULL ); DROP TABLE person CASCADE CONSTRAINTS; CREATE TABLE person( id NUMBER(8) PRIMARY KEY, firstname VARCHAR(50) NOT NULL, lastname VARCHAR(50) NOT NULL, middlename VARCHAR(50) NOT NULL, birthdate DATE NOT NULL, sex CHAR(1) CHECK (sex IN ('M','W')) ); DROP TABLE section CASCADE CONSTRAINTS; CREATE TABLE section( id NUMBER(8) PRIMARY KEY, name VARCHAR(100) NOT NULL );
12
DROP TABLE position CASCADE CONSTRAINTS; CREATE TABLE position( id NUMBER(8) PRIMARY KEY, name VARCHAR(100) NOT NULL );
предназначен для создания структуры базы данных, инфологическая модель которой изображена на рис. 3.1. Для исполнения SQL-инструкция, находящихся в файле script.sql необходимо в среде SQLPlus выполнить команду @[путь]\script.sql Person
Staff
id firstname lastname middlename birthdate sex
Position id name
id persone position section salary begindate enddate
Section id name
Рис.3.1 Инфологическая модель базы данных «Кадры» 3.5. Запросы на выборку данных Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью предложения SELECT. В синтаксисе предложение SELECT могут использоваться следующие обозначения: • звездочка (*) для обозначения "все" - употребляется в обычном для программирования смысле, т.е. "все случаи, удовлетворяющие определению"; • точка с запятой (;) - завершающий элемент предложений SQL; • запятая (,) — используется для разделения элементов; Стандартная форма SQL-запроса: • SELECT (выбрать) данные из указанных столбцов; • FROM (из) перечисленных таблиц, в которых расположены эти столбцы; • WHERE (где) строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк. Фраза WHERE включает набор условий для отбора строк: •
значение_1 {
=
|
<> | < • логические операторы AND, OR,
|
<=
|
>
|
>= }
значение_2;
13
где значение_1 – это поле таблицы, а значение_2 – это значение условия отбора строк, AND – когда должны удовлетворяться оба разделяемых с помощью AND условия, OR – когда должны удовлетворяться одно из разделяемых с помощью OR условия. Пример записи WHERE-условий: • • • •
WHERE WHERE WHERE WHERE
dolgnost=’директор’ dolgnost=’учитель’ AND pol=’м’ telefon>’5’ dolgnost=’учитель’ OR dolgnost=’завуч’
Примеры SQL- запросов: • SELECT * FROM sotrudniki; - запрос: выдать все (*) из таблицы sotrudniki; - запрос: выдать все имена и • SELECT imia , familia FROM ludi; фамилии из таблицы ludi; • SELECT * FROM ludi WHERE pol=’м’; - запрос: выбрать всех (*) мужчин из таблицы ludi; • SELECT * FROM ludi WHERE familia like ’И%’; - запрос: выбрать всех сотрудников, фамилии которых начинаются на букву И. 3.6. Построение запросов INSERT и DELETE Кроме предложения SELECT язык SQL поддерживает следующие предложения. DELETE - удаление записи из таблицы, например: • DELETE FROM sotrudniki; – удалить все из таблицы sotrudniki. • DELETE FROM ludi WHERE pol=’м’; - удалить всех мужчин из таблицы ludi. INSERT – добавление (вставка) одной записи в таблицу, например: INSERT INTO ludi (familia,imia) VALUES (’Иванов’,’Иван’); - добавить в таблицу ludi в поля familia и imia значения Иванов и Иван соответственно. В предложении INSERT за самим оператором следует ключевое слово INTO, после
которого указывается название базы данных. Далее в скобках следуют поля этой базы данных, в которые производится запись. Они разделяются запятыми, но не могут дублироваться. Порядок их перечисления может не соответствовать порядку, установленному в базе данных. Значения после ключевого слова VALUES – это значения, которые необходимо занести в таблицу. Они разделяются запятыми. В предложении INSERT должно быть строгое соответствие по типу данных полей и значений. 3.7. Построение запроса UPDATE Запросы UPDATE предназначены для обновления одного или нескольких полей таблицы. В предложении UPDATE можно использовать фразу WHERE, для того, чтобы указать условия для производимых изменений. Например: UPDATE ludi SET familia=’Хромов’ WHERE familia =’Громов’;
14
Этот запрос изменяет все фамилии Громов на фамилию Хромов в таблице ludi. 3.8. Служебные команды При разработке новой базы данных может потребоваться информация обо всех существующих пользовательских объектах. С этой целью можно воспользоваться командой: SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS;
Данная команда выводит на экран список объектов с указанием их типов. Если требуется узнать структуру какой-либо таблицы, то следует воспользоваться следующей конструкцией: SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'название_таблицы';
После выполнения команды на экране появится список, описывающий структуру таблицы имя_таблицы, в каждой строке которого будет указаны название таблицы, название колонки и тип данных.
15
4. ОСНОВЫ ЯЗЫКА СЕРВЕРНЫХ СЦЕНАРИЕВ PHP 4.1. Общие сведения Язык PHP был создан Расмусом Лердорфом (Rasmus Lerdorf) осенью 1994 года. Аббревиатура PHP расшифровывалась как Personal Home Page. На тот момент PHP обладал весьма скромными возможностями, но уже к середине 1995 года он научился принимать данные HTML-форм и работать с базами данных. С тех пор PHP все время совершенствовался, и на сегодняшний день представляет собой удобный инструмент для создания динамических HTML-страниц. Изменилось и значение аббревиатуры: теперь PHP рекурсивно расшифровывается как PHP: Hypertext Preprocessor (PHP - гипертекстовый препроцессор). PHP - это язык сценариев, интерпретируемый на стороне сервера. После выполнения сценария сервером Web-обозревателю передаются результаты его работы в виде HTML-страницы. Для того чтобы отлаживать сценарии, необходимо установить на компьютере WWW-сервер, например Apache (http://www.apache.org), и собственно сам PHP (http://www.php.net или http://ru.php.net). 4.2. Структура PHP-сценария Сценарий представляет собой обычный текстовый файл, в котором содержится одна или несколько секций . Пример простейшего сценария, который выводит в Web-обозреватель HTML-страницу с надписью «Это первый сценарий», приведен ниже. Первый сценарий!
В этом примере echo - это функция PHP для вывода текстовых данных в Webобозреватель. С ее помощью можно выводить просто текст, как мы делали еще в первом примере, а можно и значения переменных. Так же, как и в С/С++, в PHP каждая отдельная конструкция должна завершаться точкой с запятой – <;>. 4.3. Комментарии В PHP есть несколько возможностей добавления комментариев: можно закомментировать либо целую строку, либо несколько строк. Символы «//» или «#» свидетельствуют о том, что все стоящее после них и до конца строки является
16
комментарием. Если необходимо закомментировать какой-то фрагмент сценария, то лучше воспользоваться комбинацией «/*» и «*/». Пример:
4.4. Переменные В отличие от большинства языков программирования, в PHP нет необходимости переменные и их тип объявлять заранее. О том, что это переменные, свидетельствует знак «$» в начале их имени. По аналогии с языками С и С++ имена переменных в PHP могут состоять из символов латиницы, цифр и знака подчеркивания. Кроме того, PHP чувствителен к регистру, поэтому $var1 и $Var1 будут двумя разными переменными. 4.5. Константы Если возникает необходимость использовать в скрипте данные, которые не изменяются по ходу его выполнения, то их лучше всего объявить в виде константы: define("CONST","value");. Особенность объявления констант заключается в том, что это необходимо делать в начале секции:
4.6. Операции, выражения, операторы Выражение в программировании служит для определения действий, которые обычно описываются формулами. Выражения состоят из операций и операндов. Последовательность выполнения операций определяется следующими факторами: • приоритетом операций; • порядком расположения операций в выражении; • использованием скобок. По приоритету все операции делятся на три группы. Операции первого высшего - приоритета выполняются в первую очередь. Операции третьего - низшего - приоритета выполняются в последнюю очередь. Операции с равным приоритетом выполняются слева направо. Скобки служат для изменения обычного порядка обработки операций. Подвыражение, заключенное в скобки, сначала вычисляется как отдельный операнд, а затем его результат используется для выполнения операций, обрамляющих скобки. Операции и их приоритет приведены в таблице 4.1,
17
в таблицах 4.2, 4.3 и 4.4 приведены соответственно арифметические операции, операции отношения и логические операции. Таблица 4.1. Приоритеты операций Приоритет Первый Второй Третий
Операции *, /, % +, ==, !=, >=, <=, <, > Таблица 4.2. Арифметические операции
Операция + * / %
Действие Сложение Вычитание Умножение Деление Остаток от деления Таблица 4.3. Операции отношения
Операция == != < > <= >=
Действие Равно Не равно Меньше Больше Меньше или равно Больше или равно Операнды
A False False True True
B False True False True
!A (не) True True False False
Таблица 4.4. Логические операции Операции A && B (и) A || B (или) False False False True False True True True
При реализации алгоритма работы скрипта действия, которые необходимо выполнить, описываются операторами. Операторы бывают простые и структурные. К простым относится, например, оператор присваивания <=>. А вот для реализации «логики» скрипта используются структурные операторы, такие как if, switch, do...while, for. Вот пример их использования:
//если $v2 не равно $v3
18
{
//то $v4=10;
} else { $v4=20; }
// иначе
switch($v3) { // если $v3 равно 3 case 3: echo "v3=3";// то выводим на экран строку: v3=3 break; // выход из оператора case 8: // если $v3 равно 8 echo "v3=8";// то выводим на экран строку: v3=8 break; // выход из оператора default: // если переменная $v3 не равна ни одному // из предшествующих выражений // то выводим // на экран строку: v3 != 3, v3 != 8 echo "v3 != 3, v3 != 8"; break; // выход из оператора } $i = 10; do // выполняем операторы внутри фигурных скобок { echo $i; // выводим значение переменной $i i--; // уменьшаем значение переменной на единицу } // пока переменная $i больше нуля while ($i>0); // выполняем операторы внутри // фигурных скобок 10 раз for($i=0;$i<10;$i++) { echo "hi! -".$i; // прибавляем (символ "." объединяет // строки) к строке "hi! -" // значение переменной $i // и выводим результат } ?>
4.7. Функции, массивы, работа с файлами При программировании сценариев могут возникнуть ситуации, при которых некоторые части сценария повторяются, а меняются лишь данные, которыми оперирует сценарий. В таких случаях целесообразно разбить сценарий на подпрограммы. РНР предоставляет такую возможность. Для этого можно использовать функции. Вот пример функции:
19
function MinVal($var1,$var2) { if($var1<$var2) { return $var1; } else { return $var2; } } echo " ".MinVal(3,5); // функция вернет число 3 echo " ".MinVal(4,8); // функция вернет число 4 ?>
PHP предоставляет также возможность работать с массивами. Массив можно определить несколькими способами, в частности, так: "orange", "b"=>"banana", "c"=>"apple"); // где a, b, c являются индексами массива, а "orange", // "banana" и "apple", // соответственно, значениями ячеек, на которые // ссылаются эти индексы // выводим значения ячеек массива echo $fruits[a]." "; // выведет "orange" echo $fruits[c]; // выведет "apple" // а вот другой способ определения массива: $fruits2[0] = "apple"; $fruits2[1] = "mango"; // выводим значения ячеек массива echo $fruits2[0]." "; // выведет "apple" echo $fruits2[1]; // выведет "mango" ?>
В PHP входит множество стандартных функций. В частности, для написания сценария голосования нам понадобятся функции работы с файлами, а именно: fopen, flock, fread, fwrite, fclose. Рассмотрим пример их использования:
20
// (об этом "говорит" параметр LOCK_SH; // если надо заблокировать файл на запись, // то надо указать LOCK_EX) всем, кроме // нашего сценария flock($fp,LOCK_SH); // считываем данные из файла в переменную $contents $contents=fread($fp, filesize("filename")); // как видим, функции fread // нужно передавать указатель на открытый файл // и размер считываемых данных // для определения размера файла можно воспользоваться // функцией filesize, // которой в качестве параметра передается имя файла, // размер которого нужно узнать // для того чтобы получить доступ к прочитанным данным // в виде строк, нужно // разбить содержимое переменной $contents на строки // это можно сделать с помощью функции explode, // которая разбивает строку // на массив строк. Ей необходимо передать строку // и символ или символы, // которые служат признаком начала новой строки, // в нашем случае этим символом // будет символ перевода строки ("\n") $data=explode("\n",$contents); // разбиваем $contents // на строки массива $data fclose($fp); // закрываем файл (и соответственно // снимаем блокировку) // а вот как писать в файл: $fp=fopen("filename","w"); // блокируем доступ к файлу на запись всем, // кроме нашего сценария flock($fp,LOCK_EX); $data="Пример записи в файл"; // формируем строку данных fwrite($fp,$data); // записываем данные в файл fclose($fp); ?>
// выводим из файла записи, чтобы вставить их в страницу $filename = "$archive"; $fd = fopen( $filename, "r" ); $current = fread( $fd, filesize( $filename ) ); fclose( $fd ); // вставляем записи из файла в страницу print("$current"); // закрываем скрипт ?>
Осталось только создать файл guestbook.txt и поместить его в ту же директорию, что и сам сценарий. Непосредственно сценарий надо сохранить с именем guestbook.php. 4.10. Пример авторизации пользователей Пример будет состоять из трёх файлов: index.php, authorize.php и secretplace.php. Файл index.php содержит форму, где пользователь вводит свое имя и пароль. Авторизация пользователя
Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке. страницу... header("Location: secretplace.php");
23
exit; }
} // если что-то было не так, то пользователь // получит сообщение об ошибке. ?> Вы ввели неверный пароль!
Файл secretplace.php содержит сценарий, который предоставляет секретную информацию только зарегистрированным пользователям, а всех остальных пользователей перенаправляет на страницу для ввода имени и пароля. Приветствуем Вас , вы на секретной странице !!!
4.11. Пример использования сценариев для построения шаблонов HTMLстраниц Рассмотрим такую ситуацию, при которой требуется создать несколько похожих друг на друга HTML-страниц, которые содержат разные заголовки и изображения. Без использования PHP потребовалось бы создавать все эти страницы с нуля, каждый раз используя практически одинаковые фрагменты HTML-кода. А вот как можно решить эту задачу с использованием PHP: создать файлы-шаблоны повторяющихся частей страниц, а затем - несколько сценариев, содержащих несколько строк кода. Рассмотрим пример. Создадим файл-шаблон «верхний колонтитул» страницы header.tpl следующего содержания:
24
А вот содержимое файла-шаблона «нижний колонтитул» страницы footer.tpl:
Теперь напишем сценарии, использующие шаблоны. Создадим файл page1.php:
и файл page2.php:
В этих сценариях полезной функцией является include(). Эта функция подставляет в тело сценария (в той позиции, где она вызывается) содержимое файла, который передается ей в качестве параметра, то есть в нашем случае header.tpl и footer.tpl. Она же может оказаться полезной для включения в текст сценария других фрагментов программного кода. Следует также отметить, что если файл, который нужно включить в сценарий, находится в директории, отличной от той, где находится сценарий, то нужно также указать полный путь к файлу, например include("dir1/dir2/somefile.ext");. 4.12. Создание сценария для голосования Создадим сценарий подсчета голосов на основе HTML-формы. Попробуем собрать статистику того, сколько людей предпочитает определенный вид сока. Вначале создадим форму для получения голосов: <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> Скрипт голосования
26
// считываем данные из файла $contents=fread($fp, filesize(DATA_FILE)); // закрываем файл (и соответственно, снимаем блокировку) fclose($fp); $data=explode("\n",$contents); // преобразуем прочитанные // данные в массив строк // в качестве разделителя // служит символ перевода // строки // сюда попадаем, если была нажата кнопка "Проголосовать" if($polling=="Проголосовать") { // определяем, за "кого" был отдан голос, // и увеличиваем на единицу соответствующую // переменную switch($poll) { case ORANGE: $data[0]=$data[0]+1; break; case MANGO: $data[1]=$data[1]+1; break; case APPLE: $data[2]=$data[2]+1; break; default: break; } // записываем обновленные данные в файл $fp=fopen(DATA_FILE,"w"); // блокируем доступ к файлу на запись всем, // кроме нашего скрипта flock($fp,LOCK_EX); // формируем три строки данных $newdata=$data[0]."\n".$data[1]."\n".$data[2]; fwrite($fp,$newdata); fclose($fp); } // выводим статистику голосования echo "за апельсиновый сок проголосовало ". $data[0]." человек"; echo "за сок манго проголосовало ". $data[1]." человек"; echo "за яблочный сок проголосовало ". $data[2]." человек"; ?>
В качестве action данной формы указано . Этот код сценария возвратит ту строку, которую вы набираете в Web-обозревателе, чтобы запустить данный сценарий. Это значение хранится в стандартной (встроенной в PHP) переменной $PHP_SELF. То есть алгоритм работы сценария будет такой: при
27
запуске
сценария
набором
в Web-обозревателе пути к нему (например, http://127.0.0.1/poll.php) он считает данные из файла и выведет статистику, разместив ее под формой голосования. Если же мы нажмем в форме кнопку «Проголосовать», то тем самым заново запустим сценарий (теперь ему будут переданы значения всех полей ввода формы), и отображение статистики произойдет после обработки полученных сведений из формы и сохранения изменений в файле данных. 4.13. Пример обращения к базе данных из PHP
'; // Создаем соединение с БД $conn = OCILogon('scott', 'tiger','dbname'); // Создаем таблицу $stmt = OCIParse($conn,"create table t(id number(30), a varchar2(10))"); $mess = @OCIExecute($stmt); // Обрабатываем исключительные ситуации if(!$mess) { $error = OCIError($stmt); print 'Произошла ошибка при создании таблицы ('.$error['message'].')'; } // Заносим в таблицу данные for($i=0; $i<10; $i++) { $id = time(); $stmt = OCIParse($conn,"insert into t(id,a) values($id,'Стр. $i!')"); @OCIExecute($stmt); } $mess = @OCICommit($conn); // Обрабатываем исключительные ситуации if(!$mess) { $error = OCIError($conn); print 'Произошла ошибка при занесении данных ('.$error['message'].')'; } // Выбираем из таблицы данные $stmt = OCIParse($conn, "select * from t"); $mess = @OCIExecute($stmt); // Обрабатываем исключительные ситуации if(!$mess) { $error = OCIError($stmt); print 'Произошла ошибка при выборке данных ('.$error['message'].')'; } // Выводим данные на экран while (OCIFetch($stmt)){ $id = OCIResult($stmt,'ID'); $a = OCIResult($stmt,'A'); print "$id -> $a \n"; }
28
// Удаляем таблицу $stmt = OCIParse($conn,"drop table t"); $mess = @OCIExecute($stmt); // Обрабатываем исключительные ситуации if(!$mess) { $error = OCIError($stmt); print 'Произошла ошибка при ('.$error['message'].')'; } // Разрываем соединение с БД OCILogoff($conn); ?>