Visualizzazione post con etichetta PDO. Mostra tutti i post
Visualizzazione post con etichetta PDO. Mostra tutti i post

giovedì 2 novembre 2017

Server Apache+PHP su ubuntu che accede ad iSeries


Dopo anni (post analogo su questo blog è del 2008) ho rifatto un server ubuntu con Apache e php che accede ad un database DB2 su iSeries.

1 - ho fatto una installazione standard di un ubuntu 17.10 con apache e php7.1

2 - ho installato alcuni pacchetti utili unixodbc, php7.1-odbc, odbcinst e dipendenze

3 - installato ibm-iaccess-1.1.0.7-1.0.amd64.deb scaricato da IBM (non facile trovarlo!)

4 - ho creato i link simbilici alle librerie introdotte da IBM con
sudo ln -s /opt/ibm/iSeriesAccess/lib64/libcwb* /usr/lib

5 - ho lanciato
odbcinst -j


6 - ho modificato il file /etc/odbcinst.ini:
[ODBC Drivers]
IBM i Access ODBC Driver
Description = IBM i Access for Linux ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib/libcwbodbcs.so
Driver64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64 = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

[IBM i Access ODBC Driver]
Description = IBM i Access for Linux 64-bit ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading = 0
DontDLClose = 1
UsageCount = 2

7 - ho modificato il file /etc/odbc.ini:
[ODBC Data Sources]
DEV = DEV

[DEV]
Description = iSeries Access ODBC Driver
Driver = IBM i Access ODBC Driver
System = 10.1.0.4
UserID = qui il nome utente
Password = qui la password
Naming = 1
DefaultLibraries = QGPL
Database =
ConnectionType = 2
CommitMode = 2
ExtendedDynamic = 1
DefaultPkgLibrary =
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 1
ForceTranslation = 1
Trace = 0
il significato delle opzioni principali è:

[DEV] è il nome che si vuole assegnare alla Data Source

Description è una descrizione generica

System identifica il nome o l’indirizzo del sistema AS400. Esempio mioAS.miodomino.local o 192.168.xxx.xxx

UsedID e Password sono le credenziali per l’accesso al sistema. Vengono utilizzati solo se l’applicazione che utilizza la Data Source non ne specifica altri, altrimenti valgono quelli specificati nell’applicazione

Naming serve ad indicare la convenzione dei nomi per riferirsi a librerie e files.

  Naming=0 utilizza la convenzione classica ANSI SQL. Esempio select * from libreria.file.
  Naming=1 utilizza la convezione del sistema AS400: select * from librerie/file

DefaultLibreries permette di indicare la lista delle librerie di default. Come detto in precedenza, l’intera lista viene considerata solo se la convezione dei nomi utilizzata è 1 (Naming=1) altrimenti viene considerata solo la prima libreria. ATTENZIONE: ogni libreria dev’essere separata dalla virgola e l’intera lista deve iniziare con la virgola altrimenti considera solo la prima libreria ignorando le altre. Esempio: se indico lib1,lib2,lib3 in realtà viene vista solo lib1, viceversa se inizio la lista con la virgola, quindi ,lib1,lib2,lib3 viene considerata l’intera lista.

Un modo alternativo di far vedere una lista librerie è quello di NON indicare niente in questo parametro in modo tale che venga vista la lista librerie indicata nella job description (JOBD) abbinata all’utente che fa la connessione.

ConnectionType permette di specificare le azioni eseguibili sui dati (default=0):

  0 = lettura e scrittura. Sono permesse tutte le istruzioni SQL
  1 = lettura ed esecuzione. Sono permesse le istruzioni SELECT e CALL
  2 = solo lettura

CommitMode permette di specificare come gestire la transazioni (deafult=2):

  0 = Commit immediate (*NONE)
  1 = Read committed (*CS)
  2 = Read uncommitted (*CHG)
  3 = Reapetable read (*ALL)
  4 = Serializable (*RR)


8 - Verifico che linuxodbc stia funzionando con
isql -v DEV
e funziona

9 - Metto di seguito un estratto del php che fa una query:
$db = new PDO('odbc:DEV');
$sql = "SELECT * FROM LIB.TB FETCH FIRST 100000 ROWS ONLY";

foreach ($db->query($sql) as $row)
{
  print_r($row);
}

Leggi post intero...

martedì 16 settembre 2008

LAMP su ubuntu che usa DB2 su AS400

Scenario: AS/400 con OS/400 V5.4 con DB2 + Ubuntu linux 8.04 con Apache e php

Cosa fare per usare da PHP il database DB2 utilizzando il PDO via ODBC? Per prima cosa bisogna installare l'iseries access su ubuntu come descritto in un post precedente. Quindi:

1 - da terminale installo unix-odbc:

apt-get install unix-odbc

2 - configuro unix-odbc, apro/creo il file /etc/odbc.ini come di seguito, sostituendo la riga in grassetto con l'ip del server AS/400:


[AS400]
Description = iSeries Access ODBC Driver
Driver = iSeries Access ODBC Driver
System = 192.168.0.7
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

NB: il contenuto del file sopra è scopiazzato dal blog di Matteo Moro. Thanks.

Ora da php sul linux si dovrebbe poter accedere al database DB2 su AS/400 via PDO. Vediamo un po' di codice PHP:

infophp();

Con questo si vede la schermata delle info relative al php. Dovrei fra l'altro trovare la voce PDO con indicati vari driver, fra questi deve esserci ODBC (se no va installato il pacchetto php_odbc).
Un'altra voce che devo trovare è PDO_ODBC (che dovrebbe comparire dato che ho messo UnixODBC).

foreach(PDO::getAvailableDrivers() as $driver)
{
echo $driver . " ";
}

Così dovrebbe apparire la lista dei driver che dava anche infophp().
Di seguito proviamo a fare una query, quanto scritto in grassetto va adattato con il nome dell'utente e la password, il nome del database, della tabella su cui fare la query di prova ed il nome di un paio di colonne:

try
{
$db=new TDbConnection("odbc:DSN=AS400;UID=user;PWD=password;","user","password");
echo "Connessione riuscita";
}
catch(PDOExeption $e)
{
echo $e->getMessage();
}

$sql = "SELECT * FROM NOMEDB.NOMETBL";

foreach ($db->query($sql) as $row)
{
print $row['COL1'] .' - '. $row['COL2'] . '
';
}

Fine. Ciao.


Leggi post intero...