В этой статье описывается MySQL, эффективный инструмент для разработки сайтов электронной коммерции и других сложных динамических веб-сайтов с использованием сторонних баз данных. MySQL — это быстрый, многопоточный и полнофункциональный SQL-сервер. Помимо описания базовой архитектуры системы MySQL, в этой статье также представлены простые примеры, написанные на Tcl и C++, которые помогут вам разрабатывать веб-приложения, поддерживаемые базой данных. В этой статье описывается MySQL, эффективный инструмент для разработки сайтов электронной коммерции и других сложных динамических веб-сайтов с использованием сторонних баз данных. MySQL — это быстрый, многопоточный и полнофункциональный SQL-сервер. Помимо описания базовой архитектуры системы MySQL, в этой статье также представлены простые примеры, написанные на Tcl и C++, которые помогут вам разрабатывать веб-приложения, поддерживаемые базой данных.
Приложение, которому необходимо хранить или получать доступ к большим объемам информации, может получить большую выгоду от использования стороннего продукта базы данных. Это особенно актуально, когда доступ к информации должен осуществляться в нескольких экземплярах программы. Хорошим примером этого являются веб-приложения (включая электронную торговлю).
Зачем использовать автономную базу данных?
Веб-серверы должны иметь возможность для своих сценариев обработки хранить информацию об их состоянии для последующего доступа. Хотя можно использовать и более примитивные методы — например, сохранение в текстовый файл или разработку самодельной мини-базы данных — только полноценное приложение базы данных может предоставить все сервисы, необходимые более сложному веб-приложению. Написание собственного ядра базы данных для конкретного приложения не принесет особой пользы, поскольку для этой цели существует несколько свободно доступных пакетов программного обеспечения. Кроме того, использование сторонней базы данных также избавляет веб-разработчиков от необходимости заниматься разработкой и обслуживанием базы данных.
База данных MySQL
Интеграция баз данных в приложения Linux может быть довольно простой благодаря использованию языков сценариев и компилируемых системных языков, таких как C. Свободно доступная база данных MySQL (распространяемая под лицензией GNU Public License) предоставляет сложный набор функций SQL и легко интегрируется в приложения. MySQL работает быстро, многопоточно и поддерживает стандарты SQL ANSI и ODBC. Вместе со сторонним программным обеспечением MySQL поддерживает транзакционно-безопасные таблицы для приложений обработки транзакций.
Примечание. Что такое обработка транзакций?
Транзакция — это серия изменений в базе данных, которые необходимо выполнить атомарно. Либо все они должны быть выполнены, либо ни один из них не должен быть выполнен. Например, все необходимые изменения в базе данных при продаже товара через Интернет образуют одну транзакцию.
Базе данных необходимо вычесть как баланс счета клиента, так и запасы продуктов, иначе произойдет сбой и ни одна операция не будет выполнена.
Сбой сервера по какой-либо причине не должен приводить к частичному выполнению транзакций. Например, завышение счетов, непоставка продуктов или неточные данные о запасах могут быть результатом частично завершенных транзакций.
База данных, поддерживающая обработку транзакций, может инкапсулировать в транзакцию набор кода базы данных. Любой сбой во время выполнения транзакции приведет к откату базы данных к состоянию до ее запуска.
Это достигается за счет ведения журнала всех операций с базой данных, а также копии ее исходной таблицы состояний, что позволяет выполнять операции отката при следующем перезапуске сервера после сбоя. Эти затраты времени и пространства являются компромиссом, необходимым для транзакционно-безопасной системы баз данных.
Один сервер MySQL управляет рядом баз данных, доступ к которым осуществляется через сервер одинаковым образом. Каждая база данных на самом деле представляет собой набор любого количества таблиц, по своей концепции аналогичных пользователям других баз данных SQL. Каждая таблица состоит из столбцов типизированных данных. Данные могут быть целыми числами, вещественными значениями, строками или другими типами, включая необработанные двоичные потоки. Каждая строка таблицы представляет собой запись, хранящуюся в базе данных.
MySQL спроектирован и структурирован как клиент/сервер. Сервер mysqld может работать на любой машине, к которой есть доступ из Интернета (предпочтительно на той же машине, что и веб-сервер, или как можно ближе, чтобы обеспечить разумное время отклика). Клиент MySQL использует запросы на связь с сервером MySQL для изменения или запроса базы данных, принадлежащей серверу. В веб-приложении с поддержкой базы данных клиентом базы данных является веб-сервер или сценарий CGI, созданный веб-сервером. Эти клиенты могут быть написаны на языке сценариев высокого уровня или системном языке низкого уровня, если для этого языка существует API базы данных. В Linux большинство языков сценариев реализованы на языке C, и, поскольку API MySQL C существует, должно быть легко добавить поддержку MySQL к любому существующему языку сценариев или инструменту. Большинство скриптовых языков уже выполнили этот шаг.
MySQL API
MySQL API доступен на различных языках, включая почти все языки, которые фактически используются для написания серверной части веб-сайтов. Используя эти API, мы можем создать клиент MySQL, управляемый веб-сервером.
API (для доступа к базе данных) работает в режиме соединения. Первое, что должен сделать клиент, — это открыть соединение с сервером MySQL. Это включает в себя соответствующую аутентификацию соединения с использованием имени пользователя и пароля, известных серверу. После установления соединения сервер выбирает конкретную базу данных для использования. После определения инициализации клиентское приложение (в нашем случае серверный CGI-скрипт) может свободно взаимодействовать с базой данных одним из двух способов: оно может выполнять обычные команды SQL, включая добавление и удаление таблиц, а также добавлять записи в их вы также можете запускать запросы к базе данных, которая возвращает результаты; Запрос генерирует набор записей, соответствующих запросу, и клиент может затем обращаться к записям по одной, пока все записи не будут просмотрены, или пока клиент не отменит ожидающее получение записи. После завершения работы скрипта с базой данных соединение с сервером закрывается.
Чтобы создать веб-сайт, интегрирующий доступ к базе данных, вам необходимо написать сценарии CGI для генерации динамических результатов на основе состояния базы данных. Веб-серверы запускают сценарии CGI, а затем выводят HTML в соответствующем формате в свой стандартный поток вывода. Веб-сервер захватывает HTML-код и отправляет его обратно клиенту, как если бы запрос был на статическую HTML-страницу. В процессе генерации HTML сценарии могут изменять базу данных или запрашивать и включать результаты в свои выходные данные.
В качестве примера, кратко поясняющего описанный выше процесс, следующий код (написанный на C и Tcl) запрашивает базу данных, содержащую список продуктов, выставленных на продажу компанией. Это ни в коем случае не использует все возможности MySQL API на обоих языках, но предоставляет быстрый и легко расширяемый пример, который может выполнять любую команду SQL над содержимым базы данных. В этом примере скрипт отображает все товары по цене ниже определенной. На практике пользователь может ввести цену в веб-браузер, а затем отправить ее на сервер. Мы опустили подробности чтения переменных среды для определения значений формы HTML, поскольку это ничем не отличается от выполнения в сценарии CGI, который не поддерживает базу данных. Для ясности мы предполагаем, что определенные параметры (например, запрашиваемая цена) установлены заранее.
Следующий код реализован в Tcl с использованием свободно доступного общего интерфейса базы данных Tcl. Преимущество такого интерфейса в том, что Tcl интерпретируется и позволяет быстро разрабатывать и модифицировать код.
Пример TCL
#Этот код распечатывает все продукты в базе данных
# которые ниже указанной цены (предполагается, что она была определена)
# заранее и сохраняется в переменной targetPrice)
# Вывод осуществляется в формате таблицы HTML, подходящем для вывода CGI.
#загружаем библиотеку общих объектов SQL, также может интерпретатор Tcl.
#были скомпилированы с библиотекой, поэтому эта строка не нужна
загрузить /home/aroetter/tcl-sql/sql.so
#они четко определены заранее, иначе они могли бы
#передаваться в скрипт
установите DBNAME «clientWebSite»;
установите TBLNAME «продукты»;
установите DBHOST «backend.company.com»
setDBUSER "mysqluser"
установите DBPASSWD «abigsecret»
установить целевую цену 200;
#подключаемся к базе данных
установить дескриптор [sql Connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# получить тестовую базу данных
#запускаем запрос, используя указанный код sql
sql-запрос $handle "выбрать * из $TBLNAME, где цена <= $targetPrice"
#распечатать заголовок таблицы html
помещает "<граница таблицы=4>"
помещает «<th>Идентификатор продукта <th width=200>Описание <th>Цена ($)»
#output table row — каждая выборка извлекает один результат
#из sql-запроса
while {[set row [sql fetchrow $handle]] != ""} {
установить prodid [lindex $row 0]
установить описание [lindex $row 1]
установить цену [lindex $row 2]
помещает "<tr><td>$prodid <td align=center>$descript <td>$price"
}
помещает "</table>"
#очистить буфер результатов запроса — в этом случае он уже должен быть пустым
SQL-запрос $handle
#закрываем соединение с БД — на практике это то же самое соединение
#используется для нескольких запросов
SQL отключить $handle
Код ниже представляет собой эквивалентный сценарий, написанный на C++ с использованием официального API MySQL C++ MySQL++. Преимущество этой версии в том, что она компилируется и, следовательно, быстрее, чем интерпретируемые языки. Код базы данных, часто используемый на конкретном сайте, должен быть написан на C или C++, а затем доступен с помощью сценариев или непосредственно с веб-сервера, чтобы улучшить общее время выполнения.
пример С++
#включать
#включать
#включать
const char *DBNAME = "clientWebSite";
const char *DBTABLE = "продукты";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
интервал основной() {
пытаться {
//открываем соединение с базой данных и делаем запрос
Соединение con(DBNAME, DBHOST, DBUSER, DBPASSWD);
Запрос запроса = con.query();
//записываем действительный код sql в объект запроса
запрос << "выбрать * из" << DBTABLE;
//запускаем запрос и сохраняем результаты
Результат res = query.store();
//записываем заголовок html-таблицы
cout << "<граница таблицы=4>n";
cout << "<th>Идентификатор продукта <th width=200>Описание"
<< "<th>Цена ($)" << endl;
Результат::итератор curResult;
Рядовой ряд;
//перебираем каждый результат и помещаем его в html-таблицу
for (curResult = res.begin(); curResult != res.end(); curResult++) {
строка = *curResult;
cout << "<tr><td align=center>" << row[0]
<< "<td>" << строка[1]
<< "<td>" << row[2] << endl;
}
cout << "</table>" << endl;
} catch (BadQuery э-э) {
// обрабатываем неправильный запрос (обычно вызванный синтаксической ошибкой sql)
cerr << "Ошибка: " << er.error << endl;
вернуть -1;
} поймать (BadConversioner) {
//также обрабатываем ошибки преобразования из базы данных
cerr << "Ошибка: невозможно преобразовать "" << er.data << "" в ""
<< имя_эр.типа << ""." << endl;
вернуть -1;
}
вернуть 0;
}
безопасность
Создание веб-приложений в Интернете имеет некоторые проблемы, которые необходимо учитывать разработчикам. Все вопросы, связанные с программами CGI на веб-сервере, такие как разрешения на обработку веб-сервера и проверки ввода на стороне сценария, все равно необходимо учитывать.
Кроме того, также необходимо поддерживать безопасность системы баз данных. Это включает в себя защиту системы разрешений сервера базы данных и обеспечение безопасности соединений клиентов базы данных с сервером.
MySQL предоставляет глубокую систему безопасности, которую некоторые называют «продвинутой, но не стандартной». MySQL разрешает доступ клиентов на основе имени пользователя, хоста клиента и базы данных. Чтобы создать безопасную систему, попросите всех пользователей использовать надежные пароли и не давайте им доступа, в котором они не нуждаются. Сюда входят, казалось бы, безобидные привилегии, такие как привилегии управления, которые позволяют пользователю просматривать все запущенные процессы, включая те, которые меняют пароли других пользователей. Лучший подход — запустить сам серверный процесс от имени непривилегированного пользователя Unix, чтобы в случае компрометации одной базы данных это не привело к сбою всей системы. Это похоже на запуск httpd от имени пользователя none вместо root. Таблицы, описывающие доступ к системе, хранятся в виде отдельных баз данных MySQL и могут обновляться пользователем root MySQL. Обратите внимание, что сервер MySQL предоставляет привилегии на основе имен пользователей MySQL, которые отличаются от имен пользователей Unix. Однако существует имя пользователя root MySQL, которое имеет полные права доступа к базе данных. Как только сервер определяет, кто подключающиеся клиенты и к чему они пытаются подключиться, доступ контролируется на основе заданного набора разрешений. Чтобы предотвратить подделку DNS имен хостов в таблице доступа, вы можете ввести IP-адреса всех хостов или попросить сервер преобразовать IP-адреса обратно в исходные имена хостов, чтобы другим было сложнее перехватывать DNS-запросы и ответы. .
Помимо таблиц доступа к серверу, связь с сервером также должна быть безопасной. При входе на сервер с клиента пароль не отправляется в виде обычного текста, однако все последующие команды SQL будут отправляться в виде обычного текста; Для большей безопасности используйте ssh для настройки переадресации портов. Он шифрует весь обмен данными между сервером и клиентом, не позволяя никому наблюдать за его передачей. Данные от клиента отправляются в порт на локальном компьютере клиента, который прослушивает локальный ssh-сервер. Он используется локальным ssh-сервером, шифруется и отправляется на удаленный ssh-сервер, который расшифровывает его и пересылает на порт сервера MySQL.
На практике самый безопасный подход — запустить сервер базы данных на той же машине, что и веб-сервер, и позволить сценариям CGI, сгенерированным веб-сервером, взаимодействовать с сервером MySQL через UNIX (собственные) сокеты. Этот параметр позволяет администратору базы данных отключить все удаленные подключения к серверу MySQL. Если веб-серверы и серверы баз данных должны находиться на разных машинах, зашифруйте все соединения между ними или соедините две машины через отдельные выделенные физически изолированные сети. Создайте только одну учетную запись пользователя (кроме пользователя root), используемую веб-сервером для входа на сервер базы данных.
Веб-сайты, управляемые базой данных, — это мощные инструменты, которые позволяют разработчикам создавать динамические сайты, предоставляющие обновленную информацию и позволяющие изменениям, инициированным клиентом, сохраняться в течение нескольких сеансов. Использование серверных баз данных имеет важное значение для управления пользователями электронной коммерции и других приложений. Используя бесплатно доступное программное обеспечение, можно создать сайт, управляемый базой данных, который надежно интегрирует подключение к базе данных в существующую CGI-архитектуру сайта.