Содержание


Программирование с использованием PHP и MySQL в разработке Web-приложений

Часть 2. MySQL – основы применения при построении Web-сайтов

Comments

Серия контента:

Этот контент является частью # из серии # статей: Программирование с использованием PHP и MySQL в разработке Web-приложений

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Программирование с использованием PHP и MySQL в разработке Web-приложений

Следите за выходом новых статей этой серии.

В предыдущей статье «Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 1: PHP – основы применения при построении Web-сайтов» рассматривался гипотетический случай заказа клиентом товаров в универмаге. При этом часть скрипта подразумевала сохранение информации в двумерном (плоском) файле для последующего доступа к ней клиента. Кроме того, эта информация может быть полезна для проведения статистического анализа при планировании бизнеса.

Эта часть кода представлена ниже:

// открываем файл, указав абсолютный путь /var/www/html/orders/orders.txt
@ $fp = fopen("/var/www/html/orders/orders.txt", "a");

flock($fp, 2); // блокируем файл – файл недоступен другим
//Проверяем, открылся ли файл. Если мы вошли внутрь файла, то $fp имеет значение //TRUE
if (!$fp)
{
echo '<p><strong>Вы не можете сейчас сделать заказ
	 – база данных недоступна!</strong></p>';
exit;
}
//Если файл доступен – идет запись в строку для каждого заказа
$outputstring=$date."\t".$tireqty."tire\t"
.$oilqty."oil\t"
.$sparkqty."spark\t\$".$totalamount."\t".$address."\n";
// записываем данные в файл
fwrite($fp, $outputstring);

flock($fp, 3); // Снимаем блокировку файла
fclose($fp); // закрываем файл

Двумерные файлы удобны и просты в работе, но до тех пор, пока информации не становится слишком много, а время доступа к ней – слишком большим. Тогда возникают проблемы, которые в общем виде могут быть сформулированы следующим образом.

  1. При заполнении файла строками, численность которых превышает тысячу, работа с ними существенно замедляется.
  2. Поиск конкретной записи или группы записей в двумерном файле затруднен. Если необходимо найти информацию по определенному шаблону, придется прочесть и проверить каждую из записей по отдельности.
  3. В реализации блокировок могут возникнуть состояния состязаний при одновременном доступе многих клиентов к одному файлу. Эта же ситуация приведет и к образованию «узкого места», когда группе пользователей необходимо будет ожидать момента разблокировки файла для размещения своих заказов.
  4. Работа с файлами носит последовательный характер, при котором обработка начинается с самого начала и выполняется до конца файла. При необходимости вставить данные в середину файла или удалить их оттуда придется считывать весь файл, изменять его, а затем переписывать его заново. При больших размерах файлов процесс может существенно затянуться.
  5. Сложности в решении вопроса об уровнях доступа к информации. Такие разрешения регламентируются только правами доступа к файлам.

Системы управления реляционными базами данных (СУРБД) успешно справляются со всеми перечисленными проблемами.

Концепции реляционных баз данных

РБД построены на основе отношений, называемых таблицами. Рассмотрим в качестве примера таблицу «Пользователи» гипотетического универмага:

Идентификатор клиентаФИОАдресГород
1Иванов ИванГагарина, 25Краснодар
2Семенов СергейЛенина, 41Свердловск
3Федоров АнатолийЗвездный бульвар, 27Москва

Приведенная выше таблица содержит имена и адреса клиентов. Она имеет свое имя «Пользователи» и несколько столбцов, каждый из которых содержит определенные сведения о клиентах. В свою очередь, каждый столбец также имеет имя и содержит уникальные данные определенного типа. В данном случае, первый столбец содержит целочисленную информацию, остальные – строковые данные. Столбцы имеют синонимы, известные как поля или атрибуты.

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

Если клиенты будут иметь одинаковые имена и фамилии, их будет трудно различать. Конечно, при этом могут различаться города, где эти клиенты находятся, но тогда идентификационная информация становится слишком объемной для поиска. Поэтому каждому клиенту необходим уникальный идентификатор – ключ, искусственное присвоение которого гарантирует уникальность записи. Таким идентификатором в примере выступает порядковый номер клиента – столбец с названием «Идентификатор клиента». Такой ключ будет первичным. БД обычно состоят из нескольких таблиц, для которых первичный ключ является связующим звеном.

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

Можно сформулировать несколько рекомендаций для проектирования собственной БД для веб-проекта.

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

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

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

  1. Web-браузер пользователя оправляет HTTP-запрос на определенную страницу веб-сервера.
  2. Web-сервер принимает этот запрос и передает его сценарию PHP на обработку.
  3. Из сценария в процессе обработки запроса выполняется подключение к БД с целью извлечения оттуда нужной информации.
  4. Сервер БД принимает запрос для БД, обрабатывает его и отправляет результаты обратно, сценарию PHP.
  5. Сценарий PHP завершает свою работу, форматирует вывод в виде HTML и отправляет его клиенту в Web-браузер.
  6. Клиент просматривает ответ сервера у себя в браузере и, при необходимости, формирует новый запрос.

Часто Web-сервер, механизм PHP и сервер БД работают на одном компьютере, но могут разноситься и на разные аппаратные компоненты из соображений безопасности и увеличения пропускной способности или эффективного распределения нагрузки.

По мере усложнения проекта, сценарную часть PHP обычно разделяют на уровни. Такими уровнями могут быть уровень работы в БД, код, взаимодействующий с MySQL, уровень реализации бизнес-логики, просчитывающий основную задачу, и представительский уровень, реализующий форматированный в HTML вывод ответа на запрос клиента.

Использование MySQL для веб

