Как использовать ODBC с PHP

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

Как настроить и использовать метод универсального подключения к базам данных (Open Database Connectivity) в сочетании с языком Web-разработки PHP. Это вводная статья о технологиях, необходимых для создания открытых, надежных и стандартизированных Web-приложений, а именно - PHP, ODBC и SQL.

Дж. Даниэль Льюис, Web-разработчик и специалист по информатике, Sift Media

Даниэль ЛьюисДаниэль Льюис профессионально занимается информатикой, веб-разработкой и базами знаний в британской компании Sift Media. Он работал также в таких компаниях, как OpenLink Software, над решением задач по распространению технических знаний и в Открытом университете ― в области социально-семантических Web-приложений. Предпочитает языки программирования Java, Ruby и PHP, имеет опыт научной работы с MATLAB, Scilab и Octave. Контактный адрес: daniel@vanirsystems.com



28.09.2011

PHP ― один из наиболее часто используемых языков программирования для разработки динамических Web-сайтов. Это мощный и эффективный инструмент. К тому же он достаточно прост и очень хорош для начинающих ввиду своей гибкости.

PHP ― хороший язык и сам по себе (особенно в сочетании с XHTML). Однако для большинства приложений необходим удобный метод хранения данных, как правило, с помощью базы данных, например MySQL или PostgreSQL. Для подключения PHP к системам хранения данных требуется коннектор, позволяющий выполнять такие функции, как mysql_query () и pg_query (). В большинстве случаев этого достаточно, но иногда нужно, чтобы данные хранились в чем-то вроде электронной таблицы, с которой легко работать индивидуально. В таких ситуациях для связи с данными требуется другой коннектор.

А что делать, если нужно, чтобы команды SQL работали не с системой управления базами данных, а с любым специально настроенным хранилищем данных? Для этого и создан Open Database Connectivity (ODBC), и при правильной установке коннекторов можно получить доступ даже к Microsoft® Excel®, CSV и другим файлам данных. ODBC представляет собой коннектор, который делает PHP-разработку "не зависящей от коннектора базы данных". Он применяет такие функции, как odbc_query (), к таким базам данных, как MySQL, PostgreSQL, SQLite, Microsoft SQL Server®, IBM® DB2®, Sybase, OpenLink Virtuoso, FileMaker и Microsoft® Office®. Его можно применять и к CSV-файлам и таблицам Excel - в зависимости от настройки драйвера ODBC.

ODBC: что это такое?

ODBC – это система программных драйверов, использующихся для связи языков программирования с хранилищами данных. Это свободно распространяемая система с открытым исходным кодом, которая создана в 1992 году в попытке стандартизировать способы связи, такие как функции и настройки, между языками программирования и языками запросов к базам данных (стандартизация SQL).

ODBC работает как двойной интерфейс или коннектор: во-первых, как интерфейс от системы языка программирования к ODBC-системе, и во-вторых, как интерфейс от ODBC-системы к системе хранения данных. Таким образом, для ODBC требуется драйвер "язык программирования – ODBC" (например, библиотека PHP-ODBC ) и драйвер "ODBC – система хранения данных" (например, библиотека MySQL-ODBC). Это в дополнение к самой ODBC-системе, которая управляет конфигурациями источников данных и позволяет менять источники данных и языки программирования.


Как сопрягаются PHP и SQL?

PHP - это язык программирования, как правило, используемый в качестве серверного языка для динамических Web-сайтов. Это гибкий, динамичный и слабо типизированный язык. Он должен показаться знакомым многим разработчикам, поскольку создавался под влиянием языка программирования С. PHP, свободно распространяемый и открытый язык программирования, который появился в 1995 году, можно использовать с базами данных через коннектор для генерации XHTML и HTML в Web-браузере.

SQL представляет собой кросс-платформенный язык для обращения к хранилищам данных. Он используется главным образом для работы с реляционными базами данных, но имеет процедурные, объектно-ориентированные и объектно-реляционные расширения. Современные реализации SQL можно найти в MySQL, PostgreSQL, SQLite, DB2 (как коммерческих, так и Express-C редакциях), Microsoft SQL Server, OpenLink Virtuoso, FileMaker и Microsoft Access - все они могут подключаться для использования с языками программирования типа PHP через систему связи (ODBC).


