5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

08-php-mysql.html

8 Взаимодействие PHP и MySQL

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

При этом одной из наиболее популярных СУБД, используемых при создании Web-сайтов, является СУБД MySQL. Она является одной из самых распространенных СУБД в сети Интернет и отличается хорошей скоростью работы, надежностью и гибкостью. Поддержка сервера MySQL автоматически включается в поставку языка PHP, так как язык PHP изначально предназначался для работы с СУБД MySQL. В качестве языка запросов в СУБД MySQL используется язык запросов SQL.

SQL это наиболее стандар¬тизированный язык для доступа к системам управления базами данных. Структурированный язык запросов SQL позволяет производить различные операции с базами данных: создавать таблицы, помещать, обновлять и удалять из них данные, производить запросы из таблиц и т.д. Его применяют также в таких системах управления базами данных, как Oracle, Interbase, а также Microsoft SQL Server [5].

Необходимо отметить, что наиболее популярным приложением по созданию и работе с базами данных MySQL является программа phpMyAdmin.

PhpMyAdmin это Web-приложение с открытым кодом, написанное на языке PHP и представляющее собой Web-интерфейс для администрирования баз данных MySQL. С помощью программы phpMyAdmin можно создавать, удалять и редактировать таблицы базы данных, выполнять отдельные SQL-запросы, создавать и удалять пользователей, изменять их привилегии [5].

Программа phpMyAdmin также позволяет через Web-браузер осуществлять администрирование сервера MySQL, запускать команды SQL по работе с содержимым таблиц баз данных, управлять СУБД MySQL без непосредственного ввода SQL команд, предоставляя дружественный пользовательский интерфейс.

Далее представлен пример создания и работы с базой данных “Travel”, состоящей из четырех таблиц: “Hotel”, “Putevka”, “Turoperator” и “Turist”. База данных задана по предметной области “Путешествие”, покупка путевок в турагенстве “Travel”. Данная база данных предназначена для учета всех путевок, оформленных в турагенстве “Travel”. При этом для заказа путевок необходима информация о туристе, об отеле и о туроператоре. Также необходима информация о самой путевке, такая как номер путевки, дата отправки, дата возвращения. Даталогическая модель базы данных “Travel” представлена на рисунке 8.1.


Рисунок 8.1 – Даталогическая модель базы данных “Travel”

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

Ниже представлено описание таблиц “Hotel”, “Putevka”, “Turoperator” и “Turist” базы данных “Travel”, с указанием основных полей.

Hotel (Id, Name, Class)
Putevka (Id, Number, DateOtpravki, DateVozvr, Cod_Hotel, Cod_Operator, Cod_Turist)
Turist (Id, SecondName, FirstName, Patronym, SeriaPassport, NumberPassport)
Turoperator (Id, Name)

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

При работе с базами данных СУБД MySQL применяются наиболее популярные операторы языка запросов SQL. При этом для создания базы данных в СУБД MySQL используется два различных способа. Первый способ заключается в создании базы данных в консоли MySQL с помощью SQL-оператора CREATE DATABASE [5].

Синтаксис:

CREATE DATABASE databasename,

где databasename - имя создаваемой базы данных.

Ниже представлен пример использования оператора CREATE DATABASE.

CREATE DATABASE Travel;

Реализация данного кода представлена на рисунке 8.2.


Рисунок 8.2 – Создание базы данных “Travel”

Таким образом, как видно на рисунке 8.1, в данном примере осуществлялось использование оператора CREATE DATABASE для создания базы данных “Travel”. При этом создание базы данных осуществлялось в консольном режиме.

Второй способ создания базы данных MySQL предполагает использование для этой цели программы phpMyAdmin.

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


Рисунок 8.3 – Созданная база данных “Travel” в программе phpMyAdmin

Таким образом, как видно на рисунке 8.3, в данном примере была создана база данных “Travel” в приложении phpMyAdmin. При этом данная база данных еще не содержит таблиц. Необходимо отметить, что при использовании программы phpMyAdmin нет необходимости применять SQL-запросы, так как они генерируются автоматически [6].

Следующим этапом работы с базой данных является создание таблиц. Для создания таблиц в СУБД MySQL также используются два способа. Первый способ заключается в использовании SQL-оператора CREATE TABLE.

Синтаксис:

CREATE TABLE tablename (colums),

где tablename - название таблицы, которую тре¬буется создать,

colums - список столбцов в таблице.

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

Синтаксис:

USE databasename,
где databasename - имя базы данных.

Ниже представлен пример использования оператора CREATE TABLE.

USE Travel;
CREATE TABLE Hotel
(Id INT NOT NULL PRIMARY KEY,
Name varCHAR(60) NOT NULL,
Class INT NOT NULL);

Реализация данного кода представлена на рисунке 8.4.


Рисунок 8.4 – Создание таблицы “Hotel” базы данных “Travel”

Таким образом, как видно на рисунке 8.4, в данном примере осуществлялось использование оператора CREATE TABLE для создания таблицы “Hotel” базы данных “Travel”. При этом данная таблица содержит информацию об отелях и имеет три столбца: “Id”, “Name” и “Class”, то есть идентификатор, название и класс обслуживания отеля.

Аналогичным образом можно реализовать создание остальных таблиц базы данных “Travel”. SQL-код создания таблиц представлен ниже.

CREATE TABLE Turist
(Id INT NOT NULL PRIMARY KEY,
SecondName varCHAR(60) NOT NULL,
FirstName varCHAR(60) NOT NULL,
Patronym varCHAR(60) NOT NULL,
SeriaPassport INT NOT NULL,
NumberPassport INT NOT NULL);

CREATE TABLE Turoperator
(Id INT NOT NULL PRIMARY KEY,
Name varCHAR(60) NOT NULL);

CREATE TABLE Putevka
(Id INT NOT NULL PRIMARY KEY,
Number INT NOT NULL,
DateOtpravki date NOT NULL,
DateVozvr date NOT NULL,
Cod_Hotel INT NOT NULL REFERENCES Hotel(Id),
Cod_Operator INT NOT NULL REFERENCES Turoperator(Id),
Cod_Turist INT NOT NULL REFERENCES Turist(Id));

Необходимо отметить, что каждая из перечисленных таблиц базы данных MySQL создается отдельным оператором CREATE TABLE. Каждый столбец содержит имя, за которым следует описание типа данных и атрибуты данного столбца. Некоторые столб¬цы содержат и другие спецификаторы:
- NOT NULL означает, что все строки таблицы должны иметь значение в этом ат¬рибуте. Если NOT NULL не указано, поле может быть пустым;
- AUTO_INCREMENT является специальной возможностью MySQL, которую можно задей¬ствовать в числовых столбцах. Если при вставке строк в таблицу оставлять такое поле пустым, MySQL автоматически генерирует уникальное значение идентификатора. Это значение будет на единицу больше максимального значения, уже существующего в столбце. В каждой таблице может быть не больше одного такого поля;
- PRIMARY KEY определяет, что этот столбец является первич¬ным ключом для таблицы и используется после имени столбца. Данные в этом столбце должны быть уникальными. MySQL автоматически индексирует этот столбец;
- UNSIGNED используется после целочисленного типа и означает, что его значение может быть либо положительным, либо нулевым [5].

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

Для того чтобы создать базу данных в программе phpMyAdmin необходимо в данной программе, внизу окна в разделе “Создать новую таблицу в базе данных Travel” в поле “Имя” указать имя новой таблицы, в поле “Поля” указать количество полей таблицы, а затем нажать кнопку “ОК”.

После этого требуется задать типы полей таблицы, указав обязательный первичный ключ, выбрав его в переключателе “Первичный”, а также в поле “Дополнительно” определить его как “auto_increment”. Необходимо отметить, что имя первого поля должно быть “Id”. Это поле будет служить индексом, по которому MySQL однозначно идентифицирует запись в базе данных. Для второго поля и последующих полей можно выбирать произвольные имена [6].

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

