Функции ODBC в РНР, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:
Обратите внимание: при работе с перечисленными СУБД стандартный механизм ODBC на самом деле не используется. Просто поддерживаемые в РНР общие функции ODBC применяются для взаимодействия с базами данных. Это удобно, поскольку при переходе на другую ODBC-совместимую СУБД (или СУБД из приведенного выше списка) все ваши сценарии будут нормально работать.
Поддержка ODBC встроена в комплект поставки РНР, поэтому вам за редкими исключениями практически не придется заниматься специальной настройкой.
В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в РНР приведен в документации (http://www.php.net/manual).
Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect()
. Синтаксис функции odbc_connect()
:
int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])
Параметр источник_данных
определяет ODBC-совместимую
базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя
и пароль
,
как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для
подключения к источнику данных. Необязательный параметр тип_курсора
предназначен
для устранения проблем, возникающих при работе с некоторыми драйверами ODBC.
Он может принимать одно из четырех возможных значений:
Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет ODBC не справится с обработкой того или иного запроса.
Использовать odbc_connect()
в программе несложно. Пример:
<?php odbc_connect("myAccessDB", "user", "secret") or die( "Could not connect to ODBC database"); ?>
Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect()
проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.
После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close()
:
void odbc_close ([int идентификатор_соединения])
В параметре идентификатор_соединения
передается идентификатор открытого соединения. Рассмотрим небольшой пример:
<?php $connect=odbc_connect("myAccessDB", "user", "secret") or die("Could not connect to ODBC database"); print "Currently connected to ODBC database!"; odbc_close($connect); ?>
Перед непосредственной обработкой запрос необходимо "подготовить". Задача решается функцией odbc_prepare()
:
int odbc_prepare (int идентификатор_соединения , string запрос)
В параметре идентификатор_соединения
передается идентификатор соединения, возвращаемый функцией odbc_connect()
. В параметре запрос
передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE
; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute()
(см. ниже).
Запрос, подготовленный функцией odbc_prepare()
, выполняется функцией odbc_execute()
. Синтаксис функции odbc_execute()
:
int odbc_execute (int идентификатор результата [, array параметры])
В параметре идентификатор_результата
передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare()
. Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.
Рассмотрим следующий пример:
<?php $connect = @odbc_connect("myAccessDB", "user", "secret") or die("Could not connect to ODBC database"); $query = "UPDATE customers SET cust_id = \"Milano, Inc.\" WHERE cust_id=\"2000cu\""; $result = odbc_prepare($connect, $query) or die("Couldn't prepare query!"); $result = odbc_execute($result) or die("Couldn't execute query!"); odbc_close($connect); ?>
В приведенном примере продемонстрирована транзакция ODBC, при которой данные запроса не отображаются в браузере (как это обычно делается при использовании команды SELECT
). Транзакция ODBC с использованием запроса QUERY
описана ниже, в разделе "odbc_result_all()"
.
Функция odbc_exec()
объединяет odbc_prepare()
и odbc_execute()
. Синтаксис функции odbc_exec()
:
int odbc_exec (int идентификатор_соединения , string запрос)
В параметре идентификатор_соединения
передается идентификатор соединения, возвращаемый функцией odbc_connect()
. В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE
; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:
<?php $connect = odbc_connect("myAccessDB", "user", "secret") or die("Could not connect to ODBC database"); $query = "SELECT * FROM customers"; $result = odbc_exec($connect, $query) or die("Couldn't execute query!"); odbc_close($connect); ?>
В этом примере функция odbc_exec()
пытается выполнить запрос, текст которого содержится в переменной $query
. При успешном выполнении переменной $result
присваивается идентификатор результата; в случае неудачи ей присваивается значение FALSE
и выводится сообщение, передаваемое при вызове die()
.
Очень удобная функция odbc_result_all()
форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec()
или odbc_execute()
. Синтаксис функции odbc_result_all()
:
int odbc_result_all (int идентификатор_результата [, string формат_таблицы])
В параметре идентификатор_результата
передается идентификатор результата, возвращаемый при успешном вызове odbc_exec()
или odbc_execute()
. В необязательном параметре формат_таблицы
передаются характеристики таблицы HTML. Рассмотрим следующий пример:
<?php $connect = odbc_connect("myAccessDB", "user", "secret") or die("Could not connect to ODBC database"); $query = "SELECT * FROM customers"; $result = odbc_exec($connect, $query) or die("Couldn't execute query!"); odbc_result_all($result, "BGCOLOR='#c0c0c0' border='1' "); odbc_close($connect); ?>
В результате выполнения этого примера содержимое таблицы customers
будет выведено в таблице на светло-сером фоне с рамкой толщиной 1. Внешний вид таблицы для данных, приведенных на рис. 11.1, изображен на рис. 11.2.
Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result()
. Синтаксис функции odbc_free_result()
:
int odbc_free_result (int идентификатор_результата)
В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result()
необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result()
. Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.
<?php $connect = odbc_connect("myAccessDB", "user", "secret") or die("Could not connect to ODBC database"); $query = "SELECT * FROM customers"; $result = odbc_exec($connect, $query) or die("Couldn't execute query!"); odbc_result_all($result, "BGCOLOR='#c0c0c0' border='1' "); odbc_free_result($result); odbc_close($connect); ?>
После того как функция odbc_result_all()
завершила использование идентификатора результата, память возвращается в систему при помощи odbc_free_result()
.
На этом завершается наше знакомство с функциями ODBC в РНР, незаменимыми при создании простых интерфейсов на базе ODBC для доступа через Web. В следующем разделе многие из этих функций будут использованы для демонстрации того, как легко на базе РНР организуется взаимодействие с одной из самых популярных СУБД — Microsoft Access.