Настройка ODBC

Давайте посмотрим, как типичную среду Linux-Apache-PHP-MySQL (LAMP) можно преобразовать в гибкую среду Linux-Apache-PHP-ODBC (LAPO). Существуют два основных варианта ODBC-драйверов для Linux®: iODBC и unixODBC. Оба набора драйверов имеют свои плюсы и минусы, и оба работают с PHP, но с разными наборами баз данных. Я предпочитаю iODBC за его традиционно сильную связь с такими языками Web-программирования, как PHP и Ruby, а также стабильность при работе с ODBC-совместимыми базами данных, такими как MySQL и OpenLink Virtuoso. Тем не менее, это всего лишь вопрос выбора, и вы можете оценивать их исходя из собственных требований эффективности. Не считая тонких внутренних различий, iODBC и UnixODBC работают одинаково и с точки зрения связи с языком программирования – PHP-функции идентичны, - и с базой данных (например, на MySQL это никак не повлияет).

И iODBC, и UnixODBC есть в Linux Software Package Managers. Например, в командной строке Debian, Ubuntu или Linux Mint нужно выполнить команду sudo apt-get install iodbc.

ODBC в других системах

Apple Mac OS X поставляется с предустановленным iODBC, так что ничего устанавливать не нужно. ОС Windows® также поставляются с собственным драйвером ODBC.

Соединение базы данных с ODBC

Если вы еще не сделали этого, установите СУБД, такую как MySQL или PostgreSQL. Затем установите коннектор "ODBC-база данных". Он будет разным для разных баз данных, но для MySQL, например, коннектор устанавливается путем установки с Web-сайта MySQL драйвера, соответствующего операционной системе.

В дистрибутивах Linux, поддерживающих apt, можно запустить с консоли следующую команду: sudo apt-get install libmyodbc.

Нужно будет настроить ODBC-клиент для работы с установленной базой данных, запустив такую программу, как iodbcadm-gtk. Файл iODBC можно отредактировать и вручную. (В Linux этот файл часто находится в каталоге /etc/iodbc.ini.)

Пример: соединение PHP с ODBC

Теперь нужно установить драйвер PHP ODBC. Это можно сделать, добавив iODBC или unixODBC в сценарий компиляции PHP (очень сложно) или путем установки библиотеки PHP-ODBC. В дистрибутиве на базе apt можно использовать следующую команду: sudo apt-get install php5-odbc.

Выполните проверку, запустив PHP в интерактивном режиме (php -а). Это открывает интерактивную консоль PHP, из которой можно установить связь, как в примере, приведенном в листинге 1.

Листинг 1. ODBC-соединение из командной строки
php > $conn = odbc_connect(
  "DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=phpodbcdb", 
  "username", "password");
php > $sql = "SELECT 1 as test";
php > $rs = odbc_exec($conn,$sql);
php > odbc_fetch_row($rs);
php > echo "\nTest\n—--\n” . odbc_result($rs,"test") . “\n";

Test
----
1
php > odbc_close($conn);
php > exit;

Проанализируем код из листинга 1.

  1. Установка соединения с использованием функции odbc_connect () в PHP. В качестве параметров эта функция принимает строку коннектора ODBC, имя пользователя и пароль. Строка коннектора сопоставляется с файлом odbc.ini, так что заранее убедитесь, что они совпадают.
  2. Создание экземпляра переменной для строки, соответствующей оператору SQL.
  3. Выполнение SQL с использованием функции odbc_exec, которая принимает соединение и строку SQL, возвращая результирующий набор.
  4. Выборка только одной строки из этого результирующего набора с использованием функции odbc_fetch_row(), которая принимает результирующий набор в качестве параметра. Это итерационная функция, то есть при следующем обращении к ней вы получите следующий результат из набора (до окончания результатов в наборе, после чего она выдаст значение false).
  5. Использование функции odbc_result (), которая принимает результирующий набор и имя столбца (в виде строки) и возвращает значение ячейки в строке, на которую указывает итератор строк.
  6. Закрытие ODBC-соединения с использованием функции odbc_close, которая принимает само соединение.
  7. Выход из интерактивного режима PHP по команде exit.