На рисунках 8.5-8.8 представлены таблицы “Hotel”, “Putevka”, “Turoperator” и “Turist” базы данных “Travel”, которые были созданы в программе phpMyAdmin.

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


Рисунок 8.5 – Таблица “Hotel” базы данных “Travel” в программе phpMyAdmin

Рисунок 8.6 – Таблица “Turoperator” базы данных “Travel” в phpmyadmin

Рисунок 8.7 – Таблица “Turist” базы данных “Travel” в программе phpMyAdmin

Рисунок 8.8 – Таблица “Putevka” базы данных “Travel” в phpMyAdmin

После создания всех таблиц, можно осуществить построение даталогической модели базы данных, связав все таблицы с помощью внешних кючей. В программе phpMyAdmin это реализуется с помощью закладки “Дизайнер”. На рисунке 8.9 представлена даталогическая модель базы данных “Travel”, состоящая из четырех таблиц.


Рисунок 8.9 – Модель базы данных “Travel” в программе phpMyAdmin

Программа phpMyAdmin позволяет также импортировать созданные таблицы баз данных. Для того, чтобы осуществить импорт существующей базы данных, необходимо выбрать базу данных с помощью закладки “Импорт”. После этого в окне указать импортируемый файл, формат импортируемого файла и нажать кнопку “OK”. На рисунке 8.10 представлено окно импорта базы данных “Travel”, состоящей из четырех таблиц.


Рисунок 8.10 – Окно импорта в phpmyadmin

Рисунок 8.11 – Успешное импортирование в phpMyAdmin

Таким образом, в данном примере был осуществлен импорт существующей базы данных “Travel”. При этом формат импортируемого файла является SQL. Как видно на рисунках 8.10 и 8.11, после того, как база данных была импортирована, было выдано сообщение “Импорт успешно завершен, запросов выполнено: 4.”, что означает, что была импортирована база данных, состоящая из четырех таблиц.

Работа с базой данных MySQL предполагает сохра¬нение в ней данных по заданной предметной области. Для добавления данных в базу данных используется SQL-оператор INSERT.

Синтаксис:

INSERT [INTO] table [(colum 1, соlum 2, colum 3, ... , соlum n)] VALUES (value 1, value 2, value 3, . . . ,value n),
где table - имя таблицы,
colum 1,…,соlum n – столбцы таблицы, в которые необходимо добавить значения,
value 1, … ,value n – значения, предназначенные для добавления в таблицу базы данных.

Необходимо отметить, что при работе с базами данных MySQL, с помощью оператора INSERT можно заполнять значениями не все поля таблицы, а только некоторые. Для этого необходимо указать столбцы базы данных, а также указать те значения, которые необходимо в них внести. Это возможно в ситуации, когда о какой-либо записи есть лишь частичная информа¬ция или если несколько полей записи необязательны.

Например, в представленном ниже коде

INSERT INTO Hotel (name) VALUES ("Laguna");

с помощью оператора INSERT в таблицу “Hotel” базы данных “Travel” было реализовано добавление в поле “Name” название отеля “Laguna”.

При этом для добавления частичной информации в таблицу базы данных можно также использовать SQL-оператор SET, который указывает, в какие именно поля необходимо осуществить добавление информации.

Например, представленном ниже коде

INSERT INTO Hotel
SET Name="Hilton",
Class=5;

с помощью конструкции оператора INSERT и SET в таблицу “Hotel” базы данных “Travel” было реализовано добавление в поле “Name” названия пятизвездочного отеля “Hilton”.

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

Ниже представлен пример использования оператора INSERT.

INSERT INTO Hotel VALUES
(1, "Rosa Resort Hotel", 4),
(2, "Joy World Palace", 5),
(3, "My Dream Beach", 3),
(4, "Golden Beach Hotel ", 4),
(5, "Joy Kirish Resort", 5);

Реализация данного кода представлена на рисунке 8.12.


Рисунок 8.12 – Добавление нескольких строк в таблицу “Hotel”

Таким образом, как видно на рисунке 8.12, в данном примере осуществлялось использование оператора INSERT для добавления пяти строк в таблицу “Hotel” базы “Travel”. В таблицу были добавлены пять отелей. На рисунке 8.12 также видно, что в ответ на заданный запрос было выведено сообщение: запрос выполнен успешно (“Query OK”), обработано пять строк (“5 rows affected”), время выполнения запроса (“0.36 sec”). Аналогичные сообщения выводятся на примеры других SQL-запросов.

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

Синтаксис:

SELECT Items
FROM tables
[ WHERE condition ]
[ GROUP BY group type ]
[ HAVING WHERE_definition ]
[ ORDER BY order_type ]
[ LIMIT limit_criteria ],
где tables - названия таблиц, из которых происходит извлечение данных,
WHERE - проверка на соответствие полей условию condition,
GROUP BY - группирование результатов запроса по полю group type,
HAVING - отбор групп по условию,
ORDER BY - сортировка данных по полю order_type,
LIMIT - ограничение количества записей в результате запроса по критерию limit_criteria [5].

Ниже приведен пример использования оператора SELECT.

SELECT Name, Class
FROM Hotel;

Реализация данного кода представлена на рисунке 8.13.


Рисунок 8.13 – Извлечение данных из таблицы “Hotel”

Таким образом, как видно на рисунке 8.13, в данном примере осуществлялось использование оператора SELECT для извлечения данных из таблицы “Hotel” базы данных “Travel”. При этом на экран были выведены названия всех отелей (поле “Name”) в одном столбце и класс обслуживания (поле “Class”) в другом.

При работе с базами данных MySQL совместно с оператором SELECT также используется оператор группового символа “*”. Данный оператор расширяет область запроса до уровня всех столбцов указанной таблицы.

Ниже представлен пример использования символа “*” оператора SELECT.

SELECT *
FROM Turoperator;

Реализация данного кода представлена на рисунке 8.14.


Рисунок 8.14 – Извлечение данных из всех строк и столбцов таблицы “Turoperator”

Таким образом, как видно на рисунке 8.14, в данном примере осуществлялось использование символа “*” оператора SELECT для извлечения всех данных таблицы “Turoperator” базы данных “Travel”. Данная таблица содержит два поля - “Id” и “Name”, включающих пять записей идентификаторов и названий туроператоров соответственно.

Для того чтобы получить доступ к содержимому таблицы базы данных MySQL, необходимо указать критерий выбора. Для этого в операторе SELECT используется конструкция WHERE.

Ниже представлен пример использования конструкции WHERE оператора SELECT.

SELECT Id, Name
FROM Turoperator
WHERE Id = 2;

Реализация данного кода представлена на рисунке 8.15.

В данном примере осуществлялось использование конструкции WHERE оператора SELECT для извлечения данных по определенному критерию из таблицы “Turoperator” базы данных “Travel”. На рисунке 8.15 видно, что из таблицы “Turoperator” были извлечены значения столбцов “Name” и “Id” только тех строк, в которых поле “Id” равно 2. В этой таблице этому условию удовлетворяет только один туроператор - “Sunmar tour”, который и был выведен на экран.


Рисунок 8.15 – Извлечение данных по определенному критерию из таблицы “Turoperator”

Необходимо отметить, что, при работе с таблицами базы данных MySQL можно также проверять сразу несколько критериев, объединяя их операциями AND или OR оператора SELECT.

Ниже приведен пример использования операции OR оператора SELECT.

SELECT *
FROM Turist
WHERE Id=2 OR Id=4;

Реализация данного кода представлена на рисунке 8.16.


Рисунок 8.16 – Извлечение данных по нескольким критериям из таблицы “Turist”