Для использования MySQL с Web-сервером, он должен быть установлен и настроен определенным образом. Это включает в себя инсталляцию необходимых файлов, настройку профиля пользователя MySQL, настройку требуемых путей, по необходимости запуск команды mysql_install_db, установку пароля для пользователя администратора (root) СУРБД MySQL, удаление анонимного пользователя и тестирование БД, запуск сервера и настройка его на автоматический запуск в дальнейшем. Обращение к MySQL будет происходить через MySQL-монитор. Ввод всех команд в нем должен завершаться символом «;», который сообщает СУРБД о том, что команду можно исполнить. Пропуск этого символа позволяет разбить команды на несколько строк, ввести их как в файле, а затем выполнить все разом. При этом очередное приглашение на ввод со стороны MySQL будет выглядеть как символ > и, пока не будет введена точка с запятой, команды обработаны не будут. SQL-операторы не чувствительны к регистру, а имена таблиц – чувствительны. Для входа в систему MySQL надо перейти в командную строку (подразумевается работа в UNIX-подобной системе) и ввести:

	$ mysql –h hostname –u username –p

при этом запускается монитор MySQL, являющийся клиентом командной строки (именно поэтому во многих системах устанавливается отдельным компонентом пакет mysql-client), который соединяется с сервером MySQL. Ключ –h применяется для указания имени хоста, к которому надо подключиться, или его ip-адреса. Ключ –u по аналогии используется для ввода имени пользователя, а –p для ввода пароля. После удачного входа на экране появится приглашение на ввод команд вида mysql>

Для создания базы данных необходимо использовать команду: mysql> create database dbname; dbname – подразумевает имя требуемой базы. После создания базы данных обычно переходят к настройке пользователей и системы полномочий. Учетная запись root для MySQL должна использоваться только для системных задач. Пароли желательно задавать для всех пользователей СУБД. Кроме того, рекомендуется создавать хотя бы по одной учетной записи для каждого Web-приложения. Эти мероприятия обеспечивают правильное применение системы полномочий, которую поддерживает MySQL. Под полномочием понимается право определенного пользователя выполнять определенные задачи над каким-либо объектом. Свод этих понятий близок по духу к системе прав доступа на уровне файлов. При создании пользователя ему назначаются определенные полномочия, которые определяют его статус в рамках MySQL и возможность совершать те или иные действия. При этом придерживаются принципа «минимальных полномочий», который, в общем, используется для улучшения защиты любой компьютерной системы. Он выражается в том, что каждый процесс должен обладать минимальными возможностями для решения конкретной задачи. Это справедливо не только для MySQL, но и для любой системы в целом.

При настройке прав пользователей применяют команды GRANT и REVOKE. Эти команды определяют предоставление и лишение прав пользователей на четырех уровнях:

  • глобальном;
  • баз данных;
  • таблиц;
  • столбцов,

причем команда GRANT одновременно создает пользователя и наделяет его правами.

Например, команда mysql> grant all on * to alex identified by ‘12345’ with grant option; предоставит пользователю alex с паролем 12345 все полномочия для всех баз данных с правом их передачи другим пользователям.

Команда mysql> revoke all on * from alex; лишит всех предоставленных полномочий пользователя alex, т.е. REVOKE работает, как и GRANT, только реверсивно.

Для подключения PHP-сценариев к MySQL и выполнения ими своей работы им должны быть предоставлены соответствующие полномочия. Они должны, как правило, позволять совершать ряд операций над строками. Под этими операциями подразумевается вставка данных, их выборка, удаление и обновление, что эквивалентно командам SELECT, INSERT, DELETE и UPDATE. При этом если скрипты будут подсоединяться к БД mydb от лица пользователя alex с паролем 12345, то настройка этого пользователя будет выглядеть так:

mysql > grant select, insert, delete, update on my_db.* to alex identified by ‘12345’;

Переход к той базе данных, которая нужна для работы, осуществляется по команде: >mysql use my_db; если этого не сделать, но дать команду для БД, монитор выведет ошибку.

Для создания таблицы в выбранной БД используется команда:

mysql> CREATE TABLE table_name(columns); например:
mysql> CREATE TABLE table_name
	(customid int unsigned not null auto_increment primary key,
	name char(50) not null,
	address char(100) not null,
	city char(30) not null
	);

Данная команда создаст таблицу из четырех столбцов. Первый будет идентификатором пользователей и первичным ключом таблицы. Все столбцы, для которых указан auto_increment, должны быть проиндексированы. Это используется только для чистых столбцов. NOT NULL – означает не нулевой атрибут для столбцов.

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

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

Просмотреть созданную БД можно по команде mysql> show databases;, а таблицы в выбранной БД – по команде mysql> show tables; .

По команде mysql> describe table_name; можно просмотреть расширенную информацию по конкретной таблице, т.е. ту, которую задали при ее создании, с учетом типа данных и других параметров.

Всего в MySQL есть пять видов идентификаторов – это базы данных, таблицы, столбцы, индексы и псевдонимы. Базы данных отображаются на каталоги, лежащие в их основе, а таблицы – на файлы. Это отображение напрямую влияет на присваиваемые им имена и на зависимость имен от регистра. Если в операционной системе имена файлов зависят от регистра, то будут зависеть и имена таблиц. Расположение каталогов и файлов, содержащих данные, будет таким, каким они установлены в конфигурации, проверить которую можно по команде: $mysqladmin variables, в выводе которой надо посмотреть на переменную datadir, содержащую нужную информацию.

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

	 create database `create database`;

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

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

В строковых типах есть подразделение на три подтипа. Это простые строки – фрагменты текста, подтипы TEXT и BLOB, а также SET и ENUM.

Выводы

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


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=501941
ArticleTitle=Программирование с использованием PHP и MySQL в разработке Web-приложений: Часть 2. MySQL – основы применения при построении Web-сайтов
publish-date=07222010