CakeFest 2024: The Official CakePHP Conference

Funciones de ODBC y DB2 (PDO_ODBC)

Introducción

PDO_ODBC es un controlador que implementa la interfaz de Objetos de datos de PHP (PDO) para habilitar el acceso desde PHP a bases de datos a través de contorladores ODBC o de la biblioteca IBM DB2 Call Level Interface (DB2 CLI). PDO_ODBC admite actualmente tres "sabores" diferentes de controladores de bases de datos:

ibm-db2

Da soporte para el acceso a servidores de IBM DB2 Universal Database, Cloudscape, y Apache a través del cliente gratuito DB2.

unixODBC

Da soporte para el acceso a servidores de bases de datos a través del administrador de gestores de unixODBC y de los controladores de ODBC proppietarios de bases de datos.

generic

Ofrece una opción de compilación para los administradores de gestores de ODBC que no están admitidos explícitamente pore PDO_ODBC.

En Windows, PDO_ODBC está construido dentor del núcleo de PHP de manera predeterminada. Está vinculado con Windows ODBC Driver Manager, por lo que PHP puede conectarse a cualquier base de datos catalogada en un DSN de sistema, y es el controlador recomendado para conectarse a bases de datos de Microsoft SQL Server.

Instalación

PDO_ODBC en sistemas UNIX
  1. A partir de PHP 5.1, PDO_ODBC está incluido en los ficheros fuente de PHP. Se puede compilar la extensión PDO_ODBC como un módulo estático o compartido usando los siguientes comandos configure.

    ibm_db2

    ./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
    
    Para contruir PDO_ODBC con el sabor ibm-db2, se han de tener instaladas previamente las cabeceras de desarrollo de aplicaciones de DB2 en la misma máquina en la que se compile PDO_ODBC. Las cabeceras de desarrollo de aplicaciones de DB2 son una opción instalable en los servidores de DB2, y también están disponibles como parte de DB2 Application Development Client, disponible para descargar gratuitamente desde el » sitio de soporte de IBM DB2 Universal Database.

    Si no se proporciona una ubicación para las bibliotecas y cabeceras de DB2 al comando configure, PDO_ODBC usará como valor predeterminado /home/db2inst1/sqllib.

    unixODBC

    ./configure --with-pdo-odbc=unixODBC,/usr/local
    
    Si no se proporciona una ubicación para las bibliotecas y cabeceras de unixODBC al comando configure, PDO_ODBC usará como valor predetermiando /usr/local.

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

Configuración en tiempo de ejecución

El comportamiento de estas funciones se ve afectado por la configuración de php.ini.

Opciones de configuración de PDO_ODBC
Nombre Por defecto Cambiable Historial de cambios
pdo_odbc.connection_pooling "strict" INI_ALL  
pdo_odbc.db2_instance_name NULL INI_SYSTEM Esta característica obsoleta será eliminada con certeza en el futuro.
Para más detalles y definiciones de los modos de INI_*, vea Dónde se puede realizar un ajuste de configuración.

He aquí una breve explicación de las directivas de configuración.

pdo_odbc.connection_pooling string

Si agrupar conexiones de ODBC. Se puede usar "strict", "relaxed" o "off" (que es igual a ""). El parámetro describe cómo de estricta debería ser el administrador de conexiones cuando coincidan los parámetros de conexión con conexiones existentes en la agrupación. strict es el valor predetermiando recomendado, y dará como resultado en el uso de conexiones almacenadas en caché solamente cuando todos los parámetros de conexión coincidan exactamente. relaxed dará como resultado el uso de conexiones almacenadas en caché cuando se utilicen parámetros de conexión similares. Esto puede resultar en el aumento del uso de la caché, con el riesgo de perder información de conexión entre (por ejemplo) hosts virtuales.

Este ajuste solamente se puede cambiar desde el fichero php.ini, y afecta al proceso completo; cualquier otro módulo dentro del proceso que utilice las mismas bibliotecas de ODBC también se verá afectado, incluyendo la Extensión ODBC Unificada.

Advertencia

relaxed no debería usarse en servidores compartidos, por razones de seguridad.

Sugerencia

Deje este ajuste a la configuración strict predeterminada a menos que tenga una buena razón para cambiarlo.

pdo_odbc.db2_instance_name string

Si se compila PDO_ODBC usando el sabor db2, este ajuste establece el valor de la variable de entorno DB2INSTANCE en sistemas operativos Linux y UNIX al nombre especificado de la instancia de DB2. También habilita PDO_ODBC para resolver la ubicación de las bibliotecas de DB2 y realizar conexiones catalogadas a bases de datos DB2.

Este ajuste solamente se puede cambiar desde el fichero php.ini, y afecta al proceso completo; cualquier otro módulo dentro del proceso que utilice las mismas bibliotescas de ODBC también se verá afectado, incluyendo la Extensión ODBC Unificada.

Este ajuste no tiene efecto en Windows.

Tabla de contenidos

add a note

User Contributed Notes 5 notes

up
10
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
5
tuomas
14 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
5
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
1
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
harry dot forum at p-boss dot com
13 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