Sviluppo software

DB2: problema di connessione con PHP PDO ODBC

Scenario di partenza#

  • Attraverso la CLP di IBM DB2 o di un tool come Toad For DB2, dopo aver catalogato correttamente il database, riesco a connettermi correttamente.
CATALOG TCPIP NODE TEST REMOTE 192.168.0.1 SERVER 50000 REMOTE_INSTANCE DB2 OSTYPE LINUX

CATALOG DATABASE TEST_DB AS TEST_DB AT NODE TEST

CONNECT TO TEST USER db2admin USING db2admin
  • Attraverso PHP PDO ODBC tento di connettermi al database:
$conn = new PDO('odbc:Driver=IBM DB2 ODBC DRIVER - DB2COPY1;Hostname=192.168.0.1;Port=50000;Database=TEST_DB;Protocol=TCPIP;Uid=db2admin;Pwd=db2admin;','db2admin','db2admin');
  • La connessione fallisce e nell'error log del PHP viene riportato il seguente messaggio di errore:
SQLSTATE[HY000] SQLDriverConnect: -1042 [IBM][CLI Driver] SQL1042C  Errore di sistema non previsto.  SQLSTATE=58004

Analisi del problema#

Leggendo la documentazione del DB2 non si riesce a capire con precisione la causa del problema visto che si tratta di un errore generico.

Approfondisco il problema esaminando il file db2diag.log che, per un'installazione su Windows 10 di DB2 Express-C ver 10.5 a 64 bit si trova nel percorso seguente:

C:\ProgramData\IBM\DB2\DB2COPY1\DB2

In concomitanza con il tentativo di connessione al database, nel db2diag.log, viene riportato il seguente messaggio d'errore:

2016-01-22-18.12.07.981000+060 I540185H511          LEVEL: Error
PID     : 7536                 TID : 1688           PROC : php-cgi.exe
INSTANCE: DB2                  NODE : 000
HOSTNAME: XXXXXXXXXX
EDUID   : 1688
FUNCTION: DB2 Common, Cryptography, cryptDynamicLoadGSKitCrypto, probe:998
MESSAGE : ECF=0x90000076=-1879048074=ECF_LIB_CANNOT_LOAD
          Cannot load the specified library
DATA #1 : unsigned integer, 4 bytes
70
DATA #2 : String, 42 bytes
C:\PROGRA~1\IBM\SQLLIB\bin\icc\gsk8sys.dll

Da cui si capisce che il problema è che il processo php-cgi.exe (l'interprete PHP utilizzato da Apache) non riesce a caricare la libreria contenuta nel file gsk8sys.dll.

Infatti se vado a vedere nel percorso indicato tale dll non è presente, ma si trova invece nella directory C:\Program Files (x86)\ibm\gsk8\lib.

Soluzione#

Cercando su internet questo problema qualcuno suggeriva di mettere nella variabile d'ambiente PATH il percorso della dll, ma nel mio caso era già presente.

Per risolvere il problema ho dovuto pertanto:

  1. Creare la directory icc sotto C:\Program Files\IBM\SQLLIB\BIN.
  2. Copiare il contenuto della directory C:\Program Files (x86)\ibm\gsk8\lib nella directory C:\Program Files\IBM\SQLLIB\BIN\icc.

Spero che questo articolo risparmi qualche ora a chi dovesse incontrare questo tipo di problema.

Autore: Lorenzo Chiodi
Senior software developer con più di 16 anni di esperienza nello sviluppo di soluzioni web based, enterprise, su misura. Dal 2011 socio fondatore di Garda Informatica Snc condivide questa avventura col fratello Giovanni.

Che soluzione cerchi?#

Read more!

Newsletter

Ti è piaciuto questo articolo? Iscriviti alla newsletter

Di tanto in tanto pubblichiamo nuovi articoli come questo. Se vuoi essere avvisato lascia il tuo indirizzo e-mail di seguito.

Non invieremo mai SPAM e non condivideremo la tua e-mail con altri. Per maggiori informazioni consulta la privacy policy.

Attendere prego...

closeIcona closesearchIcona searchmore vertIcona more vertmenuIcona menushareIcona sharearrow upwardIcona arrow upward