Таким образом, как видно на рисунке 8.16, в данном примере осуществлялось использование операции OR оператора SELECT для извлечения данных из таблицы “Turist” базы данных “Travel”. В данном примере из таблицы “Turist” были извлечены лишь те записи, в которых поле “Id” равно 2 или 4. К таковым записям относятся туристы “Petrov Stanislav Ivanovich”, имеющий “Id”, равное двум, а также “Semenov Nikolay Petrovich”, имеющий “Id”, равное четырем.

При работе с базой данных MySQL можно использовать данные из нескольких таблиц. Для объединения этой информации в языке SQL требуется выполнить операцию, назы¬ваемую объединением. При этом подразумевается, что при объединении двух и больше таблиц, отношения между данными сохраняются.

Ниже представлен пример объединения четырех таблиц.

SELECT Putevka.Id, Hotel.Name, Turist.SecondName, Turist.FirstName, Turoperator.Name
FROM Putevka, Turist, Hotel, Turoperator
WHERE Turist.SecondName=“Semenov”
AND Turist.FirstName=“Nikolay”
AND Turist.Id=Putevka.Cod_Turist
AND Turoperator.Id=Putevka.Cod_Operator
AND Putevka.Cod_Hotel=Hotel.Id;

Реализация данного кода представлена на рисунке 8.17.


Рисунок 8.17 – Пример постого объединение четырех таблиц для извлечения данных о туристе

Таким образом, как видно на рисунке 8.17, в данном примере осуществлялось объединение всех четырех таблиц базы данных “Travel” для получения информации о туристе “Semenov Nikolay”. Данный запрос показывает, в какие отели и через каких туроператоров покупал путевки данный турист, каков номер купленной путевки. В результате была получена информация о том, что турист “Semenov Nikolay” покупал путевки через туроператора “Crouise tour” в отели “Joy Kirish Resort” и “My Dream Beach”. При этом эти путевки, купленные указанным туристом, хранятся в таблице “Putevka” под номерами 9 и 10 соответственно.

Другими словами, в данном примере получена таблица, в которой каждая строка из таблиц “Turist”, “Turoperator” и “Hotel” сопоставляется каждой строке таблицы “Putevka”. Иначе говоря, осуществляется поиск соответствия “Id” из таблицы “Turist” значению “Cod_Turist” из таблицы “Putevka”, значение “Id” из таблицы “Hotel” значению “Cod_Hotel” из таблицы “Putevka, а также “Id” из таблицы “Turoperator” значению “Cod_Operator” из таблицы “Putevka.

Необходимо отметить, что в заданном примере был определен тип объединения. Запятая между названиями таблиц эквивалентна словам INNER JOIN или CROSS JOIN. Такой тип соединения еще называют полным объединением или декартовым произведением таблиц.

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

Объединение по остатку уравнивает строки в таблицах и выискивает несовпадающие строки со значениями NULL. В SQL для этой цели используется оператор SELECT с ключевыми словами LEFT JOIN либо RIGHT JOIN, которые предназначены для поиска отсутствующих значений.

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

Ниже приведен пример объединения по остатку.

SELECT Hotel.Id, Hotel.Name, Putevka.Cod_Hotel
FROM Hotel LEFT JOIN Putevka
ON Hotel.Id = Putevka.Cod_Hotel;

Реализация данного кода представлена на рисунке 8.18.

В данном примере осуществлялось использование оператора SELECT с ключевыми словами LEFT JOIN для поиска несоответствующих строк в таблицах “Hotel” и “Putevka” базы данных “Travel”. На рисунке 8.18 видно, что для отеля “Joy World Palace” нет соответствующих путевок, поскольку “Cod_Hotel” имеет значения NULL.


Рисунок 8.18 – Результат поиска несоответствующих строк в таблицах “Hotel” и “Putevka”

В ниже следующем примере осуществляется извлечение из базы данных “Travel” информации о тех отелях, которые еще не посещались туристами. То есть осуществляется поиск несоответствующих строк в таблицах “Hotel” и “Putevka” базы данных.

SELECT Hotel.Id, Hotel.Name
FROM Hotel LEFT JOIN Putevka
ON Hotel.Id = Putevka.Cod_Hotel
WHERE Cod_Hotel IS NULL;

Реализация данного кода представлена на рисунке 8.19.


Рисунок 8.19 – Результат поиска несоответствующих строк в таблицах “Hotel” и “Putevka”

Таким образом, в данном примере осуществлялось использование оператора SELECT с ключевыми словами LEFT JOIN для поиска отелей, в которых не был ни один турист. Как видно на рисунке 8.19, к таковым отелям относится отель “Joy World Palace”.

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

Ниже приведен пример использования псевдонимов.

SELECT a.Id, b.SecondName, b.FirstName, b.Patronym, c.Name, c.Class, d.Name
FROM Putevka a, Turist b, Hotel c, Turoperator d
WHERE b.Id = a.Cod_Turist
AND a.Cod_Hotel=c.Id
AND d.Id=a.Cod_Operator;

Реализация данного кода представлена на рисунке 8.20.


Рисунок 8.20 – Использование псевдонимов для поиска информации обо всех путевках всех туристов

Таким образом, как видно на рисунке 8.20, в данном примере осуществлялось использование псевдонимов при работе с таблицами “Putevka”, “Turist”, “Turoperator” и “Hotel” базы данных “Travel” для поиска информации обо всех путевках. При этом для таблицы “Putevka” был присвоен псевдоним “a”, для таблицы “Turist” псевдоним “b”, для таблицы “Hotel” псевдоним “c”, для таблицы “Turoperator” псевдоним “d”. На экран выводятся номера путевок, имена и фамилии туристов, оформивших путевки, названия и классы отелей, в которых останавливались туристы, а также наименования туроператоров. То есть используются поле “Id” таблицы “Putevka”, поля “SecondName” и “FirstName” таблицы “Turist”, поля “Name” и “Class” таблицы “Hotel”, а также поле “Name” таблицы “Turoperator”.

Необходимо отметить, что при работе с базами данных MySQL для присваивания псевдонима таблице можно также использовать конструкцию “as”, указывая таблицу, которая используется.

Например, в представленном ниже коде

SELECT b.SecondName, b.FirstName, b.Patronym, c.Name, c.Class, d.Name
FROM Putevka AS a, Turist AS b, Hotel AS c, Turoperator d
WHERE b.Id = a.Cod_Turist
AND a.Cod_Hotel=c.Id
AND d.Id=a.Cod_Operator;

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

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

Таблица 8.1 – Типы объединений в MySQL
Название Описание
Декартово произведение Осуществляет объединение комбинации всех строк во всех таблицах. В случае применения между именами таблиц ставятся запятые, и не используется конструкция WHERE.
Перекрестное объединение Аналогично предыдущему. Также может использоваться с указанием ключевых слов CROSS JOIN между названиями объединяемых таблиц.
Внутреннее объединение Семантически эквивалентно запятой. Может использоваться с указанием ключевых слов INNER JOIN. Без условия WHERE эквивалентно полному объединению. Обычно при истинно внутреннем объединении задается условие WHERE.
Объединение по равенству Используется условное выражение со знаком “=” для соответствия в объединении строк из разных таблиц. В SQL в этом объединении применяется конструкция WHERE.
Объединение по остатку Осуществляет объединение комбинации всех строк во всех таблицах. В случае применения между именами таблиц ставятся запятые, и не используется конструкция WHERE.

При работе с данными из таблиц базы данных MySQL можно осуществить вывод данных таблицы, извлеченных по запросу в определенном по¬рядке. В языке SQL для этого используется конструкция ORDER BY оператора SELECT.

Конструкция ORDER BY применяется для сортировки строк в столбцах, указанных в операторе SELECT. Эта конструкция удобна для представления результатов запроса в удобочитаемом виде.

