Функции ODBC и DB2 (PDO_ODBC)

Введение

PDO_ODBC - драйвер, реализующий интерфейс PHP Data Objects (PDO) для доступа к базам данных через драйвер ODBC или через библиотеку IBM DB2 Call Level Interface (DB2 CLI). В текущий момент PDO_ODBC поддерживает различные "оттенки" драйверов баз данных:

ibm-db2

Поддержка доступа к серверам IBM DB2 Universal Database, Cloudscape и Apache Derby через свободный клиент DB2 express-C.

unixODBC

Поддерживает доступ к базам данных через менеджер драйверов unixODBC и собственные ODBC драйверы баз данных.

generic

Предоставляет опцию компиляции менеджеров драйверов ODBC, которые не поддерживаются PDO_ODBC напрямую.

В Windows php_pdo_odbc.dll должен быть включён как модуль в php.ini. Он собирается с участием Windows ODBC Driver Manager, поэтому PHP может подключаться к любой базе данных, определённой как System DSN.

Установка

PDO_ODBC на UNIX системах
  1. Модуль PDO_ODBC включён в исходный код PHP. Вы можете скомпилировать модуль как статический или разделяемый, используя следующий синтаксис configure.

    ibm_db2

    ./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
    
    Для сборки PDO_ODBC для ibm-db2 вам потребуется предварительно установить заголовочные файлы пакета разработчика приложений DB2. Заголовочные файлы пакета разработчика приложений DB2 можно установить как с помощью установочного пакета сервера DB2, так и в составе отдельного клиента "DB2 Application Development Client", доступного для загрузки с » сайта поддержки IBM developerWorks.

    Если вы не укажете директорию установки библиотек и заголовочных файлов DB2, configure будет искать их в /home/db2inst1/sqllib.

    unixODBC

    ./configure --with-pdo-odbc=unixODBC,/usr/local
    
    Если вы не укажете директорию установки библиотек и заголовочных файлов unixODBC, configure будет искать их в /usr/local.

    generic
    ./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags
    

Предопределённые константы

Перечисленные ниже константы определены этим драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого модуля, или модуль был динамически загружен во время выполнения. Вдобавок, эти зависимые от драйвера константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO_ODBC_TYPE (string)

PDO::ODBC_ATTR_USE_CURSOR_LIBRARY (int)

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

  • PDO::ODBC_SQL_USE_IF_NEEDED (по умолчанию): использовать библиотеку курсоров ODBC, если нужно.

  • PDO::ODBC_SQL_USE_DRIVER: никогда не использовать библиотеку курсоров ODBC.

  • PDO::ODBC_SQL_USE_ODBC: всегда использовать библиотеку курсоров ODBC.

PDO::ODBC_ATTR_ASSUME_UTF8 (bool)

Константу указывают только в операционной системе Windows. При чтении или записи данные в кодировке UTF-16 — CHAR, VARCHAR и LONGVARCHAR — будут переконвертированны в кодировку UTF-8, если для константы установили значение true. Кодировку символов преобразует драйвер, если для константы задали значение по умолчанию — false.

Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Конфигурационные опции PDO_ODBC
Имя По умолчанию Место изменения Список изменений
pdo_odbc.connection_pooling "strict" INI_ALL  
pdo_odbc.db2_instance_name NULL INI_SYSTEM Эта возможность устарела и будет удалена в будущем.
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

pdo_odbc.connection_pooling string

Нужно ли объединять соединения ODBC. Может быть "strict", "relaxed" или "off" (аналогично ""). Параметр определяет как строго менеджер соединений должен сравнивать параметры соединений для выбора, создавать новое соединение или возвращать уже существующее. По умолчанию рекомендуется использовать strict, что означает, что сохранённое соединение будет возвращаться только, если все параметры точно совпадают. relaxed приведёт к тому, что закешированное соединение будет возвращено, если параметры схожи. Это приведёт к более активному использованию кеша, но может привести к утечке информации о соединении (к примеру) между виртуальными хостами.

Эту настройку можно изменить только в php.ini и воздействует на все процессы; все модули, загруженные в процесс и использующие те же библиотеки ODBC будут зависеть от этой настройки, включая Унифицированный модуль ODBC.

Внимание

Значение relaxed не должно использоваться на общем хостинге в целях безопасности.

Подсказка

Если у вас нет очень серьёзного повода использовать значение, отличное от strict - не меняйте его.

pdo_odbc.db2_instance_name string

Если вы скомпилировали PDO_ODBC с использованием db2, эта опция установит значение переменной окружения DB2INSTANCE в системах Linux и UNIX, равным выбранному имени экземпляра DB2. Это позволяет PDO_ODBC определить местоположение библиотек DB2 и произвести соединение с каталогом базы данных DB2.

Эту настройку можно изменить только в php.ini, и она воздействует на все процессы; все модули, загруженные в процесс и использующие те же библиотеки ODBC будут зависеть от этой настройки, включая унифицированный модуль ODBC.

Эта опция не работает в Windows.

Содержание

  • PDO_ODBC DSN — Соединение с базами данных ODBC или DB2
add a note add a note

User Contributed Notes 5 notes

