Nella prima parte della guida, abbiamo visto come configurare la connessione ODBC dalla nostra Debian Lenny al database dell’AS400. Vediamo ora come utilizzare la connessione con PHP5, grazie alle funzioni ODBC fornite dal linguaggio e a qualche accorgimento pratico.

Installare i pacchetti necessari:
Per fare delle prove di collegamento, non è necessario avere installato un server web: PHP, infatti, è ottimo anche come linguaggio di programmazione stand-alone, per scrivere programmi che possono girare normalmente nel sistema, senza essere richiamati da web.
apt-get install [...] php5 php5-cli php5-odbc
Script #1: provare la connessione
Il primo script servirà solamente a provare se la connessione che abbiamo creato nell’articolo precedente funziona in modo corretto, senza eseguire nessuna query.
/* APRO CONNESSIONE AS400 */
$db_user = "username";
$db_pass = "password";
$dsn = "AS400";
echo("APRO CONNESSIONE... ");
$connessione = odbc_connect($dsn, $db_user, $db_pass);
if (!$connessione) { echo("ERRORE\n"); exit(); }
echo("OK\n");
/* CHIUDO CONNESSIONE AS400 */
echo("CHIUDO CONNESSIONE... ");
@odbc_close($connessione);
echo("OK\n");
Script #2: scrivere una semplice query
Andiamo ora a modificare il primo script, aggiungendo una semplice query e stampandone il risultato, per verificare che anche questo funzioni correttamente:
/* APRO CONNESSIONE AS400 */
$db_user = "username";
$db_pass = "password";
$dsn = "AS400";
echo("APRO CONNESSIONE... ");
$connessione = odbc_connect($dsn, $db_user, $db_pass);
if (!$connessione) { echo("ERRORE\n"); exit(); }
echo("OK\n");
/* ESEGUO QUERY */
$query = "SELECT campo AS nuovo FROM libreria.file ORDER BY campo";
echo("ESEGUO QUERY...\n");
$risultato = odbc_exec($connessione,$query);
if (!$risultato) { echo("ERRORE\n"); }
else
{
echo("OK\n");
while ($riga=odbc_fetch_object($risultato))
{
$nuovo = (string) $riga->NUOVO;
echo("$nuovo\n");
}
@odbc_free_result($risultato);
}
/* CHIUDO CONNESSIONE AS400 */
echo("CHIUDO CONNESSIONE... ");
@odbc_close($connessione);
echo("OK\n");
Qualche accorgimento:
- sull’AS/400 si chiamano “file” gli oggetti che contengono dati; si possono considerare quindi i file come tabelle di database a tutti gli effetti. Gli oggetti sono distribuiti in una struttura a due livelli, in cui quelle che normalmente chiamiamo “directory” sono dette “librerie”. I file dell’AS/400 hanno la particolarità di poter essere multi-membro, portando a tre i livelli massimi utilizzabili: all’interno di un file, ogni membro potrà avere dati diversi ma la medesima struttura. Questa introduzione serve a dire che, nella clausola FROM della query, dovremo indicare libreria e file su cui eseguire la query stessa, separandoli con un punto: attraverso la connessione ODBC, inoltre, abbiamo accesso solamente al primo membro di un file, tutti gli altri (se ce ne sono) saranno per noi invisibili.
- dopo aver eseguito la query, se vogliamo accedere ai record del risultato come oggetti (odbc_fetch_object()) dobbiamo ricordarci di mettere in maiuscolo i nomi dei campi ($riga->NUOVO) anche se nella query erano specificati in minuscolo.
- potrebbero esserci problemi se nei record da estrarre dovessero esserci caratteri “strani”. Personalmente ne ho avuti con il carattere “°” e dopo un po’ di ricerche ho trovato una soluzione: non è il massimo, ma tampona il problema.