Ниже представлен пример использования конструкции ORDER BY оператора SELECT.

SELECT Name, Class
FROM Hotel
ORDER BY Name;

Реализация данного кода представлена на рисунке 8.21.


Рисунок 8.21 – Вывод содержимого таблицы “Hotel” по возрастанию

Таким образом, как видно на рисунке 8.21, в данном примере осуществлялось использование конструкции ORDER BY оператора SELECT для вывода данных таблицы “Hotel” базы данных “Travel” по возрастанию. Данная таблица содержит два столбца “Name” и “Class”. В данном примере были извлечены названия и классы отелей, отсортированные в алфавитном порядке по столбцу “Name”.

Необходимо отметить, что при извлечении данных из таблиц, порядок сортировки, по умолчанию, идет по возрастанию. Также этот порядок можно задать ключевым словом ASC.

Например, в представленном ниже коде

SELECT Name, Class
FROM Hotel
ORDER BY Name ASC;

с помощью ключевого слова ASC конструкции ORDER BY были извлечены имена и классы отелей из таблицы “Hotel”, отсортированные в порядке от “a” до “z”, что аналогично примеру, отображенному на рисунке 8.21.

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

SELECT Name, Class
FROM Turoperator
ORDER BY Name DESC;

Реализация данного кода представлена на рисунке 8.22.


Рисунок 8.22 – Вывод содержимого таблицы “Turoperator” по убыванию

Таким образом, как видно на рисунке 8.22, в данном примере было реализовано использование ключевого слова DESC при работе с таблицей “Turoperator” базы данных “Travel” для вывода данных в обратном порядке. В результате выполнения этого запроса были извлечены идентификаторы и названия туроператоров, отсортированные в порядке от “z” до “a” по полю “Name”, то есть по убыванию.

Для того, чтобы узнать, сколько строк присутствует в определенном наборе, или каково среднее значение какого-нибудь столбца таблицы в MySQL имеется набор функций агрегирования, которые подходят для выполнения задач подобного рода. Эти функции можно применять как для таблицы базы данных в целом, так и для групп данных внутри таблицы [5].

Наиболее часто используемые функции при работе с таблицами СУБД MySQL перечислены в таблице 8.2.

Таблица 8.2 – Обобщенные функции в MySQL
Название Описание
AVG (столбец) Средняя величина значений в определенном столбце.
COUNT (элементы) При указании столбца выдается количество числовых (ненулевых) значений в этом столбце. Если перед названием столбца указать DISTINCT, выдается только количество конкретных значений в столбце. Если указать COUNT(*), подсчет строк будет производиться независимо от нулевых значений, в одном стиле.
MIN (столбец) Минимальное значение в столбце.
MAX (столбец) Максимальное значение в столбце.
STD (столбец) Стандартное отклонение значений в столбце.
SUM (столбец) Сумма значений в столбце.

Ниже представлен пример использования функции avg оператора SELECT.

SELECT avg (Class)
FROM Hotel;

Реализация данного кода представлена на рисунке 8.23.


Рисунок 8.23 – Вычисление среднего класса всех отелей таблицы “Hotel”

Таким образом, как видно на рисунке 8.23, в данном примере было реализовано использование функции avg оператора SELECT для вычисления среднего класса всех отелей таблицы “Hotel” базы данных “Travel”. В итоге было определено, что средний класс отелей таблицы “Hotel” равен 4,2.

Чтобы получить более детальную информацию, можно воспользоваться конструкцией GROUP BY.

Ниже представлен пример использования конструкции GROUP BY оператора SELECT.

SELECT с.SecondName, avg(b.Class)
FROM Putevka a, Hotel b, Turist c
WHERE a.Cod_Hotel=b.Id
AND c.Id=a.Cod_Turist
GROUP BY a.Cod_Turist;

Реализация данного кода представлена на рисунке 8.24.


Рисунок 8.24 – Группировка данных из таблиц “Putevka”, “Turist” и “Hotel”

Таким образом, как видно на рисунке 8.24, в данном примере было реализовано применение конструкции GROUP BY оператора SELECT для работы с таблицами “Putevka”, “Turist” и “Hotel” базы данных “Travel”. При этом использование конструкции GROUP BY с функцией агрегирования фактически меняет поведение функции. Вместо того чтобы выдавать средний класс всех отелей, такой запрос показывает для каждого туриста средний класс отелей, в которых он отдыхал. В результате, средний класс оказался равен 3,5, 4,0 и 4,0 для туристов с фамилиями “Ivanov”, “Petrov”, “Semenov” соответственно.

Чтобы расширить предыдущий пример получением информации о том, у кого из туристов средний класс отелей, в которых он отдыхал, больше среднего, то есть больше 3,5, используется конструкция HAVING, которая обращается к группам.

Ниже представлен пример использования конструкции HAVING оператора SELECT.

SELECT с.SecondName, avg(b.Class)
FROM Putevka a, Hotel b, Turist c
WHERE a.Cod_Hotel=b.Id
AND c.Id=a.Cod_Turist
GROUP BY a.Cod_Turist;
HAVING avg(b.Class)>3.5;

Реализация данного кода представлена на рисунке 8.25.


Рисунок 8.25 – Обработка сгруппированных данных из таблиц“Putevka”, “Turist” и “Hotel”

Таким образом, как видно на рисунке 8.25, в данном примере было реализовано использование конструкции HAVING оператора SELECT при работе с таблицами “Putevka”, “Turist” и “Hotel” базы данных “Travel” для поиска туристов, у которых средний класс отелей, в которых они отдыхали больше 3,5. В результате было определено, что к таким туристам относятся туристы с фамилиями “Petrov” и “Semenov”, так как средний класс отеля, в которых они отдыхали, равен четырем.

При работе с данными из таблиц базы данных MySQL иногда требуется указать, сколько строк результата следует отображать на экране. В языке SQL для этого используется конструкция LIMIT оператора SELECT.

Для этой конструкции необходимы два параметра: номер строки, с которой следует начать считывание, и количество отображаемых строк. Необходимо отметить, что нумерация строк таблиц базы данных MySQL начинается с нуля.

Ниже приведен пример использования конструкции LIMIT оператора SELECT. В данном примере осуществлялось использование конструкции LIMIT для вывода только двух записей таблицей “Hotel” базы данных “Travel”, начиная с первой записиси.

SELECT Name
FROM Hotel
LIMIT 1, 2;

Реализация данного кода представлена на рисунке 8.26.


Рисунок 8.26 – Вывод данных с определенной позиции таблицы “Hotel”

Таким образом, как видно на рисунке 8.26, в данном примере выдается только две строки результата выполнения оператора SELECT, начиная с первой. Но так как нумерация строк таблиц базы данных MySQL начинается с нуля, то на экран выводятся строки с “Id”, равными 2 и 3. К таковым отелям относятся отели “Joy World Palace” и “My Dream Beach”.

При работе с СУБД MySQL, помимо того, что данные из таблиц базы данных необходимо извлекать, их еще необ¬ходимо периодически обновлять. Это можно сделать, используя, SQL-оператор UPDATE.

Синтаксис:

UPDATE tablename
SET colum 1 = expression 1, colum 2 = expression 2, … , colum n = expression n, [WHERE condition] [LIMIT number],
где tablename - имя таблицы, в которой необходимо произвести изменения,
colum 1,…,colum n - столбцы, в которых необходимо произвести изменения,
expression 1,…,expression n - выражения, применяемые для изменения столбцов,
WHERE - проверка на соответствие полей условию condition,
LIMIT - ограничение количества записей в результате запроса по критерию number [5].

Например, в представленном ниже коде

UPDATE Hotel
SET Class=Class-1;

с помощью операто¬ра UPDATE было уменьшено на единицу значение столбца “Class” таблицы “Hotel”. Другими словами был понижен класс всех отелей на единицу.

