PHP 4 на практике

       

Поддержка ODBC в РНР


Функции ODBC в РНР, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:

  • Adabas D;
  • IODBC;
  • IBM DB2;
  • Solid;
  • Sybase SQL Anywhere.
  • Обратите внимание: при работе с перечисленными СУБД стандартный механизм 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. Он может принимать одно из четырех возможных значений:

    • SQL_CUR_USE_IF_NEEDED;
    • SQL_CURSOR_USE_ODBC;
    • SQL_CUR_USE_DRIVER;
    • SQL CUR DEFAULT.
    • Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет 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.


      Содержание раздела