Pingback: ZicZac.it, clicca qui e vota questo articolo!
Pingback: diggita.it
Una domanda:
ti è capitato di dover estrarre l’informazione di un campo se è chiave primaria?
Se utilizzi la funzione odbc_primarykeys hai avuto qualche problema?
@Alessandro:
Questo non l’ho provato, appena ho qualche minuto faccio una prova e ti so dire.
Ciao Matteo, ci siamo sentiti via email. Ti giro alcune notizie che mi sono giunte:
IBM inserirà PHP nel sistema AS400, insieme a Java e poi sulle nuove release e nei nuovi AS400 se si opterà per avere anche Microsoft virtualizzato all’interno di AS400. Ma il bello è che linux sarà il sistema di base dove gli altri, compreso l’os di IBM saranno virtualizzati all’interno di linux.
Interessante il tuo articolo, appena posso lo testo.
Ciao
@Matteo
ti chiedo questo perchè essendo sistemista e programmatore come te, ho avuto difficoltà ad utilizzare la funzione odbc_primarykey. Sembra che ci sia un bug non risolto neppure per il php 5.
Ho letto in php.net varie discussioni su come ovviare a questo problema ma purtroppo utilizzano db evoluti come il tuo.
Io mi sto facendo un software in php che migra i dati da un vecchio gestionale che gira sotto AIX, scritto via Cobol a Mysql (intendiamoci i dati sono contenuti in file di dati, non esiste un motore db…). Il brutto è che i driver ODBC, ovvero gli acuCobol, funzionano bene sotto Access 2003, ma se invece provo a fare una chiamata odbc direttamente da php verso i driver acuCobol mi restituisce un errore generico. Quindi, da questo, la drastica decisione di creare un’applicazine php-based che importa , dopo aver importato i i dati in Access 2003 dal Gestionale, re-importo i dati , tramite php, in Mysql.
Insomma una cavolo di triangolazione del cacchio…..
Quindi dicevo, un’applicazione php che importa qualsiasi tabella o risultato di una query, in mysql, data una connessione odbc esistente.
Siccome sto cercando di automatizzare la creazione delle chiavi primarie quando importo le tabelle, sembra proprio che la fuzione odbc_primarykey non si sposa con Access 2003 .
Da qui la mia domanda se hai mai usato la funzione odbc_primarykey via DB2, voglio proprio capire se è un bug di php oppure e Access che fa cilecca
@Alessandro:
Accidenti, mi sono letto la pagina di manuale di odbc_getprimarykeys() e non ci ho capito una mazza…
Dovrò rileggerlo con calma e poi vedo di fare qualche prova
@Luigi:
Ne sono felice, l’AS400 è nativamente un sistema che può far girare più sistemi operativi contemporaneamente. Sapevo della possibilità di installare Linux in una partizione e farlo girare parallelamente a OS/400.
@matteo
>Ne sono felice, l’AS400 è nativamente un sistema che può far girare più sistemi operativi
A siiii? E allora vediamo se riesci a farlo girare su un 270 base.
Io ancora non ci sono riuscito e sono sicuro che non ci riusciro’ mai…
A proposito non e’ che sai come diavolo si clona il seriale di un as400, per caso?
Mi servirebbe giusto per il nostro vecchio 270.
@paride:
Non so cosa sia un 270, ma mi pare di capire che sia hardware. Io stavo dicendo che AS400 (o iSeries o System i) può far girare più sistemi operativi in parallelo, non che ci giri sopra qualunque cosa nè che io sia in grado di farlo…
un 270 e’ semplicemente un modello di as400. Ne esistono diversi modelli e NON su tutti ci gira linux PURTROPPO.
Ci si puo’ far girare addirittura quel cesso di windows, ma utilizzando una scheda aggiuntiva, un po come la famosa janus di amiga che faceva girare anche windows (era praticamente un pc su una scheda).
@paride:
Buono a sapersi, grazie.
Pingback: PHP e AS400 via ODBC: problemi con alcuni caratteri - Matteo Moro
Ho aggiornato il post con un altro “accorgimento pratico”. Ho avuto dei problemi con l’estrazione di caratteri strani dal DB dell’AS400, trovate la mia soluzione a questo indirizzo: http://www.matteomoro.net/2009/09/24/php-e-as400-via-odbc-problemi-con-alcuni-caratteri/
Ciao,
hai più lavorato sulla connessione tra as400 e PHP ?
sarebbe interessante andare avanti con altri esempi pratici
Grazie
Stefano
Ci lavoro quotidianamente, ma non ho trovato novità rilevanti. Per le estrazioni di dati di cui ho bisogno, quello che ho scritto mi è sufficiente.
salve, premetto di essere un programmatore esperto as 400 e conosco il sistema db os/400 con tuti gli annessi e connessi nonchè possiedo personalmente 2 as400 (820-170) per mio diletto .. mi sto avvicinando al PHP da autodidatta dopo aver conosciuto personalmente Zeev Suraski ad un convegno PHP su as400 e da li mi sono lasciato convincere a provare . Purtroppo per molti impegni ci sto provando solo ora e grazie ai sui consigli adesso tramite Xampp su un server (zombie) riesco a sviluppare semplici pagine di ricerca che interrogano i mei db su as400 , pero’ non sono riuscito ancora a capire come , si fa ad inserire/aggiornare/eliminare record in una tabella e monitorarne l’esito (per intenderci l’sqlcode ) . esiste sicuramente una funzione dopo l’odbc_exec ( tipo la odbc_fetch_object ) che mi restituisce un valore in caso di esito positivo o negativo .
grazie in anticipo per la futura risposta .
saluti
ringraziando anticipatamente per questi stupendi articoli, voglio porvi una domanda:
ho seguito alla lettera le due mini guide per la connessione tra linux e as400,
unica differenza è che il mio sistema linux è ubuntu ma non credo ci siano problemi derivanti dalla distro:
al momento che provo a testare la connessione mi restituisce errore 01000 ‘generic error’
cosa potrei sbagliare?? o cosa manca??
grazie.
p.s. tutti i punti sono stati seguiti alla lettera.
grazie.