Accesso ad un database DB2 via PHP
Procedimento Generico
Il procedimento non è dissimile da quanto faresti su una macchina windows, servono :
- i drivers di connessione ( forniti con il Client Access(tm) di IBM (c) )
- un server ODBC ( unixODBC in questo caso )
- php compilato con il supporto unixodbc
procedimento :
- installiamo unicODBC, sia da sorgenti che da precompilato non ci sono problemi
- installare il Client Access(tm) , scaricandolo dal sito del produttore www.ibm.it ( si deve essere registrati
- ricompilare php ( se nn lo volete ricompilare basta aggiungere il php-unixodbc )
adesso creiamo il connettore , io ho una macchina dedicata quindi il connettore è universale.
editiamo il file odbc.ini ( è in /etc/ oppure , a seconda delle installazioni in /etc/unixODBC )
cmq ecco qui un esempio :
[NOME_CONNESSIONE] Description = iSeries Access ODBC Driver Driver = iSeries Access ODBC Driver System = HOST_AS400 Naming = 0 DefaultLibraries = QGPL Database = ConnectionType = 0 CommitMode = 2 ExtendedDynamic = 1 DefaultPkgLibrary = QGPL DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512 AllowDataCompression = 1 LibraryView = 0 AllowUnsupportedChar = 0 ForceTranslation = 0 Trace = 0
L'user e la password sono inutili , dato che la connessione viene aperta da un successivo script php
Per utilizzare il tutto si usano le funzioni odbc di php
per adesso è stato testato su Slackware , Debian, Ubuntu Breezy 32bit, Ubuntu Dapper 32bit. Sarei interessato a qualcuno che potesse fornmirmi il supporto hardware per testare l'install su architetture 64bit
Particolarità per Ubuntu
Distro : Ubuntu 5.10 Opzioni : pazienza mode Paranoic
(dico quello che segue presumento che ci sia gia odbc )
1) recuperato iSeries in rpm ...
2) alien -k pacchetto.rpm
3) installato il file deb : dpkg -i nuvo_pacchetto.deb
4) andato in /opt/ibm/iSeriesAccess e dato il cat del file unixodbcregistration
cat unixodbcregistration > /etc/odbcinst.ini
5) adesso viene la rogna , bisogna installare delle lib di gcc3.3 ( ? approfondiro' ) le libstdc++5
6) fatto questo reload ed è turtto finito.
ho notato che in sistemi debian based, che le lib di iSeresiesAccess fanno fatica ad essere linkate ( non sono capace io, è troppo disumana quell'accrocchio ) per cui ho semplicemente pensato di lincare le lib presenti in /opt/ibm/iSeriesAccess/lib/ in /usr/lib/
Connessione PHP
connessione al db dell'as400
il NOME_DSN è quello precedentemente dichiarato nel file odbc.ini
// apriamo la connesisone
$ASdbname="NOME_DSN";
$ASdbuser="NOME_UTENTE";
$ASdbpwd="PASS_UTENTE";
$ASdb=odbc_connect($ASdbname,$ASdbuser,$ASdbpwd) or die ("error");
// chiudiamo la risorsa allocata odbc_close($ASdb);
in as400 una query viene fatta in questo modo
select * libreria/tabella
l'inteprete odbc , con "/" darà errore durante il parsing al motore db2. Quindi in php via odbc una query verso una tabella AS400 deve essere fatta sostituendo "/" con ".", in questo modo
$query="select * from libreria.tabella";
nota sull'odbc_exec():
l'odbc_exec() ha la stessa funzione di mysql_query(), ma differentemente va prima dichiarata la connessione ( basandomi sul esempio di apertura connesione , $ASdb) e solo dopo la query.
odbc_exec($ASdb, $query);
poi si va avanti .