Все это хорошо, но для решения масштаба Web-приложений этого мало. Чтобы проверить метод на Web-приложении клиент/сервер, необходимо установить Web-сервер, такой как Apache или Lighttpd. (При работе с Linux установите PHP-модуль для своего Web-сервиса, иначе PHP работать не будет).

В листинге 2 показан тот же подход, реализованный через Web-сервер. Код PHP подобен тому, что приведен в листинге 1, но экспорт результатов выполняется через XHTML, а не из командной строки.

Листинг 2. Пример ODBC-соединения на основе XHTML

В этом листинге есть дополнение, которого не было в листинге 1: теперь в полной мере используются преимущества итерационной функции odbc_fetch_row (), так как она помещена в цикл while. Это означает, что если SQL немного сложнее и обращается к таблице за несколькими результатами, то в таблице XHTML будет создана новая строка.

Существует много разновидностей XHTML и HTML с различной степенью удобства и поддержки браузеров. Листинг 2 генерирует стандартизированный XHTML 1.0 Strict, одну из лучших форм XHTML для разработки документов, ориентированных на данные и не зависящих от браузера.


Программирование PHP-ODBC

Существуют четыре основных типа ODBC-функций: функции соединения, запроса, выборки данных и сообщения об ошибках. Функции запроса выполняют стандартные операции базы данных по созданию, чтению, редактированию и удалению данных (т.н. операции CRUD).

Функции связи

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

Мы уже видели, что odbc_connect () принимает ODBC-совместимую строку установления связи, имя пользователя базы данных и пароль. В ответ она возвращает объект соединения, который можно использовать по всей PHP-программе. Следующий код демонстрирует пример:

$connection = odbc_connect($connection_string, $username, $password);

В предыдущем примере мы уже видели также, что функция odbc_close () принимает объект соединения и завершает связь с ODBC и базой данных. Обязательно закрывайте свои соединения, в противном случае их станет слишком много, и придется перезапускать систему управления базами данных - или еще хуже, всю систему. Вот как это работает: odbc_close($connection);.

Функции запроса

Мы уже использовали функцию odbc_exec (); она принимает объект соединения и строку SQL и возвращает объект результирующего набора. Объект результирующего набора ― это сложный зверь, так как обычно он находится в памяти СУБД и может быть расшифрован только теми функциями, которые с ним взаимодействуют. Строка odbc_exec () выглядит примерно так: $resultset = odbc_exec($connection, $sql);.

Функции odbc_prepare() и odbc_execute невероятно полезны для инъекции в SQL неизвестных переменных. Функция odbc_prepare () подготавливает SQL-оператор и СУБД, а затем odbc_execute () присылает переменные. Это мощнее, безопаснее и эффективнее, чем простое создание объединенной строки SQL в PHP и ее отправка посредством функции odbc_exec(). Вместе они выглядят примерно так:

$resultset = odbc_prepare($connection, $sql);
$success = odbc_execute($resultset, $variables);

В листинге 3 приведен хороший пример для поиска людей в таблице пользователей по адресу и дате рождения. Обратите внимание на вопросительный знак (?) в строке SQL, которой означает что переменные определены в последовательном массиве функции odbc_execute().

Листинг 3. Инъекция SQL-переменной с командами подготовки и исполнения
$location = "London";
$mindateofbirth = time() - 567648000; /* i.e. 18 years ago from now */
$resultset = odbc_prepare(
        $connection,
        "SELECT * FROM user WHERE location = ? AND dateofbirth <= ?"
      );
$success = odbc_execute($resultset, array($location, $mindateofbirth));

Функции приема