Необходимо отметить, что при использовании конструкции WHERE оператора UPDATE можно изменять значения столбцов таблицы не во всех строках, а только в определенных.

Ниже приведен пример использования оператора UPDATE.

UPDATE Hotel
SET Class = 2
WHERE Id = 4;

Реализация данного кода представлена на рисунке 8.27.


Рисунок 8.27 – Изменение значения столбца в определенной строке таблицы “Hotel”

Таким образом, как видно на рисунке 8.27, в данном примере осуществлялось использование оператора UPDATE для изменения значения столбца в определенной строке таблицы “Hotel” базы данных “Travel”. В данном примере был изменен класс на второй только тех отелей, у которых “Id” равен четырем. Как оказалось, к таким отелям относится только отель “Golden Beach Hotel”, в результате его класс был понижен с 4 до 2.

При работе с СУБД MySQL, кроме обновления данных в строках, может потребоваться изменить структуру са¬мой таблицы в базе данных. Для этого применяется SQL-оператор ALTER TABLE.

Синтаксис:

ALTER TABLE tablename alteration [, alteration...],
где tablename - имя таблицы, в которой необходимо произвести изменения,
alteration - тип преобразования выбранной таблицы.

Типы преобразования, осуществляемые оператором ALTER TABLE, представлены в таблице 8.3.

Таблица 8.3 – Возможные преобразования в операторе ALTER TABLE
Синтаксис Описание
ADD [COLUM] colum_description [FIRST | AFTER colum] Добавление нового столбца в указанное место (если место не указано, столбец добавляется в конец). Colum_description требует имени и типа, точно так же, как при работе с оператором CREATE.
ADD [COLUM] (colum_description, colum_description, …) Добавление одного или нескольких столбцов в конец таблицы.
ADD INDEX [index] (colum, …) Добавление индекса в указанный столбец (столбцы) таблицы.
ADD PRIMARY KEY (colum, …) Назначение указанного столбца (столбцов) первичным ключом таблицы.
ADD UNIQUE [index] (colum, …) Добавление уникального индекса в указанный столбец (столбцы) таблицы.
ALTER [COLUM] colum {SET DEFAULT value\DROP DEFAULT} Добавление или удаление значения по умолчанию определенного столбца.
CHANGE [COLUM]Colum new_colum_description Изменение столбца с именем colum так, чтобы он получил указанное описание. Это можно использовать для изменения имени столбца, поскольку colum_description включает в себя имя.
MODIFY [COLUM] colum_description Преобразование похоже на CHANGE. Используется для изменения типов столбцов, но не имен.
DROP [COLUM] colum Удаление указанного столбца.
DROP PRIMARY KEY Удаление первичного индекса.
DROP INDEX index Удаление указанного индекса.
RENAME[AS] new_table_name Переименование таблицы.

Ниже приведен пример использования оператора ALTER TABLE с параметром MODIFY.

ALTER TABLE Hotel
MODIFY Name CHAR(90) NOT NULL;

Реализация данного кода представлена на рисунке 8.28.


Рисунок 8.28 – Изменение атрибутов столбца “Name” таблицы “Hotel”

Таким образом, как видно на рисунке 8.28, в данном примере осуществлялось использование оператора ALTER TABLE с параметром MODIFY для изменения структуры таблицы “Hotel” базы данных “Travel”. В данном случае была изменена длина текстового поля столбца “Name” с 60 до 90 символов.

Ниже приведен пример использования оператора ALTER TABLE с параметром ADD AFTER.

ALTER TABLE Putevka
ADD Price FLOAT AFTER Number;

Реализация данного кода представлена на рисунке 8.29.


Рисунок 8.29 – Добавление нового столбца в таблицу “Putevka”

Таким образом, как видно на рисунке 8.29, в данном примере осуществлялось использование оператора ALTER TABLE с параметром ADD AFTER для добавления нового столбца таблицы “Putevka” базы данных “Travel”. В результате на экран была выведена структура таблицы с помощью оператора SHOW, в которой отображено, что в таблицу “Putevka” был добавлен новый столбец “Price” после столбца “Number”.

Ниже приведен пример использования оператора ALTER TABLE с параметром DROP.

ALTER TABLE Putevka
DROP Price;

Реализация данного кода представлена на рисунке 8.30.


Рисунок 8.30 – Удаление столбца в таблице “Putevka”

Таким образом, как видно на рисунке 8.30, в данном примере осуществлялось использование оператора ALTER TABLE с параметром DROP для удаления столбца “Price” таблицы “Putevka”. При этом структура таблицы стала такой же, как до добавления столбца “Price”.

При работе с СУБД MySQL, иногда требуется удалять таблицы базы данных. Для удаления данных из базы данных используется SQL-оператор DELETE.

Синтаксис:

DELETE FROM table
[WHERE condition] [LIMIT number],
где table - имя таблицы, в которой необходимо удалить записи,
WHERE - ограничение удаления определенных строк,
LIMIT - ограничение количества строк, которые необходимо удалить.

Ниже приведен пример использования оператора DELETE.

DELETE FROM Putevka;

Реализация данного кода представлена на рисунке 8.31.


Рисунок 8.31 – Удаление всех записей таблицы “Putevka”

Таким образом, как видно на рисунке 8.31, в данном примере, осуществлялось использование оператора DELETE при работе с таблицей “Putevka” базы данных “Travel” для удаления всех записей из таблицы “Putevka”.

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

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

DELETE FROM Hotel
WHERE Id=2;

Реализация данного кода представлена на рисунке 8.32.


Рисунок 8.32 - Удаление определенной строки из таблицы “Putevka”

Таким образом, как видно на рисунке 8.32, в данном примере осуществлялось использование конструкции WHERE оператора DELETE для удаления записей таблицы “Hotel” базы данных “Travel”. В данном примере из таблицы “Hotel” была удалена лишь одна строка с “Id”=2.

Для удаления таблицы базы MySQL данных в языке SQL используется оператор DROP TABLE. Оператор осуществляет удаление таблицы и всех объектов, связанных с ней [5].

Синтаксис:

DROP TABLE table,
где table - имя таблицы.

Ниже приведен пример использования оператора DROP TABLE.

DROP TABLE Turoperator;

Реализация данного кода представлена на рисунке 8.33.


Рисунок 8.33 – Удаление таблицы “Turoperator” базы данных “Travel”

Таким образом, как видно на рисунке 8.33, в данном примере осуществлялось использование оператора DROP TABLE для удаления таблицы “Turoperator” базы данных “Travel”.

Для удаления всей базы данных MySQL используется SQL-оператор DROP DATABASE.

Синтаксис:

DROP DATABASE database,
где database - имя таблицы.

Оператор DROP DATABASE осуществляет удаление базы данных MySQL. В результате удаляются все строки, таблицы и сама база данных.

Для реализации взаимодействия языка PHP и СУБД MySQL существует множество встроенных функций. К наиболее популярным относятся функции для подключения к базе данных MySQL, записи данных в базу данных, а для также чтения и вывода содержимого таблиц.

Для устойчивого подключения к серверу MySQL в языке PHP используется функция mysql_pconnect.

Синтаксис:

int mysql_pconnect ([string host[:port][:/socketpath]], [string user], [string password]),
где host[:port][:/socketpath]] - полный адрес узла, на котором размещен сервер MySQL,
user - имя пользователя базы данных,
password - пароль для входа в базу данных.

Функция mysql_pconnect устанавливает устойчивое сетевое соединение с базой данных MySQL, расположенной на хосте “$host”, и возвращает идентификатор открытого соединения. При регистрации указывается имя пользователя “$user” и пароль “$password”.

Как альтернативу можно использовать функцию mysql_connect, которая делает практи¬чески то же самое. Отличие состоит в том, что mysql_connect устанавливает непостоянное соединение с базой данных.

