Поддержка ODBC в РНР
Функции ODBC в РНР, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:
Обратите внимание: при работе с перечисленными СУБД стандартный механизм ODBC на самом деле не используется. Просто поддерживаемые в РНР общие функции ODBC применяются для взаимодействия с базами данных. Это удобно, поскольку при переходе на другую ODBC-совместимую СУБД (или СУБД из приведенного выше списка) все ваши сценарии будут нормально работать.
Поддержка ODBC встроена в комплект поставки РНР, поэтому вам за редкими исключе-ниями практически не придется заниматься специальной настройкой.В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в РНР приведен в документации (http://www.php.net/manual).
odbc_connect( )
Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect( ). Синтаксис функции odbc_connect( ):
int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])
Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе'н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:
Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет ODBC не справится с обработкой того или иного запроса.
Использовать odbc_connect( ) в программе несложно. Пример:
<?
obdc_connect("myAccessDB", "user", "secret")
or die( " Could not connect to ODBC database");
?>
Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect( ) проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.
odbc_close( )
После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close( ):
void odbc_close ([int идентификатор_соединения])
В параметре идентификатор_соединения передается идентификатор открытого соединения. Рассмотрим небольшой пример:
<?
obdc_connect("myAccessDB", "user", "secret")
or die("Could not connect to ODBC database");
print "Currently connected to ODBC database!"; odbc_close($connect);
?>
odbc_prepare( )
Перед непосредственной обработкой запрос необходимо «подготовить». Задача решается функцией odbc_prepare( ):
int odbc_prepare (int идентификатор_соединения , string запрос)
В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute( ) (см. ниже).
odbc_execute( )
Запрос, подготовленный функцией odbc_prepare( ), выполняется функцией odbc_execute( ). Синтаксис функции odbc_execute( ):
int odbc_execute (int идентификатор результата [, array параметры])
В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.
Рассмотрим следующий пример:
<?
$connect = @obdc_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_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). Синтаксис функции odbc_exec( ):
int odbc_exec (int идентификатор_соединения , string запрос)
В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:
<?
obdc_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_result_all( ) форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec( ) или odbc_execute( ). Синтаксис функции odbc_result_all( ):
int odbc_result_all (int идентификатор_результата [, string формат_таблицы])
В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec( ) или odbc_execute( ). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML. Рассмотрим следующий пример:
<?
obdc_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.
Рис. 11.2.
Данные ODBC в браузере
odbc_free_result ( )
Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result( ). Синтаксис функции odbc_free_result( ):
int odbc_free_result (int идентификатор_результата)
В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result( ) необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result( ). Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.
<?
obdc_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.