Функция odbc_fetch_row() принимает результирующий набор из запроса и сдвигает указатель итератора в следующую строку. Эта функция часто используется в сочетании с функцией odbc_result () для приема различных ячеек:

odbc_fetch_row($resultset);

В предыдущих примерах odbc_result() принимала $resultset и строку с именем столбца и возвращала значение ячейки. Это используется в сочетании с функцией odbc_fetch_row(), чтобы указать конкретную строку в результирующем наборе:

$value = odbc_result($resultset,"columnname");

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

$rowarray = odbc_fetch_array($resultset);

Как и odbc_fetch_array(), функция odbc_fetch_object () выбирает объектно-ориентированную структуру, соответствующую строке. Она помещает имена столбцов в качестве свойств объекта и значения ячеек в качестве значений свойства:

$rowobject = odbc_fetch_object($resultset);

Эта функция полезна для распечатки набора результатов в формате HTML. Это простая визуализация результатов, но она может быть полезна при создании прототипов или отладке:

odbc_result_all($resultset);

Довольно удобная функция odbc_num_fields() просто берет набор результатов и указывает количество строк в этом наборе:

$numberofrows = odbc_num_rows($resultset);

Решение проблем и отладка

Две удобные функции PHP ODBC - odbc_error(), которая возвращает код ошибки, если произошла ошибка, или значение false, если ошибки нет, и odbc_errormsg(), которая возвращает сообщения для пользователя – можно объединить в простую последовательность выдачи сообщений об ошибках:

if (odbc_error()) {
	echo "I've found a problem: " . odbc_errormsg($conn);
}

Еще один совет: если вы получаете ошибки в процессе разработки, никогда не стесняйтесь добавлять печатные сообщения рядом с проблемными строками – конечно, при условии, что вы удалите эти "отладочные строки", когда будете демонстрировать свою программу. Вот PHP-функция, которая часто выручает:

print_r($variable);

Эта простая функция принимает любую переменную и отображает ее на экране. Переменная может быть как простым целым числом или строкой, так и сложным многомерным массивом или объектом.


Универсальная связь

Рассмотрим построение Web-приложений, которые можно развернуть в любом месте (примерами могут служить Drupal, Wordpress или Joomla). Часто они строятся с использованием одной базы данных (например, MySQL) с ее специфическими функциями (например, mysql_connect ()), а затем тщательно перерабатываются для другой базы данных (например, PostgreSQL) с другими функциями (например, pg_connect ()). При использовании ODBC это лишнее, так как для перенастройки достаточно инициализации приложения, и функции ODBC индифферентны к системе базы данных.

Следует помнить, однако, что хотя все системы управления базами данных поддерживают стандартизованный SQL, иногда они содержат также собственные расширения. Вот почему преобразовать существующее приложение PHP-MySQL, PHP-PostgreSQL или PHP-MS-SQL в приложение PHP-ODBC не так просто. Поэтому, создавая новое приложение, нужно строго придерживаться стандартизированного SQL (или самых распространенных расширений SQL).

Как уже говорилось, ODBC можно использовать и для подключения к электронной таблице. Как и в случае баз данных, это делается с помощью коннектора. Их много – как с открытым исходным кодом, так и фирменных. Примером может служить Microsoft Office для Windows, который содержит ODBC-коннекторы для таблиц Excel. Возможно, работать с электронными таблицами с помощью ODBC весьма неудобно, и гораздо проще, наверное, преобразовать простую электронную таблицу в таблицу базы данных. Однако когда установлено ODBC-соединение с таблицей, его можно рассматривать как соединение с базой данных – те же функции ODBC PHP, но с SQL-подобным языком и стандартными формулами электронной таблицы Excel.


Применение связанных данных и Semantic Web

Перемещение связанных данных выглядит как подключение данных через Web. Этот подход имеет много преимуществ - в первую очередь для машин, понимающих отдельные элементы данных, но также и для пользователей, например, им становится легче находить информацию. Для перемещения связанных данных используются существующие стандарты Semantic Web (такие как Resource Description Framework и Web Ontology Language) и стандартизация интернет/Web (например, HTTP и OpenID). Становится понятно, что методы подключения к связанным данным несколько напоминают ODBC в том плане, что URI подобен строке соединения, а Semantic Web Query Language (SPARQL) подобен запросам SQL через установленное соединение.