Синтаксис:

int mysql_connect ([string host[:port][:/socketpath]], [string user], [string password]),
где host[:port][:/socketpath] - полный адрес узла, на котором размещен сервер MySQL,
user - имя пользователя базы данных,
password - пароль для входа в базу данных.

Функция mysql_connect устанавливает сетевое соединение с базой данных MySQL, расположенной на хосте “hostname”, и возвращает идентификатор открытого соединения. При регистрации указывается имя пользователя “username” и пароль “password”. При попытке запуска следующего соединения с теми же самыми аргументами, второе соединение не будет открыто, а функция возвратит идентификатор уже существующего.

Соединение с базой данных закрывается, когда сценарий завершает свое выполнение или когда обращается к функции mysql_close.

Синтаксис:

int mysql_close(int database_connection),
где database_connection - соединение, которое получено в функции mysql_connect.

Для работы с базой данных MySQL необходимо также указать, какая база дан¬ных нужна. Это можно сделать с помощью функции mysql_select_db.

Синтаксис:

int mysql_select_db(string database, [int database_connection]),
где database - имя выбираемой базы данных, database_connection - соединение, которое получено в функции mysql_connect.

Например, в ниже представленном коде

mysql_select_db("Travel");

была выбрана база данных “Travel” из списка баз данных на сервере.

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

Синтаксис:

int mysql_query(string query, [int database_connection]),
где query - строка, содержащая запрос,
database_connection - соединение, которое получено в функции mysql_connect.

Если параметр “database_connection” опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect без параметров. При этом результат запроса буферизируется.

При работе с базами данных может возникнуть ситуация, когда потребуется узнать количество записей, участвующих в запросе с SQL-операторами INSERT, UPDATE, DELETE. Это можно сделать с помощью функции mysql_affected_rows.

Синтаксис:

int mysql_affected_rows ([int database_connection]),
где database_connection - соединение, которое получено в функции mysql_connect.

Функция mysql_num_rows определяет количество записей, возвращаемых оператором SELECT.

Синтаксис:

int mysql_num_rows(int result),
где result - результат.

Далее будет рассмотрен пример совместной работы языка РНР с базой данных СУБД MySQL “Travel”, состоящей из четырех таблиц - “Hotel”, “Putevka”, “Turist” и “Turoperator”.

В данном примере представлена работа с рассмотренной ранее базой данных “Travel”. Данный пример демонстрирует доступ к базе данных MySQL с помощью языка PHP. В представленном ниже коде осуществляется добавление информации в таблицу “Turist” базы данных “Travel”.

Имеется форма для добавления данных о туристе. Необходимо осуществить обработку данных пользователя из форм. Всю информацию о туристе необходимо сохранить в базу данных. К этой информации относится порядковый номер туриста, фамилия, имя, отчество, серия и номер паспорта.

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

<HTML>
<HEAD>
<TITLE> Турагенство "Travel" - Добавление данных о туристе
</TITLE>
</HEAD>
<BODY>
<H1> Турагенство "Travel".</H1>
<H2> Добавление данных о туристе.</H2>
<FORM method="POST" action="example.php">
<INPUT type="hidden" name="posted" value="true">
<<TABLE border=0> <TR><TD>Фамилия:</TD>
<TD><INPUT name="SecondName" type="text"></TD>
</TR><TR><TD>Имя:</td>
<TD><INPUT name="FirstName" type="text"></TD>
</TR><TR> <TD>Отчество: </td>
<TD><INPUT name="Patronym" type="text"></TD>
</TR><TR><TD>Серия паспорта:</TD>
<TD><INPUT name="SeriaPassport" type="text"></TD>
</TR><TR><TD>Номер паспорта:</TD>
<TD><INPUT name="NumberPassport" type="text"></TD>
<TR><TD colspan=2><INPUT type="submit" value="Добавить"></TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 8.34.


Рисунок 8.34 – Добавление данных о туристе в базу данных “Travel”

Таким образом, как видно на рисунке 8.34, в данном примере при загрузке Web-страницы на экране появляется форма, содержащая пять однострочных текстовых полей, в которые необходимо ввести информацию о туристе. Затем необходимо нажать кнопку “Добавить”. После этого подключится обработчик, указанный в атрибуте “action” тега “form”. В данном примере это файл example.php.

Код файла-обработчика представлен ниже.

<HTML>
<HEAD>
<TITLE> Турагенство "Travel" - Добавление данных о туристе
</TITLE>
</HEAD>
<BODY>
<H1> Турагенство "Travel".</H1>
<H2> Добавление данных о туристе.</H2>
<?php
if (isset($_POST['posted']))
{ $SecondName = $_POST['SecondName'];
$FirstName = $_POST['FirstName'];
$Patronym = $_POST['Patronym'];
$SeriaPassport = $_POST['SeriaPassport'];
$NumberPassport = $_POST['NumberPassport'];
//передача данных из формы на сервер
if ($SecondName == "" or $FirstName == "" or $Patronym == ""or $SeriaPassport == ""or $NumberPassport == "")
{ echo "Необходимо ввести имя - нажмите кнопку Назад и заполните форму еще раз"; exit; }
$SecondName = addslashes($SecondName);
$FirstName = addslashes($FirstName);
$Patronym = addslashes($Patronym);
$SeriaPassport = addslashes($SeriaPassport);
$NumberPassport = addslashes($NumberPassport);
$db = @mysql_pconnect("localhost", "root");
if (!$db)
{ echo " Ошибка: Невозможно подключиться к MySQL серверу. Пожалуйста, попробуйте позже."; exit; }
mysql_SELECT_db("Travel");
$query = "INSERT INTO Turist(SecondName, FirstName, Patronym,SeriaPassport,NumberPassport) VALUES ('".$SecondName."','".$FirstName."','".$Patronym ."','".$SeriaPassport ."','".$NumberPassport ."')";
$result = mysql_query($query);
if($result)
echo "<H3>Информация о туристе успешно добавлена в базу данных.</H3>"; }
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 8.35.


Рисунок 8.35 – Результаты добавления туриста в базу данных “Travel”

Таким образом, в данном примере осуществлялось добавление данных в одну из таблиц базы данных “Travel”. В таблицу “Turist” добавляется информация в поля “SecondName”, “FirstName”, “Patronym”, “SeriaPassport” и “NumberPassport”. При этом происходит проверка заполнености всех полей формы. Если заполнены не все поля, то на экран выводится сообщение об ошибке и просьба о заполнении всех полей. Далее происходит подключение к базе данных. Если подключение невозможно, то на экран выводится соответствующее сообщение. Если подключение произошло успешно, выполняется сохранение в таблицу “Turist” данных, введенных в форму. К таким данным относится фамилия, имя, отчество туриста, номер и серия его паспорта. После удачного заполнения пользователю выводится сообщение “Информация о туристе успешно добавлена в азу данных”.

Как видно на рисунке 8.35, в данном примере в таблицу “Turist” была добавлена запись: “Семенов Николай Петрович 5304 096572”.

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

Ниже представлен пример поиска информации о туристах по дате отправки и вывод на экран результатов поиска.

HTML-код поиска информации в базе данных представлен ниже.

<HTML>
<HEAD>
<TITLE> Турагенство "Travel" - Поиск туриста</TITLE>
</HEAD>
<BODY>
<H1> Турагенство "Travel".</H1>
<H2> Поиск данных о туристе.</H2>
<FORM method="POST" action="example.php">
<<INPUT type="hidden" name="posted" value="true">
Выберите критерий поиска:<br>
<SELECT name="Otpravka">
<OPTION value="DateOtpravki">Дата отправки
<OPTION value="Number">Номер путевки
</SELECT><br>
Введите строку:<br>
<INPUT name="First" type=TEXT><br>
<INPUT type=submit value="Поиск"></form>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 8.36.


