Utilizzo da più di un anno la connessione ODBC verso l’AS400 aziendale da un PC con Linux per estrarre dati e realizzare statistiche con PHP. Ho descritto in altri post la configurazione del driver ODBC e il suo uso con PHP5.

Qualche giorno fa, però, mi è capitato un problema strano: dopo l’esecuzione di una normale query, alcuni record contengono un sacco di caratteri incomprensibili oltre alla stringa che mi aspetterei come risultato. Rapidamente, identifico il problema nella presenza del carattere “°” nella stringa originale: ecco come ho risolto, per ora, la questione.
Sfrutto la mia rete sociale e chiedo un po’ in giro se qualcuno ne sa qualcosa e mi stupisco del numero di risposte ricevute su Friendfeed: una trentina di interventi, su un argomento tecnico abbastanza chiuso e di nicchia come l’interazione Linux/AS400, non sono niente male. Alla fine trovo il vero problema: il bug è in PHP, e consiste in un’impostazione errata del buffer per i dati di ritorno dal driver ODBC nel caso in cui siano presenti alcuni caratteri “particolari”.
Non sono riuscito a far funzionare il workaround indicato (non ho fatto molti tentativi, lo ammetto), ma ne ho realizzato un’altro, un po’ più macchinoso: combinando le funzioni odbc_field_len() e substr(), estraggo il numero di caratteri che mi aspetterei dal risultato, a cui poi applico i miei filtri. Per ora sembra funzionare, in questi giorni vedrò se ci saranno altri problemi.
RISORSE UTILI:




good job 8)
This comment was originally posted on FriendFeed
in giornata faccio qualche altro test, anche se la soluzione è un po’ un accrocchio
This comment was originally posted on FriendFeed
meglio non accrocchio, ma anche un accrocchio che va è accettabile
This comment was originally posted on FriendFeed
Pingback: PHP5 e AS400: utilizzare DB2 via ODBC con PHP (2/2) - Matteo Moro
Pingback: upnews.it
Ciao,
mi trovo con il tuo stesso problema, mi potresti spiegare meglio come lo hai risolto???
Grazie
Mi devo correggere, il mio problema è un po’ differente, devo fare una sql del tipo:
SELECT * FROM DPPATSOT.§PACA00F WHERE §LACAPLOC = ‘%s’….
e mi restituisce questo errore: Warning: odbc_exec(): SQL error: [unixODBC][IBM][System i Access ODBC Driver]Invalid string or buffer length., SQL state S1090 in SQLExecDirec…
ti è mai capitato?
Vi scrivo la mia soluzione al problema:
all’interno della query, ho sostituito i caratteri speciali che creano errore con la funzione php che richiama il suo codice ASCII: chr().
Ad esempio per il carattere £ -> chr(163) e per il carattere § -> chr(167)
Quindi la query che prima era:
SELECT “A£EA”
FROM “S2″.”TP§DT”.”A5F” AS “A5F”
diventa:
SELECT “A’.chr(163).’EA”
FROM “S2″.”TP’.chr(167).’DT”.”A5F” AS “A5F”