Расширяя теорию о том, что связанные данные в какой-то мере аналогичны ODBC, можно установить ODBC-соединение с подключенным хранилищем данных (таким как triple store) и отправлять запросы SPARQL через ODBC-соединение. Это случай СУБД OpenLink Virtuoso, которая допускает связь через стандартное соединение ODBC.


Лицензирование и ODBC

iODBC лицензируется по двум лицензиям open source: GNU General Public License (GPL) и Berkeley Software Development. UnixODBC также лицензируется по лицензии open source GPL. Это означает, что все, что вы разработаете с применением этих библиотек, не обязательно должно быть открытым и может быть проприетарным. ODBC-драйвер от Microsoft также может быть частью проприетарного программного обеспечения, но связан лицензионными соглашениями по программному обеспечению Microsoft Office (в случае доступа к базам данных и таблицам Excel) и SQL Server (в случае баз данных SQL Server).

Заключение

ODBC может с успехом применяться для максимально универсальной связи. Это повышает эффективность разработки и позволяет расширять приложения для работы с новыми формами данных, такими как связанные данные на базе Web. Однако у этого подхода есть свои недостатки: для достижения универсального подключения нужно тщательно выбрать способ построения SQL-запросов, так как во всех системах управления базами данных можно использовать только подмножество общедоступных команд SQL. Хотелось бы надеяться, что эта статья окажется полезной для начала работы с базами данных через ODBC с использованием языка программирования PHP.

Ресурсы

Научиться

  • Оригинал статьи (EN)
  • Раздел W3chools, посвященный SQL - полезен как учебник для начинающих и как справочник по SQL. В нем подробно описано то, что стандартизовано, а также то, что работает на той или иной системе управления базами данных. (EN)
  • Раздел W3Schools, посвященный PHP - еще один полезный ресурс для разработчиков, осваивающих PHP, а также для тех PHP-разработчиков, которым требуется справочник по языку.(EN)
  • PHP.net: все, что связано с PHP. (EN)
  • Подробная информация обо всех функциях PHP ODBC на сайте PHP.net. (EN)
  • LinkedData.org: хороший портал по связыванию открытых данных и Semantic Web. Портал W3C Semantic Web: еще один полезный ресурс.(EN)
  • Стандарты SQL Международной организации по стандартизации.

Получить продукты и технологии

  • iODBC.org: обширные сведения по установке и настройке iODBC, а также полезная информация по ODBC и коннекторам для различных СУБД и языков программирования. (EN)
  • unixODBC.org: информация по установке, настройке и драйверам коннекторов для UnixODBC.
  • MySQL.org: СУБД MySQL для разработчиков, которая с января 2010 года входит в семейство Oracle.(EN)
  • Коннектор ODBC MySQL можно загрузить прямо со страницы MySQL.(EN)
  • О драйвере ODBC Microsoft в MSDN и в файлах помощи программы ODBC Data Source Administrator. В этих двух местах можно найти сведения о работе с Access, SQL Server и Excel через ODBC. (EN)
  • PostgreSQL.org: страница СУБД PostgreSQL. (EN)
  • Проект PostgreSQL ODBC Connector: доступен в качестве бесплатного и открытого программного обеспечения. (EN)
  • OpenLink Virtuoso: "универсальный сервер". Обеспечивает Web-хостинг (в том числе с поддержкой языка PHP), базы данных, ODBC-соединения и технологию Semantic Web. OpenLink Software также отвечает за библиотеку с открытым исходным кодом iODBC, которая поставляется в версии open source и в проприетарной версии. (EN)
  • Для Web-серверов, отличных от OpenLink Virtuoso, ознакомьтесь с Apache HTTP Server и Lighttpd Server (EN)

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=762245
ArticleTitle=Как использовать ODBC с PHP
publish-date=09282011