Рисунок 8.36 – Поиск данных о туристе

Таким образом, как видно на рисунке 8.36, в данном примере при загрузке Web-страницы на экране появляется форма, в которую пользователь должен ввести информацию для поиска. Критерий поиска необходимо выбрать из выпадающего списка. Значение критерия поиска требуется ввести в однострочное текстовое поле. Затем необходимо нажать кнопку “Поиск”. После этого подключится обработчик, указанный в атрибуте “action” тега “form”. В данном примере это файл example.php.

Код файла-обработчика представлен ниже.

<HTML>
<HEAD>
<STYLE type="text/css">
.center { text-align: center; }
</STYLE>
<TITLE> Турагенство "Travel" - Поиск туриста</title></head>
<BODY>
<H1> Турагенство "Travel".</H1>
<H2> Поиск данных о туристе.</H2>
<?php
if (isset($_POST['posted']))
{
$Otpravka = $_POST['Otpravka'];
$First = $_POST['First'];
trim($search_term); // удаление пробелов из начала и конца строки
if ($Otpravka == "" or $First == "")
{ echo "Вы не ввели параметры поиска. Пожалуйста, попробуйте снова."; exit; } // остановка выполнения сценария
$Otpravka =addslashes($Otpravka );
$First = addslashes($First);
$db = mysql_pconnect("localhost" , "root", ""); //установка соединения
if (!$db)
{ echo " Ошибка: Невозможно подключиться к MySQL серверу. Пожалуйста, попробуйте позже.";
exit; }
mysql_SELECT_db("Travel"); // выбор базы данных
$query = "SELECT Putevka.DateOtpravki, Putevka.Number, Putevka.DateVozvr, Turist.SecondName, Turist.FirstName, Turist.Patronym, Turist.SeriaPassport, Turist.NumberPassport, Turoperator.Name,
Hotel.Names, Hotel.Class
FROM Putevka, Turist, Turoperator, Hotel
WHERE Turist.Id = Putevka.Cod_Turist AND Turoperator.Id = Putevka.Cod_Operator AND Hotel.Id = Putevka.Cod_Hotel AND ".$Otpravka." LIKE '%".$First."%'";
$result = mysql_query($query); // выполнение запроса
$num_rows = mysql_num_rows($result);
// подсчет количества результатов
echo "<p> <h3>Туристов найдено: ".$num_rows.".</h3></p>";
echo "<table cellpadding=5 border=2>\n";
echo "<tr><th width=100>Номер путевки</th>
<TH width=100>Фамилия</TH><th width=100>Имя</th>
<TH width=100>Отчество</TH>
<TH width=100>Дата отправки </th><th width=100>Дата прибытия</TH>
<TH width=100>Название отеля</th>
<TH width=100>Туроператор</th></tr>\n";
for ($i=0; $i<$num_rows; $i++)
{ $row = mysql_fetch_array($result);
// обработка ряда результата запроса
echo "<TR><TD class \"center\">$row[Number]</TD>
<TD>$row[SecondName]</TD>
<TD>$row[FirstName]</TD>
<TD>$row[Patronym]</TD>
<TD>$row[DateOtpravki]</TD>
<td>$row[DateVozvr]</TD>
<TD class=\"center\">$row[Names]</TD>
<TD class=\"center\">$row[Name]</TD></TR>\n"; } }
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 8.37.


Рисунок 8.37 – Результаты поиска в базе данных

Таким образом, в данном примере осуществлялся поиск информации в базе данных “Travel” по запросу пользователя. Перед выполнением запроса происходит проверка заполненности обязательных полей формы. Если заполнены не все поля, на экран выводится сообщение об ошибке, с просьбой заполнения полей. Затем происходит подключение к базе данных. Если все поля формы заполнены и подключение к базе данных прошло успешно, выполняется запрос на выборку данных из таблиц, после чего на экран выводится результат этого запроса.

В данном примере в качестве критерия поиска использовалась дата оптравки туриста. Из базы считывалась полная информация о туристах, которые купили путевки на заданную дату. При этом, использовались данные из таблиц “Putevka” (поля “Number”, “DateOtpravki”, ”DateVozvr”), “Turist” (поля “SecondName”, “FirstName”, “Patronym”), “Hotel” (поле “Name”) и Turoperator” (поле “Name”).

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

Как видно на рисунке 8.37, в данном примере осуществлялся поиск информации о туристах, чья дата отправки “2010-05-18”. В базе данных “Travel” было найдено три записи, удовлетворяющие данному условию: “Семенов Николай Петрович”, “Иванов Иван Максимович” и “Петров Станислав Евгеньевич”.

Необходимо отметить, что помимо описанных выше функций, при работе с СУБД MySQL используется ряд других функций, которые описаны далее.

<HTML>
<HEAD>
<TITLE>Турагенство "Travel" - Поиск туриста</TITLE>
</HEAD>
<BODY>
<?php
mysql_connect("localhost", "root", "") or die("Невозможно подключиться к MySQL серверу!");
mysql_select_db ("Pegas");
$sql="select a.nomer, a.data_otpravki, a.data_vozvrata, b.nazvanie,b.type_obslug,c.fam,c.name,c.otch ,c.ser_pasporta, c.nomer_pasporta,d.nazvanie
from putevka a,otel b, turist c, turoperator d
where (a.kod_otelya = b.kod_otelya ) and (a.kod_turista=c.kod_turista) and (a.kod_turoperatora=d.kod_turoperatora)";
$result=mysql_query($sql) or die ("Невозможно выполнить запрос!");
while (list($nomer, $data_otpravki,
$data_vozvrata, $nazvanie,
$type_obslug, $fam, $name, $otch ,
$ser_pasporta, $nomer_pasporta, $nazvanie2)=mysql_fetch_array($result))
{
echo "Заказ тура : Турист - $fam $name $otch, номер - $nomer, Дата отправки -$data_otpravki, Дата возврата - $data_vozvrata, Название отеля - $nazvanie, Тип обслуживания-$type_obslug у Туроператора $nazvanie2 <br>";
}
?>
</BODY>
</HTML>


Рисунок 8.38 – Результаты поиска в базе данных

Функция mysql_create_db осуществляет создание базы данных MySQL.

Синтаксис:

int mysql_create_db (string dbname [,int link_identifier]),
где dbname - имя создаваемой базы данных,
link_identifier - идентификатор соединения с создаваемой базой данных.

Функция mysql_create_db создает новую базу данных MySQL с именем “dbname”, используя подключение “link_identifier”.

Например, в представленном ниже коде

$db=mysql_connect("localhost", "root", " ");
if(mysql_create_db("my_db_name"))
{ echo "БД my_db_name создана");}
else { echo "Ошибка создания базы данных: %s\n".mysql_error());}

с помощью функции mysql_create_db осуществлялось создание базы данных “my_db_name”.

Функция mysql_drop_db осуществляет удаление базы данных MySQL.

Синтаксис:

int mysql_drop_db(string database_name [,int link_identifier]),
где database_name - имя удаляемой базы данных,
link_identifier - идентификатор соединения с удаляемой базой данных.

Функция mysql_drop_db в случае успешного удаления возвращает true, при ошибке - false.

Функция mysql_list_dbs возвращает список баз данных на сервере.

Синтаксис:

int mysql_list_dbs([int link_identifier]),
где link_identifier - идентификатор соединения с базами данных,

Функция mysql_list_dbs возвращает набор записей, содержащий список баз данных на сервере.

Например, в представленном ниже коде

$bd=mysql_connect("localhost", "root", " ");
$bd_list=mysql_list_dbs($bd);
while($row=mysql_fetch_object($bd_list))
{ echo $row "\n";}

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

Функция mysql_db_name возвращает имя базы данных из списка.

Синтаксис:

