Ingrédients : PHP, DB2 et unixODBC

Un de mes projets à mon nouveau boulot à Rome est le développement d’une application en PHP qui travaille avec une base de données DB2 sur AS/400. Je travaille avec des bases de données – principalement MySQL – en PHP depuis pas mal d’années maintenant, mais c’est ma première expérience avec DB2, le challenge était intéressant.

J’ai fait pas mal de recherches avant de commencer, et il semble qu’il y ait principalement 2 façons pour utiliser DB2 en PHP : 1. installer un client IBM DB2 sur la machine où PHP est installé et compiler l’extension ibm_db2 extension. 2. utiliser DB2 avec ODBC et le pilote unixODBC. Cet article utilise cette seconde solution et explique comment installer unixODBC pour travailler avec la base de données de l’AS/400 DB2 avec une machine Linux (CentOS).

Installation

Le processus n’est pas vraiment direct, mais voici la solution qui fonctionne pour moi sur deux serveurs CentOS. Nous allons installer unixODBC depuis les dépôts yum et l’iSeriesAccess for linux depuis le site d’IBM. Mais comme ça directement, l’installation du RPM va retourner des erreurs de dépendances manquantes, en partie parce que Openmotif est manquant, nous devons donc l’installer :

# yum install unixODBC openmotif

iSeriesAccess a besoin de libXm.so.3 et Openmotif fournit libXm.so.4, il suffit de créer un lien symbolique comme ceci :

# ln -s /usr/lib/libXm.so.4 /usr/lib/libXm.so.3

Maintenant, iSeriesAccess peut être téléchargé et installé, mais en désactivant tout de même la vérification des dépendances :

# wget http://www-03.ibm.com/systems/i/software/access/linux/index.html
# rpm --nodeps -ivh iSeriesAccess-6.1.0-1.2.i386.rpm

Configuration

unixODBC consiste en 2 fichiers de configuration sous /etc/, odbcinst.ini qui n’a pas besoin d’être édité et odbc.ini qui va contenir les instances DB2. La documentation est très minimaliste sur le sujet, mais j’ai finalement trouvé ce site. L’exemple suivant est le contenu de mon odbc.ini qui fonctionne actuellement en utilisant MY_DB_NAME comme nom de library :

[MY_DB_NAME]
Description = iSeries Access ODBC Driver DSN for iSeries
Driver = iSeries Access ODBC Driver
System = 192.168.1.1
UserID = my_user_id
Password = my_password
Naming = 0
DefaultLibraries = MY_DB_NAME
Database = MY_DB_NAME
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0

Les options sont restées inchangées à leur valeurs par défaut, si ce n’est les évidents System, UserID, Password, DefaultLibraries et Database.

ODBC et PHP

Avant de pouvoir dialoguer avec DB2 en PHP, le module php-odbc doit être ajouté :

# yum install php-odbc

Voilà, c’est tout, cela doit fonctionner. Voici un rapide code d’exemple pour tester (remplacez par une vraie requête SQL ^.^) :

# DB2 instantiation
if (!$db = odbc_connect ( "MY_DB_NAME", "my_user_id", "my_password") )
	echo 'error!';

# Querying
$result = odbc_exec($db, "SELECT * FROM the_table ");
while (odbc_fetch_row($result)) {
	echo odbc_result($result, "the_field"))."\n";
}

// closing db properly
odbc_close($db);

Note : cet article existait déjà en langue anglaise sur ce site, il s’agit juste de sa traduction dans la langue de Molière ^.^

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *