PHP e AS400 via ODBC: problemi con alcuni caratteri

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.

ODBC e AS400

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:

This entry was posted in tuxfeed and tagged , , , , , , , , , , . Bookmark the permalink.

8 Responses to PHP e AS400 via ODBC: problemi con alcuni caratteri

  1. Bl@ster says:

    good job 8)

    This comment was originally posted on FriendFeed

  2. Matteo says:

    in giornata faccio qualche altro test, anche se la soluzione è un po’ un accrocchio :-P

    This comment was originally posted on FriendFeed

  3. Bl@ster says:

    meglio non accrocchio, ma anche un accrocchio che va è accettabile :D

    This comment was originally posted on FriendFeed

  4. Pingback: PHP5 e AS400: utilizzare DB2 via ODBC con PHP (2/2) - Matteo Moro

  5. Pingback: upnews.it

  6. Tullio says:

    Ciao,
    mi trovo con il tuo stesso problema, mi potresti spiegare meglio come lo hai risolto???
    Grazie

    • Tullio says:

      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?

  7. Giuseppe V says:

    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”

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ricevi un avviso se ci sono nuovi commenti. Oppure iscriviti senza commentare.