int mysql_db_name(int result, int row [, mixed field]),
где result - дескриптор набора записей, полученных при помощи функции mysql_list_dbs,
row - номер записи в списке баз данных,
field - столбец в списке баз данных.

В случае ошибки, данная функция возвращает false.

Например, в представленном ниже коде

mysql_connect("localhost", " root ", " ");
$db_list=mysql_list();
for($i=0;$i<($cnt=mysql_num_rows($db_list));$i++)
{ echo mysql_db_name($db_list,$i)."\n";}

с помощью функции mysql_db_name осуществлялся вывод на экран имен всех баз данных на сервере.

Функция mysql_list_tables возвращает список таблиц базы данных.

Синтаксис:

int mysql_list_tables(string database [,int link_identifier]),
где database - имя базы данных,
link_identifier - идентификатор соединения с выбранной базой данных.

Функция mysql_list_tables возвращает идентификатор результата, в котором содержатся имена всех таблиц, присутствующих в базе данных. Например, в представленном ниже коде

$db=mysql_connect("localhost", " root ", " ");
$db_list=mysql_list_dbs($db);
while($r_db=mysql_fetch_object($db_list))
{
echo $r_db "\n";
$t_list=mysql_list_tables($r_db);
for($i=0;$i { echo " - ".mysql_tablename($t_list,$i)."\n"; }
}

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

Функция mysql_data_seek устанавливает указатель текущей строки.

Синтаксис:

int mysql_data_seek(int result, int row_number),
где result - идентификатор результата,
row_number - номер строки.

Функция mysql_data_seek устанавливает указатель текущей строки в результате “result” в позицию “row_number”, так что следующий вызов mysql_fetch_row и mysql_fetch_array вернет значения полей именно этой строки. Нумерация записей ведется с нуля. Функция возвращает false в случае ошибки или если строки кончились.

Функция mysql_free_result уничтожает набор записей.

Синтаксис:

int mysql_free_result(int result),
где result - идентификатор результата.

Функция mysql_free_result освобождает память, занимаемую набором записей “result”, возвращенным запросом. Эта функция необходима для экономии памяти, так как язык PHP автоматически освобождает память при завершении сценария.

Функция mysql_result осуществляет получение определенного поля результата.

Синтаксис:

int mysql_result (int result, int row [, mixed field]),
где result - идентификатор результата,
row - номер записи в результате,
field - поле результата.

Функция mysql_result возвращает значение поля “field” в строке результата с номером “row”. Параметр “field” может задавать не только имя поля, но и его номер, то есть позицию, на которой столбец находился при создании таблицы, а также полное имя поля вида: “имя_таблицы.имя_поля”.

Функция mysql_fetch_array извлекает из результата очередную запись и помещает ее в ассоциативный массив.

Синтаксис:

array mysql_fetch_array(int result [, int result_type]),
где result - идентификатор результата,
result_type - задает вид возвращаемого массива и может принимать одно из следующих значений: MYSQL_NUM, MYSQL_ASSOC, MYSQL_BOTH.

Функция mysql_fetch_array возвращает очередную строку результата в виде ассоциативного массива, где каждому полю сопоставлен элемент с ключом, совпадающим с именем поля. Дополнительно в массив записываются элементы с числовыми ключами и значениями, соответствующими величинам полей с этими индексами. В возвращаемом массиве они размещаются сразу за элементами с “обычными” ключами.

Например, в представленном ниже коде

mysql_connect($host, $user, $pass);
$result=mysql_db_query("database", "select id, name from tabl");
while($row=mysql_fetch_array($result)) {
echo "id: ".$row["id"]."<BR>";
echo "id: ".$row[0]."<BR>";
echo "name: ".$row["name"]."<BR>";
echo "name: ".$row[1]."<BR>"; }
mysql_free_result($result);
с помощью функции mysql_fetch_array осуществлялось добавление строк результата запроса в ассоциативный массив и вывод строк результата на экран.

Функция mysql_fetch_row записывает запись в нумерованный массив.

Синтаксис:

array mysql_fetch_row(int result),
где result - идентификатор результата.

Функция возвращает массив, представленный в виде списка со значениями полей очередной строки результата “result”. Если указатель текущей позиции результата был установлен за последней записью (то есть строки кончились), возвращается false. Текущая позиция сдвигается к следующей записи, так что очередной вызов mysql_fetch_row вернет следующую строку результата. Каждое поле записи сохраняется в нумерованном элементе массива. При этом нумерация начинается с нуля.

Например, в представленном ниже коде

$res=mysql_query("SELECT * FROM Table");
while($Row=mysql_fetch_row($res))
{
// обрабатывается строка $Row
}

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

Функция mysql_fetch_lengths возвращает длину элемента записи.

Синтаксис:

array mysql_fetch_lengths(int result),
где result - идентификатор результата.

Функция mysql_fetch_lengths возвращает длину значения, полученного при помощи функций mysql_fetch_row, mysql_fetch_array или mysql_fetch_object.

Например, в представленном ниже коде

$arr=mysql_fetch_row ($result);
$len=mysql_fetch_lengths ($arr);

с помощью функции mysql_fetch_lengths массив “$len” содержит длину соответствующих элементов массива “$arr”, то есть $len[0]=strlen(arr[0]) и т.д.

Функция mysql_field_name возвращает имя поля.

Синтаксис:

string mysql_field_name(int result, int filed_index),
где result - идентификатор результата,
filed_index - индекс поля.

Функция mysql_field_name возвращает имя поля, которое расположено в результате “result” с индексом “filed_index”.

Например, в представленном ниже коде

$result=mysql_query("SELECT id, name FROM table");
echo mysql_field_name($result, 1);

с помощью функции mysql_field_name осуществлялся вывод на экран имя поля с индексом 1.

Функция mysql_field_type возвращает тип набора записей в результате.

Синтаксис:

string mysql_field_type(int result, int filed_offset),
где result - идентификатор результата,
filed_offset - индекс поля.

Функция mysql_field_type похожа на mysql_filed_name, только возвращает не имя, а тип соответствующей колонки в результате (int, double, real и т.д.).

Функция mysql_list_fields возвращает список полей таблицы.

Синтаксис:

int mysql_list_fields(string dbname, string tblname [,int link_identifier]),
где dbname - имя базы данных,
tblname - имя таблицы базы данных,
link_identifier - идентификатор соединения с выбранной базой данных.

Функция mysql_list_fields возвращает информацию об указанной таблице “tblname” в базе данных “bdname”, используя идентификатор соединения “link_identifier”, если он задан. В противном случае, последнее открытое соединение. Возвращаемое значение это идентификатор результата, который может быть проанализирован обычными средствами.

Например, в представленном ниже коде

$link= mysql_connect("localhost", " root ", " ");
$fields=mysql_list_fields("basa", "table", $link);
$colums=mysql_num_fields($fields);
for ($i=0; $i<$colums; $i++)
{ echo mysql_field_name($fields, $i)."<BR>";}

с помощью функции mysql_list_fields осуществлялось получение имен всех полей таблицы “table” базы данных “basa”.

Функция mysql_num_fields определяет число полей в одной строке результата, то есть число колонок в результате.

Синтаксис:

int mysql_num_fields(int result),
где result - идентификатор результата.

Функция mysql_num_fields позволяет определить горизонтальную размерность двумерного массива результата.

Функция mysql_error возвращает сообщение об ошибке.

Синтаксис:

string mysql_error ([int link_identifier]),
где link_identifier - идентификатор соединения.

Функция mysql_error возвращает строку, содержащую текст сообщения об ошибке или пустую строку, если ошибок не было.

Например, в представленном ниже коде

mysql_connect("dbname");
echo mysql_errno().": ".mysql_error()

с помощью функции mysql_error осуществлялся возврат сообщения об ошибке подключения к базе данных [6].

Наверх