up
11
ChristianF
8 years ago
I just spent a couple of hours trying to track down the Exception "Could not find driver". This was despite having ODBC and PDO_ODBC installed, and all of the configuration seemed to be correct.

Turned out the problem was that I used ODBC in upper-case in the dsn. As soon as I changed the dns to "odbc:database" it worked.

As this code used to work a few months ago, this sudden case-sensitivity threw me for a loop. So in case you get this error, check the casing first.
up
3
ethan dot nelson at ltd dot org
16 years ago
Using SQL 2005, PDO_ODBC and datetime fields is a royal pain.  MSDN documentation on CAST CONVERT shows that there is supposed to be an implicit convert between character types and datetime types.  That's true... until you put it in a stored procedure and use variable declarations.

For instance this fails:

declare @date varchar;
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

While this succeeds:
declare @date varchar(19);
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

The PDO Driver appears to attempt an implicit conversion and so it fails whenever you try to insert data into datetime column types.

So to workaround this nuance in SQL, declare a character column type with explicit width.  Then your implicit type conversion will work.
up
4
Ariz Jacinto
12 years ago
Using SQL Server Native Client 11.0 on Linux as a PDO_ODBC driver:

Download the SQL Server Native Client 11.0 on Linux ODBC Driver:
http://www.microsoft.com/download/en/details.aspx?id=28160

Configuration ODBC:

/usr/local/etc/odbcsys.ini
--
[SQL Server Native Client 11.0]
Description = Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0
UsageCount = 1

/usr/local/etc/odbc.ini
--
[MSSQLServer]
Driver = SQL Server Native Client 11.0
Description = Sample Database
Trace = Yes
Server =
Port = 1433
Database =

Test the connection:
mssqltest.php
--
<?php
    putenv
('ODBCSYSINI=/usr/local/etc');
   
putenv('ODBCINI=/usr/local/etc/odbc.ini');
   
$username = "";
   
$password = "";
    try {
     
$dbh = new PDO("odbc:MSSQLServer",
                   
"$username",
                   
"$password"
                  
);
    } catch (
PDOException $exception) {
      echo
$exception->getMessage();
      exit;
    }
    echo
var_dump($dbh);
    unset(
$dbh);
?>
up
1
tuomas
15 years ago
If you want to avoid installing DB2 Connect and/or PECL modules ibm_db2 and PDO_IBM, you can also use IBM DB2 databases trough unixODBC.

If you have DB2 database on a i server you need to install IBM iAccess (http://www.ibm.com/systems/i/software/access/linux/index.html) and unixODBC. Just install the libraries (rpm) and modify configurations in /etc/odbcinst.ini (sample configuration in /opt/ibm/iSeriesAccess/unixodbcregistration) and /etc/odbc.ini.

To my experience this is much easier way than installing DB2 Connect.
up
0
harry dot forum at p-boss dot com
14 years ago
MSSQL - PHP on Apache - Linux Redhat

When using php 5.2.10 please beaware of this error:

http://bugs.php.net/bug.php?id=42068

Standard odbc_connect will not work, you must use pdo_odbc

Connecting to MSSQL using pdo odbc - walkthrough..

1. Download and configure FreeTDS with-unixodbc

./configure --prefix=/opt/SYSfreetds --with-unixodbc

make;make test; make install

2. install php-odbc and unixODBC

         php-odbc-5.2.10-1.x86_64.rpm
         unixODBC.x86_64.x86x64

3. Setup ODBC links

a)
Create a tds.driver file with the following contents

  [FreeTDS]
  Description     = v0.63 with protocol v8.0
  Driver          = /opt/SYSfreetds/lib/libtdsodbc.so

Register the ODBC driver - the tds.driver file

  odbcinst -i -d -f tds.driver

b)
Creating a tds.datasource file - ODBC Data Source with contents:

  [SOURCENAME]
  Driver=FreeTDS
  Description=Test MS SQL Database with FreeTDS
  Trace=No
  Server=BobTheServer
  Port=1433
  TDS Version=8.0
  Database=youDBname

Register the ODBC data source

  odbcinst -i -s -f tds.datasource

Beware that the odbc.ini file will be installed in the current users home directory. This may need to be used if you are using a webserver as the apache home directory could be different.

Ensure .odbc.ini is in apaches home directory, possibly "/var/www"

4. Test the ODBC link on the command line

  isql -v SOURCENAME 'username' 'password'

  +---------------------------------------+
  | Connected!                            |
  |                                       |
  | sql-statement                         |
  | help [tablename]                      |
  | quit                                  |
  |                                       |
  +---------------------------------------+
SQL>

5. Edit /etc/php.ini

  Make sure the following is set:
     mssql.secure_connection = On


6. Restart apache gracefully

7. PHP to run:

  <?
  $dbh
= new PDO('odbc:SOURCENAME', 'username', 'password');
 
$stmt = $dbh->prepare("$query");
 
$stmt->execute();
  while (
$row = $stmt->fetch()) {
     
print_r($row);
  }
  unset(
$dbh); unset($stmt);
 
?>

Trouble-shooting:

Please try strace/ truss if you encounter issues. It could be you are referencing wrong libraries somewhere.

Ensure you have restarted apache once the odbc files are in place
To Top